byte 一个字节(服务器端编码的时候按照byte编码,整数变量)
short 两个字节
char 两个字节(因此可以存储汉字,而c/c++的char只有一个字节无法存储汉字)
int 四个字节
float 四个字节,有效数字位数是8位
long 八个字节
double 八个字节,有效数字位数是16位
985211(默认是int型常量)
985.211(默认是double型常量)=》float=985.211会报错需要类型强转为float类型
985211L(long型常量)
985211F(float型常量)
类体中声明的变量
有效范围:有效性和它在类体中书写的先后位置无关,因为都是先new出来,方法才能使用,类似数组定义运行,所以存在初始值。
成员变量有初始值。
注意问题:
类体中的内容由两部分组成,一部分是变量的声明;另一部分是方法的定义。
对于成员变量的操作只能放在方法中,方法使用各种语句对成员变量和方法体中声明的局部变量进行操作。
声明成员变量时可以赋初值
class A{
int a=666;
int b=a;
}
不可以进行赋值操作
class A{
int a;
a=666;
}
方法体中声明的变量
有效范围:只在方法内有效,而且从声明它的位置之后开始有效。
局部变量没有初始值(局部静态变量也没有)
if(条件表达式)括号中结果必须为boolean类型,不能使用0或者null作为false使用
同:
可以进行数组的初始化构建数组。
int num[]={
985,211};
异:
c/c++版本
数组元素无初始值。
int num[666];
java版本
需要进行new操作指定元素个数,不允许声明时直接指定个数。
new int[666],类似于初始化的构造方法,因此java中数组元素都会有初始值。
int num[]=new int[666];
//先是定义了存储对象引用的对象指针类型,初始值为null
Student stu[]=new Student[666];
//然后给每个对象元素进行引用赋值
for(int i=0;i<stu.length;i++)
stu[i]=new Student();
//多用于list数组,未知数组长度
//list数组不能为基本数据类型(String不是基本数据类型),因为可以直接使用基本数据类型数组,无需多此一举
for(声明循环变量:数组名字){
}
注意一定要是在for循环条件中声明循环变量。
int num[]=new num[666];
错误示范:
int i=0;
for(i:num)
正确操作:
for(int i:num)
替代操作:
for(int i=0;i<num.length;i++)
Java应用程序中含有一个主类,即含有main方法的类,Java应用程序加载到内存中后会从main方法开始执行。
也可以通过注入@test方式运行测试指定的方法。
默认是先加载分配类变量,然后运行main方法。(分配好类变量,main方法才能调用)
声明类时,单词首字母大写(多个单词那就多个首字母大写)。
class PersonInformation{
}
声明变量时,变量名的首字母小写,其余单词首字母大写。
int personCard;
类体中的内容由两部分组成,一部分是变量的声明;另一部分是方法的定义。
对于成员变量的操作只能放在方法中,方法使用各种语句对成员变量和方法体中声明的局部变量进行操作。
声明成员变量时可以赋初值和new等操作,只要是声明时的操作就行。
class A{
int a=666;
int b=a;
类 对象变量=new 类();
}
不可以进行赋值操作
class A{
int a;
a=666;
}
当Java程序执行的时候,类的字节码文件被加载到内存中,如果该类没有创建对象,类中的实例变量不会被分配内存。但是类中的类变量,在该类被加载到内存的时候,就分配了对应的内存空间并且初始化。
实例方法只有当创建第一个对象的时候才会被分配入口地址,所有对象都用这一个入口地址。
当全部对象不存在时,入口地址才会被取消。
类方法是当类被加载到内存中时就会被分配入口地址,类方法只能操作类变量和类方法内定义的局部静态变量。(程序加载到内存中时,先给类变量分配空间,然后才会给类方法分配入口地址,因为类方法需要用到类变量)
举例:
Arrays类存在sort和binarySearch等类方法。
对象其实还是个指针,存储的是对应实体(分配给对象的变量)地址。
垃圾收集机制:就是将不再存在对象指向的引用(地址)调用,就对其对应实体进行内存释放。
大佬详细介绍static静态代码块和普通代码块区别
区别很简单:
静态代码块,在虚拟机加载类的时候就会加载执行,而且只执行一次;
非静态代码块,在创建对象的时候(即new一个对象的时候)执行,每次创建对象都会执行一次
一个程序可以有多个静态非静态代码区域。
static{}(静态代码块)与{}(非静态代码块)的异同点
相同点 都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个,
一般在代码块中对一些static变量进行赋值。.
另外static块中只能使用static修饰的属性。
程序中的static{}块只是为了加载properties文件信息,这个加载只会被加载一次。
不同点 静态代码块在非静态代码块之前执行(静态代码块—>非静态代码块—>构造方法)。
静态代码块只在第一次new执行一次,之后不再执行,而非静态代码块在每new
一次就执行一次。非静态代码块可在普通方法中定义(不过作用不大);而静态代码块不行。
一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;
需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,这种代码是被动执行的.
静态代码块和静态方法的区别
两者的区别就是:静态代码块是自动执行的;
静态方法是被调用的时候才执行的.
作用:静态代码块可用来初始化一些项目最常用的变量或对象;静态方法可用作不创建对象也可能需要执行的代码.
因此静态代码块先于main函数执行。
静态代码段注意事项:
静态代码块只能定义在类里面,它独立于任何方法,不能定义在方法里面。
静态代码块里面的变量都是局部变量,只在本块内有效。
静态代码块会在类被加载时自动执行,而无论加载者是JVM还是其他的类。
一个类中允许定义多个静态代码块,执行的顺序根据定义的顺序进行。
静态代码块只能访问类的静态成员,而不允许访问实例成员。
当对应类加载到内存中时
static变量-》static代码块-》static方法
对于成员变量,非静态代码,实例方法也成立
成员变量-》非静态代码-》实例方法
因为代码块和方法都可能会用到static变量,所以先new变量。
而代码块需要初始化对应的static变量,方法可能会用到初始化好的static变量。
当类都在同一个包中时无需import,可以直接使用同一包下的类。
Java.lang包是Java语言的核心类库,系统自动引入了,java.lang包中的类(例如:System类,Math类等)还有Byte,Integer,Short,Long,Float,Double,Character等封装类(下图所示)。
使用import引入的类时,需要注意该类方法最好设置为public类型,否则protected或者友好类型会导致方法不能使用。
同一包下的,无需import,所以方法可以是protected和友好
上转型对象
不只是abstract类允许上转型,普通类也可以。
上转型对象可以通过操作重写的方法间接操作新增的变量。
super关键字
super.隐藏的变量/方法。
super()调用父类的构造方法。
接口中只有常量(不能有变量)和抽象方法两部分。
并且所有常量都默认是public static final(允许省略)
抽象方法默认是public abstract(允许省略)
接口实现类可以实现多个接口,实现(implements)的接口方法。
重写:
方法的名字,参数个数,参数的类型和父类的方法完全相同,返回值可以不同(但是也必须为父类的子类型)。
重载
参数的个数不同。
参数个数相同,但参数列表中对应的某个参数的类型不同。
(方法返回类型和参数的名字不参与比较)
返回类型 方法名(参数类型 ,参数类型)
必须显示的用public修饰重写的方法。
因为重写不能降低访问权限,但是可以提高访问权限。
内部类就是在类中再声明一个类,但是和设计模式中的开闭原则还有单一原则等冲突,耦合性高。
内部类特性:内部类可以用static修饰,非内部类不可以是static类。
假设Bank是类
new Bank(){
匿名类的类体
};
效果等同于一个继承了Bank类的子类声明一个对象。
常用类知识点梳理
泛型类声明:
class People<E>{
}
People people=new People<Student>();
People是泛型类的名称,E是其中的泛型,也就是说,并没有指定E是何种类型的数据,它可以是任何对象或者接口,但不能是基本类型数据=》因此List<不能为基本类型数据>(如果想使用基本类型可以将对应的分装类代替E,Integer=int,会自动装箱拆箱)
堆栈:Stack
散列映射:HashMap