接口
1.接口是JAVA语言的一种引用类型,是方法的集合,如果说类的内部封装了成员变量、构造方法和成员方法,那么接口的内部主要就是封装了方法,包含抽象方法(JDK7及以前),默认方法和静态方法(JDK8),私有方法(JDK9)还可以存放自定义常量。
2一个类只能继承一个直接父类(可能是抽象类),却可以实现多个接口, 接口弥补了Java的单继承
1.格式:public indenfacet 接口名{
//自定义常量【了解】
public static final : 可以省略,默认存在
//抽象方法【重点】
public abstract : 可以省略,默认存在可以省略,默认存在
//默认方法【理解】
public default :实现类可以继承默认方法,实现类的对象可以直接调用接口的默认方法(可以省略,默认存在)
//静态方法【理解】
public static : 直接用接口名调用(可以省略,默认存在)
//私有方法【理解】
private :为当前接口的默认方法和静态方法服务(为了实现类的重写)
//私有静态方法【理解】
private static :
}
2.实现:public class 实现类 implements 接口 {}
3.注意:
类可以继承父类同时,再实现多个接口。
public class 类 extends 父类 implements 接口1, 接口2, 接口3 …
// 两个接口中自定义常量同名 -> 不会有冲突
// 两个接口中静态方法同名 -> 不会有冲突
// 两个接口中私有方法同名 -> 不会有冲突
// 两个接口中的抽象方法同名 -> 只需要重写一次
// 两个接口中的默认方法同名 -> 必须重写
// 父类中的普通方法和接口中的默认方法同名 -> 使用的是父类中的方法
4.类与接口的关系
- 类与类是继承关系, 只能单继承
- 类与接口是实现关系, 可以多实现
- 接口与接口是继承关系, 可以多继承
多态
1.定义:指同一行为,具有多个不同表现形式
2.前提:
出现继承或者接口实现
方法重写(不重写没意义)
父类引用指向子类(实现)对象
3访问特点:
·访问成员变量(编译看左边,运行也看左边):基本不会遇到,因为成员变量都有私有了,使用的时候用get/set方法
·访问成员方法(编译看左边,运行看右边):
4.多态的好处与弊端:
·好处:如果调用参数列表(形式参数)是一个父亲,那么调用方法时传入的参数(形式参数)可以使用该父类所以的子类的对象。
·弊端:父类引用不能,直接使用子类特有的属性和行为
5.向上转型和向下转型:
-
向上转型
- 父类引用指向子类对象
- 格式:
父类类型 变量名 = new 子类类型();
如:Animal a = new Cat();
-
向下转型
- 一个已经向上转型的子类对象,将父类引用转为子类引用,可以使用强制类型转换格式
- 格式:
子类类型 变量名 = (子类类型) 父类变量名;
如:Cat c =(Cat) a;
内部类
成员内部类
1.内部类使用外部类中的成员, 可以直接使用
2.外部类想使用内部类中的成员, 需要先创建对象
3.其他类想使用内部类中的成员, 需要创建内部类的对象(创建内部类对象的前提先有外部类的对象)
外部类名.内部类名 对象名 = new 外部类名().new 内部类名();
匿名内部类
-
1.前提: 存在一个类或者接口
-
2.格式:
new 类名(){} => 代表继承了该类的子类对象new 接口名(){} => 代表实现了该接口的实现类对象
-
3.注意:
当调用方法的时候, 发现方法的形式参数是, 抽象类或者是接口,需要传入的就是它们的子类对象(子类对象就可以用 匿名内部类来表示)
应用数据类型的使用
1.引用数据类型可以作为方法的参数:
当方法的参数列表是一个类的时候, 需要传入的是: 该类的对象
当方法的参数列表是一个抽象类的时候, 需要传入的是: 抽象类子类的对象
当方法的参数列表是一个接口的时候, 需要传入的是: 该接口的实现类对象
-
引用数据类型可以作为方法的返回值:
当返回值类型是类, 返回的就是该类的对象
当返回值类型是抽象类, 返回的是它子类的对象
当返回值类型是接口, 返回的是它实现类的对象 -
引用数据类型作为类中的成员变量
String: 是引用数据类型, 作为成员变量抽象类和接口也可作为类中的成员变量