2025年Java基础知识扫盲点

Java基础知识扫盲点Java 三大版本 java se java me java ee 也叫 j2se j2me j2ee Java se 标准版 基础和核心 开发桌面应用程序 Java me 微缩版 主要用于手机程序的开发 Java ee 企业版 运行在服务器端 提供给用户访问 Java 优势

大家好,我是讯享网,很高兴认识大家。

Java三大版本:java se, java me, java ee, 也叫j2se,j2me,j2ee
Java se: 标准版,基础和核心,开发桌面应用程序。
Java me: 微缩版,主要用于手机程序的开发
Java ee: 企业版,运行在服务器端,提供给用户访问
Java优势:跨平台运行,安全性(比C的指针安全性好),自动内存管理机制(垃圾回收器),完全面向对象的,代码简单,
Java运行过程: java源文件(.java)经过编译器编译成了字节码文件(.class),然后在JVM中的“解释器”会把字节码文件解除成本地机器码给本地平台运行。
bin , lib, jre, src.zip(源码,类库文件),
jdk中有jre(运行环境),jre中有jvm(虚拟机)
开发三步走:编写(.java),编译(.class),运行(

IDE(集成开发环境): 将开发环境和程序调试集合在一起
记事本开发:
使用记事本编辑.java源程序
使用javac命令编译,生成.class文件
使用java命令运行.class文件
注释:单行 //, 多行/* 开头和*/结尾, JavaDoc注释:/*开头和/结尾
反编译软件:jad, frontend 如:在cmd 中jad.exe路径下执行:D:\Java\jad>jad -s java C:\Users\LIUWENHAI\Desktop\HelloWorld.class, 反编译过来的文件被放在与jad.exe文件下的路径下。
安装自定义Jdk: preference>installed JREs>add>standard VM >directory>选择安装的jdk>finished. Preference>compiler>选择自己的版本(如1.8)>ok.
格式(字体)设置》preference>general>apperance>basic >font或debug>console font
右击》show line number
Java API帮助文档
Java语言中,变量命名要符合一定规则
字、下、美、人、数、骆驼
有意义
不能使用关键字,如public、class
数据类型分两种:基本数据类型和引用数据类型。
8中基本数据类型:
>数值型
- 整数类型(byte,short,int,long)
- 浮点类型(float,double)
>字符型(char),
>布尔型(boolean)

对应字节数:
byte 1字节
short 2字节
int 4字节
long 8 字节
float 4字节
double 8字节
char 2 字节,采用unicode码
boolean 一个字节

数据类型 大小 取值范围
byte -128 ~ +127
1字节8位
-(-231) ~ +
int 4字节32位
(231-1)
-32768 (-215) ~ + 32767
short 2字节16位
(+215-1)
-263 ~ + 263-1
long 8字节64位
1.4E-45 ~ 3.4E+38 , -1.4E-45
float 4字节32位浮点数
~ -3.4E+38
4.9E-324 ~ 1.7E+308, -4.9E-
double 8字节64位浮点数
324 ~ -1.7E+308
引用数据类型主要包含:类,接口和数组等

常量:(1)常量名通常大写
(2)不同字符使用下划线分隔
(3)只能被赋值一次,通常定义时即对
其初始化
eg: public static final String RISK_REPORT_HANDLED = “已解决”;

常量类型及规则:
整型常量:int, long(eg:789, 超过int取值范围的 要在整数后面加大写的L,才能作为Long处理)
浮点型常量:float, double ,(eg: 3.4F, 默认是double,float需要在数字后加大写的F)
布尔常量: true和false,
字符常量:char,字符常量占用两个字节,转义字符常量是不可显示字符,,表示单引号,双引号,反斜杠时,再加一个“"即可。

  • 普通字符:‘A’,‘8’,‘a’
  • 转义字符:’\n’ 表示换行; ‘\t’ 表示按‘tab’; ‘\b’ 表示按 ‘Backspace’
  • 特殊字符常量: ‘\’ (反斜杠), ‘’’(单引号), ‘"’(双引号)
    字符串常量:"北大“
    null 常量
    符号 常量:

变量:
语法: 【访问修饰符】 变量类型 变量名【=初始值】
【】中代表可有可无
使用Scanner
Scanner input = new Scanner(System.in);
int now = input.nextInt();
String next() 获得一个字符串
int nextInt()获得一个整型数值
double nextDouble()获得一个双精度类型数值
boolean hasNext() 判断是否有输入数据。如果有输入数据,
则返回 true;否则,返回false

自动类型转换和强制类型转换

基本的算术运算:+,-,,/,%,++,–
复合赋值运算符:+=,-=,
=,/=,%=
关系运算符:
逻辑运算符:&&(短路与),||短路或, !(非)
优先级:非,与,或
条件运算符(三元运算符): 条件?表达式1:表达式2
位运算符:

运算符优先级:
单目运算符包括 ! ~ ++ --,优先级别高
优先级最低的是 赋值运算符 ;
通过() 控制优先级别
算术运算符>关系运算符 >逻辑运算符

位运算:
按位与: & 两操作数都是1, 结果为1.
按位或: | 两操作数一个是1,结果为1.
按位异或 ^ 两操作数相同,结果为0, 两操作数不同,结果为1。
按位非/取反 ~ 操作数为1, 结果为0。操作说为0,结果为1.
左移 << 右边空位补0
右移 >> 左边空位补最高位即符号位
无符号右移 >>> 左边空位补0
位运算符对操作数以二进制为单位进行运算。
位运算的操作数是整数型,包括 char, byte, int ,short ,long., 结果也是int ,long等整数型。, byte,char, short 会自动转换为int 做运算。

计算6<<2 , 得先把6转为二进制,然后把二进制向左移动两位,空出来的两位补0, 结果为24.可以得出结论:一个整数每向左移动1位,其值扩大2倍(622)。

流程控制:
掌握if分支结构
嵌套if控制语句
掌握switch分支结构(条件为等值判断), break语句 枚举enum
掌握while循环结构(
掌握do-while循环结构
掌握for循环结构和增强for
理解各种循环结构的适用场景
逐步解决指定问题的步骤和方法的一种图形化表
示方法

Java二重循环
九九乘法表
For (int i=1;i<=9;i++){
For (int m=1;m<=I;m++){}
/n}

双重循环次数:外层循环次数*内存循环的次数
Continue:跳出本次循环进入下一次循环
Return 结束方法
随机数:Math.random()
程序调试:设置断点》单步运行,观察变量
F5(单步进入(进入方法) , F6(单步

数组:是变量,存一组相同数据类型的一组数据。是内存中一连串连续的空间。
数组变量
数组四步走: 声明数组(int[] a),分配空间(a=new int[5]),赋值a[0]=8, 处理数据a[0]= (a[0]*10)
基本数据类型:int, double, float, long, char, 这些都是存放在栈内存中。
引用数据类型:数组,包装类.String
Eg: int[] score=new int[5] , score存放在栈内存中,而score指向的5个连续空间则是在堆内存中。
Eg: int [] scores={100,85,89,63}

Arrays类操作数组:常用操作:获取最大,最小值,数字排序,插入数字
插入算法:
通过Scanner 输入要插入的数。
数组空间需要加上所插入个数(空位null)
通过比较找到第一次比别人大(小)的位置
标出找到的位置(index)
将插入的数保存到已经标出位置的数组中去,index
原来位置元素依次往后移。

算法:
冒泡排序:口诀:N个数排序小靠前,外层循环 N-1, 内层循环N-1-l .
比较次数一次比一次少(-1),
双循环(控制比较多少轮和可控制比较多少次)
交换数据 (外层循环(轮):+ 内存循环(次数)=数组的长度-1
外层循环=数组的长度-1;
即内层循环(轮)=数组的长度-1-外层循环;
交换数据: int temp=nums[j]; nums[j]=nums[j+1]; nms[j+1]=temp;

用二重循环将5个数字升序排序
5个数字如何存放
数组,数组.length = 5
控制比较多少轮
外层循环,循环变量 i
控制每轮比较多少次
内层循环,循环变量 j
交换数据

Arrays类: sort, fill, binarySearch, copyOf, toString (bc f st)
Arrays.sort(数组名) 排序
方法名称 说明
boolean equals(array1,array2) 比较array1和array2两个数组是否相等
sort(array) 对数组array的元素进行升序排列
String toString(array) 将一个数组array转换成一个字符串
void fill(array,val) 把数组array所有元素都赋值为val
把数组array复制成一个长度为length
copyOf(array,length)
的新数组,返回类型与复制的数组一致
查询元素值val在数组array中的下标
int binarySearch(array, val)
(要求数组中元素已经按升序排列)

import java.util.Arrays; public class ArraysToolClass { public static void main(String[] args) { int[] scores ={99,9,67,97}; Arrays.sort(scores); String scoreString =Arrays.toString(scores); System.out.println(scoreString); int[] scores2 = {84,38,98,98,87,67}; boolean trueOrFalse = Arrays.equals(scores, scores2); System.out.println(trueOrFalse); int[] scores3 ={99,9,67,97}; Arrays.sort(scores3); boolean trueOrFalse2 = Arrays.equals(scores, scores3); System.out.println(trueOrFalse2); Arrays.fill(scores3, 88); String scores3FillToString =Arrays.toString(scores3); System.out.println(scores3FillToString); System.out.println("before:"+ scores2.length); int [] scores4 = Arrays.copyOf(scores2, scores2.length*2); System.out.println("after:"+ scores4.length); System.out.println(Arrays.toString(scores4)); int index = Arrays.binarySearch(scores2, 98); System.out.println(index); } } 

讯享网

一维数组:存的是值 如:int i [] ={1,3}
二维数组:数组中存的还是数组 int [][] scores=new int [4][8],
Scores 就是栈, 【4】【8】这两个是不同的堆,【4】代表第一维数组的空间,【8】代表第二维数组的空间

多维数组很少用(二维居多)

二维数组
讯享网

定义并赋值:
写法一:
int [][] scores = new int [][]{ {90,85,92.78,99}{76,74,89}{87}};
写法二:
int scores [][] ={ {90,85,92.78,99}{76,74,89}{87}};

对象数组作为参数

讯享网Public void modifyScore(Student[] stus); 例子:给学员成绩小于60分的同学提高2分。 Pulic class ModifyScore{ Public void modifyScore(Student[] stus){ Boollean flag=false; For(int i=0;i<stus.length;i++){ If(stus[i].score<60){ Flag=true; Break; } } If(flag){ For(int i=0;i<stus.lentgh;i++){ Stus[i].score+=2; } } } } Pulic static void main(String[] args){ ModifyScore ms=new ModifyScore(); Student[] stus=new Student[2]; Student s1=new Student(); S1.name=”tom”, S1.age=18, S1.major=”computer”; S1.score=100; Student[] s2=new Student[2]; S1.name=”tom”, S1.age=18, S1.major=”computer”; S1.score=100; Stus[0]=s1; Stus[1]=s2; Ms.modifyScore(stus); For(Student stu:stus){ System.out.println(stu.name+stu.score); } } 

注:每一个类默认都有一个构造方法 如:public Student();,
这样在实例化时就可以是Student stu=new Student;
构造方法:无返回值,名字和类名一样。可以在构造对象时完成对象属性的(赋值)初始化,
This: 代表当前对象。
This用法:
this 用法调用
构造方法之间互相调用(必须是构造方法中的第一条语句)
构造方法调用

Java面向对象
面向对象三大特性:封装,继承,多态
抽象类和接口的使用
程序中的异常处理
面向对象实现景区价格计算
使用面向对象描述学校相关类
使用对象数组输出学员年龄

类和对象的区别:
对象:万物皆对象。用来描述客观事物的一个实体,由一组属性和方法构成。
类:具有相同属性和方法的一组对象的集合。
类是对象的抽象,对象是类的实例(具体)

属性:对象具有的各种特征(成员变量)
方法:对象所执行的操作(成员方法)。有返回值方法和无返回值方法, 带参方法(多个参数之间用逗号隔开)和无参方法。
形参和实参:方法定义处的参数叫形式参数,方法调用处传的值叫实际参数。形参和实参名字可以不一样,但类型和参数个数,顺序必须一样
方法调用:
方法之间允许相互调用,不需要知道方法的具体事项,实现重用,提高效率
方法a直接调用同一个类中的b方法: public void a(){ b() }
A类中方法a 调用B类中 的b 方法: 先创建类对象,再用“.” 调用。
public void a (){ B b = new B(); b.b(); }

方法传参:
定义类的步骤:定义类名,编写类的属性,编写类的方法
创建对象: 类名 对象名=new 类名();
引用对象成员:使用“.”。
引用类的属性:对象名.属性
引用类的方法:对象名.方法名().
类图:可以用类图工具(rose,visio,powerdesigner)
Dog 是类名, +是public修饰符,-是private修饰符,name是属性名, String是变量类型, print()是方法名, void是 代表无返回值。
类图描述

面向三大特性:封装,继承,多态。
封装:
例子:狗的属性值为health,如果不封装的话就会暴露给其他人,从而更改了属性值。所以必须通过封装来隐藏其信息,并通过方法来提供对隐藏信息的操作和访问。
封装步骤:设为private,getter/setter(属性的读写),在getter/setter方法中加入控制语句。
Setter赋值,无返回值,
Getter取值,有返回值。
JDK基本包:java.lang(虚拟机自动引入), java.util(实用类), java.io(如输入,输出)

如:java.lang (Scanner, Math.random)

类成员的访问修饰符:
private 在同一个类中可以访问,
默认修饰符 在同一类中,同一个包可以访问,
Protected 多用于继承相关(在同一类中,同一个包,子类中可以访问,)
public 到处都可以访问。

Static 修饰符(静态变量和静态方法):直接通过类名调用 成员(静态)变量,成员(静态)方法,(静态)代码块。

类的成员变量包括静态变量(类变量)和实例变量
静态变量: static 修饰,在内存中只有一个拷贝,在类内部可以直接访问,其他类中中,通过类名访问。
实例变量:没有static修饰,每创建一个实例就分配一次内存,,可以有多个拷贝,互不影响。
静态方法:可直接通过类名访问,静态方法中不能用this和super,
静态方法中不能访问所属类的实例变量和实例方法(原因和this和super一样)
可以访问类的静态变量和静态方法

继承: (单根继承,代码重用),

  1. 把重复的代码(属性和方法)抽取出来形成父类,。 Public class Pet
  2. 编写子类,继承父类, public class Dog extends Pet
  3. 子类无法继承父类的构造方法,但可以使用super关键字调用父类成员,方法重写父类中的方法而输出子类中自身的信息。

子类访问父类成员(使用super关键字,super代表父类对象,在子类构造方法中调用且必须是第一句,不可以访问父类中定义为private的属性和方法)
访问构造方法:
super();
super(name);
访问父类属性,
super.name
访问父类方法
super .print();

什么时候用继承?
符合is -a关系的设计使用继承。
继承是代码重用的一种方式(将子类共有的属性和行为放到父类中)

什么是方法重写?
子类根据需求对从父类继承的方法进行重新编写
重写时,可以使用 super关键字来保留父类的方法
构造方法不能被重写。

方法重写的规则:
方法名相同,
参数列表相同,
返回值类型相同或是其子类
访问权限不能严于父类
父类的静态方法不能被子类覆盖为非静态方法,父类的非静态方法不能被子类覆盖为静态方法。
子类可以定义与父类同名的静态方法,以便在子类中隐藏父类的静态方法。
父类的私有方法不能被覆盖。
不能抛出比父类方法更多的异常

Object类被子类经常重写的方法
toString(),
equals(),
hashCode()
getClass(),获取当前对象所属的类的信息,返回Class对象

抽象方法:r如:public abstract void print()
抽象方法没有方法体,
抽象方法必须在抽象类中,
抽象方法必须在子类中被实现,除非子类是抽象类

为什么抽象类不能被实例化?

<父类型><引用变量名> = new <子类型>();
此时通过父类引用变量调用的方法是子类覆盖或继承父类的方法,不是父类的方法
此时通过父类引用变量无法调用子类特有的方法。

抽象类与抽象方法的使用
抽象类中可以没有抽象方法,但包含了抽象方法的类必须被定义为抽象类,
如果子类没有实现父类的所以抽象方法,子类必须被定义为抽象类
没有抽象构造方法,也没有抽象静态方法。
抽象类中可以有非抽象的构造方法,创建子类的实例时可以调用

接口
必须知道的接口特性
接口不能被实例化,
实现类必须实现接口的所以方法,
实现类可以实现多个接口
接口中的变量都是静态常量(public static final )

接口
面向接口编程
三角和是“继承”关系, 三角和虚线是“实现接口”关系
这里写图片描述

接口中的成员变量,默认都是public static final 的,必须显示初始化,
接口中的方法, 默认都是public abstract
接口没有构造方法,不能被实例化,
一个接口不能实现另一个接口,但可以继承多个其他接口(可以参考“java中接口之间的继承”https://www.cnblogs.com/littlepanpc/p/3616300.html)
一个类必须实现接口抽象方法(implements),除非这个类是抽象类(有点疑问)

一个类只能extends一个父类,但可以implements多个接口。java通过使用接口的概念来取代C++中多继承。与此同时,一个接口则可以同时extends多个接口,却不能implements任何接口。因而,Java中的接口是支持多继承的

抽象类和接口
相同点和不同点
相同点:
代表系统的抽象层
都不能被实例化
都能包含抽象方法
都能包含抽象方法(用于描述系统的服务,不必提供具体实现)

不同点:
在抽象类中可以为部分方法提供默认实现,而接口中只能包含抽象方法,(抽象类便于复用,接口便于代码维护)
一个类只能继承一个直接的父类,但可以实现多个接口。

异常处理
异常处理

多重异常:先子到父的顺序

多重Catch块
引发多种类型的异常
排列catch语句顺序:先子类后父类
发生异常时按顺序逐个匹配
只执行第一个与异常类型匹配的catch语句

如果后台方法中声明了异常,
方法一:那么当前台调用方法时(或Main方法调用)则必须提前做异常处理或判断。
方法二:普通
方法一:

异常1

异常2

异常3

Syserr : System.err.println();

在catch块 中处理异常
加入用户自定义处理信息,
System.err.println("出现错误,被除数与除数必须是整数“)

异常对象常用的方法
void printStackTrace(): 输出异常的堆栈信息。
String getMessage(): 返回异常信息描述字符串,是printStackTrace()输出信息的一部分。

异常对象常用的方法1

异常对象常用的方法2

存在return的try_catch_finally块

  1. 首先,是使用的位置,throws 只能跟在方法名和括号的后面,而 throw 只能出现在方法体内。
  2. 其次,throws 是一个声明(它声明这里可能出现异常,但未必一定出现),而 throw 是一个动作(它抛出也可以说它产生一个异常出现,只要执行到了这个关键字,异常必定出现)。当你使用 throw 抛出(产生)一个异常的时候,如果方法用 throws 抛弃(抛开,这里不理了)异常,那么这个异常将被抛到了"调用这个方法"的地方去。如果这个方法没有用 throws 抛弃异常,那么就需要使用 try…catch 来捕捉异常了。相信你能明白这里所谓的“产生”跟“抛弃”的区别了。产生,就是异常出现的地方。抛弃,就是让异常通过这里去到别的地方,是异常经过的地方。如果你还不明白 throw 具体有什么用,我再举一个简单的例子。例如你做一个程序,需要输入月份的,如果输入了 13 ,那就是无效数据,那这时候你有两种处理方式,第一种就是使用判断语句判断,然后提示;第二种就是抛出一个异常,让上层调用的方法去处理这个输入错误。如果你不明白这种做法的好处,那没关系,以后程序做多了你就会发现的,现在至起码你知道了它有这种用法。

Pubic static void main(String [] args){
Try{
Scanner input=new Scanner(System.in);
Int a =input.nextInt();
}
Catch(Exception e){
e.printStackTrace();//debug(不能给客户看的)
System.out.println(“您输入的不是数字,请你重新输入”);//客户能看到的提示

}
System.out.println(“xxxx”);
}finally{
//处理
System.out.println(“我都有执行”);
}

Or
Catch(Exception e){
e.printStackTrace();//debug(不能给客户看的)
e=new Exception(“您输入的不是数字,请你重新输入”) ;//客户能看到的提示
e.getMessage();
}

System.out.println(ex.getMessage()); 打印异常信息。 如: /by Zero


Exception 类:
Exception
ArithmaticException
ArrayIndexOutofBoundEcxception
ClassnotfoundException
ClassCastExcepiton
NullPointerException
NumberFormatException
IllegalArgumentException

手动抛出异常:
判断性别{
}esle{
Throw new exception(“性别比现是男或女”);
}

自定义异常(自定义异常必须先声明异常)
public void setSex(String sex) throws Exception
if(sex.equals(“男”) || sex.equals(“女”)){
this.sex = sex,
} else {
throw new Exception("性别必须是男或女“)
}

异常链

自行抛出异常

异常体系结构

自定义异常

小讯
上一篇 2025-02-27 22:34
下一篇 2025-03-05 20:10

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/26843.html