接口:使用interface关键字进行修饰,是Java的一种引用类型,是方法的集合,封装了方法,包含抽象方法、默认方法、静态方法、私有方法。
接口也会被编译成.class文件,但不是类,而是一种引用类型。
接口不能被创建对象,但是可以用implements关键字被实现。实现接口的类,需要实现接口的所有抽象方法,创建该类对象,就可以调用该方法了,否则,必须是抽象类。
接口无法定义变量,可以定义常量,默认public static final修饰。
接口没有静态代码块。
接口的定义格式:
public inferface 接口名称{ //abstract修饰的抽象方法 //default修饰的默认方法 //static修饰的静态方法 //private修饰的私有方法
接口的实现类定义格式:
非抽象子类实现接口: class 类名 implements 接口名{ //必须重写接口的抽象方法; //可以重写默认方法,也可以直接调用;
接口的默认方法只能通过实现类的对象调用。
静态方法与.class文件相关,实现类无法重写静态方法,只能由接口名调用。
私有方法: 只有接口的默认方法可以调用。
私有静态方法:默认方法和静态方法可以调用。
接口的多实现: 一个类可以实现多个接口:
class 类名 [extends 父类] implements 接口1,接口2{
//有抽象方法时,必须重写接口的抽象方法,若有重名,只需重写一次
//有默认方法时,可继承使用,若有重名的,必须重写一次。
//静态方法通过各自接口名调用。
}
若接口中有默认方法与父类同名,子类就近原则选择执行父类的成员方法。
接口的多继承:接口通过extends继承另一个或多个接口,父接口有重名的默认方法,子接口需要重写一次。(注:子类重写默认方法不能有default,子接口重写可以保留。)
多态:同个行为具有多种不同表现形式。
多态的前提:
一、继承或实现
二、方法的重写
三、父类引用子类对象
多态的体现:
父类类型 变量名 = new 子类对象; =>引用类型的向上转型。
变量名.方法名();
多态在调用方法时,若父类没有该方法,编译错误;若有,执行的是子类重写的方法。
多态的好处:调用方法时,将父类类型作为形式参数,传递子类对象给方法。
引用类型的向下转型:当使用多态时,调用子类有 而父类没有的 方法。
格式:子类类型 变量名 = (子类类型)父类变量名;
通过instanceof关键字,防止ClassCastException类型转换错误的问题。
格式: 变量名 instanceof 数据类型。若是,返回true;否则,返回false。
final关键字:不可改变的类、方法、变量(引用类型地址不能再更改)。
注: for(int i = 0; i< 10; i++){
final int c = i;
Sout(c);
}//通过编译,因为每次循环,都是新的变量c。
成员变量的初始化://final修饰的常量通常全大写
显示初始化: final String NAME = “张三”;
构造方法初始化: this.NAME = NAME;
权限修饰符:
区别 public protected default private 同一类 √ √ √ √ 同一包中 √ √ √ 不同包子类 √ √ 不同包的无关类 √ 一般来说:
成员变量用private,隐藏细节;
构造方法使用public,方便创建对象;
成员方法使用public,方便调用方法。
不加权限修饰符,访问能力和default一样。
内部类:一个类定义在另一个类里面;外面的类叫外部类。
格式:外部类名.内部类名 对象名 = new 外部类型().new 内部类型();
内部类可以直接访问外部类的成员,包括私有成员。
外部类要访问内部类的成员,需要建立 内部类的对象。
内部类编译后成独立的.class文件,前面冠以外部类的类名和 。 如 : W a i B u L e i 。如: WaiBuLei 。如:WaiBuLeiNeiBuLei.class。
匿名内部类:带具体实现的 父类或父接口 匿名的 子类对象。
前提: 继承一个父类或者实现一个父接口。
格式: new 父类名或者父接口名(){
//方法重写
};
当方法的形式参数是接口或者抽象类时,可以将匿名内部类作为参数传递。
引用类型用法:
当类作为成员变量,进行赋值时,实际上是赋给该类一个对象。
interface接口作为成员变量,对它进行赋值操作,实际上是赋给该接口一个子类对象;interface接口作为方法参数时,传递的是它的子类对象;作为返回值类型时,返回的是它的子类对象。