本文主要内容
1、构造方法
2、this、super 、final 、static关键字
3、匿名对象、内部类、包、权限修饰符、代码块
01 构造方法
A、作用:在实例化对象同时对象属性初始化
B、格式:权限 类名(参数列表){}
C、注意事项
1、类中,如果没有构造函数,编译器会自动添加一个无参的构造函数。如果有,则不会自动添加。
2、new 对象时,即是在调用对象的构造方法。
3、同一个类可以有多个构造方法,构造方法以重载的形式展现
4、构造方法在创建对象的时候就执行了,而且只执行一次。一般方法是在对象创建后,需要使用时才被调用,可以被调用多次
5、构造方法没有返回值类型。也不需要写返回值。因为它是为构建对象的,对象创建完,方法就执行结束
02 this关键字
构造方法之间的调用,要使用this(参数),语法:this(参数列表)
1、this(参数)在一个构造方法中调用其他构造方法
2、this(参数)必须写在构造方法中的第一行
3、this关键字用来区别同名的成员变量与局部变量,用法:this.成员变量
03 super关键字
A、格式
调用本类中的构造方法:this(实参列表);
调用父类中的空参数构造方法:super();
调用父类中的有参数构造方法:super(实参列表);
B、注意事项
1、super()调用的是父类的空参数构造方法,进行父类成员的初始化
super(参数)调用的是父类的有参数构造方法,super.成员变量 调用的是父类的成员变量
2 、子类的构造方法中有一个默认的构造方法,在该构造方法中的第一行有一个隐式代码super();
目的是调用父类的构造方法,super代表父类在内存中存储的位置
3、子类中所有的构造方法,无论重载多少个,第一行必须是super()
4、如果父类有多个构造方法,子类中super()可以是父类任意一个构造方法。
5、构造方法不能继承,所以不能重写
6、super()必须是子类构造方法中的第一行
7、无论如何,子类的所有构造方法都要直接或间接的调用到父类的构造方法
8、this()、super()不能同时存在
子类中的构造方法为什么会有一句隐式的super()呢?
原因:子类会继承父类中的内容,所以子类在初始化时,必须先到父类中去执行父类的初始化动作。这样,才可以使用父类中的内容。当父类中没有空参数构造方法时,子类的构造方法必须有显示的super语句,指定要访问的父类有参数构造方法。
04 final 关键字
final修饰类不可以被继承,但是可以继承其他类
final class 子类类名 extends 父类类名{}
final修饰的方法不可以被覆盖,但父类中没有被final修饰方法,子类覆盖后可以加final
public final void 方法名(){}
final修饰的变量称为常量,这些变量只能赋值一次,需要在创建对象前赋值,否则报错
final int i = 20;
i = 30; //赋值报错,final修饰的变量只能赋值一次
05 static关键字
访问静态成员的格式
类名.静态成员变量名
类名.静态成员方法名(参数)
1、静态方法中不能调用非静态方法或变量,只能调用静态方法或变量
2、静态方法中不能使用this或super
3、非静态方法可以使用静态变量
4、当方法中没有使用非静态变量时,方法应该定义为静态方法。
当方法中只使用非静态变量时,方法应定义为非静态方法。
当方法中既没有使用静态和非静态变量时,方法应定义为静态方法。
5、静态方法或变量是在类创建过程中进行创建和初始化的,它的存在优先于非静态方法或变量。当类执行完成后,静态方法或变量才消亡。
6、接口中的每个成员变量都默认使用public static final修饰。
7、被static修饰的成员变量属于类,不属于这个类的某个对象
8、被static修饰的成员可以通过类名直接访问
06 匿名对象
1、匿名对象使用格式: new 类名()
2、匿名对象只能使用一次
3、匿名对象可以作为方法中的参数,也可以作为返回值
07 内部类
A、特点
1、调用方法中的内部类的方法,需要在方法中new内部类,然后调用内部类的方法。
2、匿名内部类方法的调用格式:new 内部类名称(){定义具体方法}.方法名;
3、接口的实现或类的继承,都可以通过 new 接口名或类名(){方法的重写};的方式创建对象。
B、内部类的分类
1、成员内部类
定义在外部类中的成员位置。与类中的成员变量相似,可通过外部类对象进行访问
定义格式
class 外部类 {
修饰符 class 内部类 {
//其他代码
}
}
访问方式: 外部类名.内部类名 变量名 = new 外部类名().new 内部类名();
2、局部内部类
定义在外部类方法中的局部位置。与访问方法中的局部变量相似,可通过调用方法进行访问.
定义格式
class 外部类 {
修饰符 返回值类型 方法名(参数) {
class 内部类 {
//其他代码
}
}
}
访问方式:在外部类方法中,创建内部类对象,进行访问
3、外部类、内部类、内部类方法中同时定义同一个变量时,内部类使用该变量时遵循就近原则。
内部类中的方法想要调用内部类中定义的变量,可以用: this.变量名称
内部类中的方法想要调用外部类中定义的变量,可以用: 外部类名.this.变量名称
4、内部类的定义位置可以在外部类定义变量的任意相同位置
08 包
类中包的声明格式: package 包名.包名.包名…;
在访问类时,为了能够找到该类,必须使用含有包名的类全名:包名.包名….类名,如: java.util.Scanner
导包的格式:import 包名.类名;
09 权限修饰符
public 所有包中的类都可以访问
protected 本包及子类可以访问,不同包的子类访问,只能在子类中访问,不能出类例如:在main方法中实例化子类对象通过实例化的对象去访问protected修饰的方法或变量,是不可以的。
default 本包内都可以访问,不同包的子类不能访问。
private 只能本类可以访问
10 代码块
A、以”{}”划定的代码区域 叫代码块,位置没有固定要求,可随意
B、分类: 局部代码块 构造代码块 静态代码块 同步代码块
1、局部代码块
以”{}”划定的代码区域,此时只需要关注作用域的不同即可
方法和类都是以代码块的方式划定边界的
2、构造代码块
构造代码块是定义在类中成员位置的代码块
优先于构造方法执行,构造代码块用于执行所有对象均需要的初始化动作
每创建一个对象均会执行一次构造代码块
3、静态代码块
定义在成员位置,使用static修饰的代码块。
静态代码块只执行一次,无论new几次对象。非静态代码块、构造方法,new几次对象就执行几次
静态代码块优先于非静态代码块执行,非静态代码块优先于构造方法执行
可用于给静态变量赋值,用来给类进行初始化。