1.接口
什么是接口?
比抽象类更加抽象的表现形式的就是接口
接口的定义格式?
interface 接口名 {}
interface AAA {}
接口的使用格式?
interface AAA {}
class BBB implements AAA {
}
public Demo {
public static void main(String[] args) {
BBB b = new BBB();
}
}
类与类的关系,接口与接口的关系,类与接口的关系?
类与类的关系?
继承关系,只支持单继承,不可以多继承,可以多层继承,不可以循环继承
接口与接口的关系?
继承关系,可以单继承,也可以多继承
类与接口的关系?
实现关系,一个类可以实现一个接口,也可以实现多个接口,也可以在继承一个类的同时实现多个接口
接口和抽象类的区别?
从设计角度来考虑它们的区别
什么时候使用抽象类?
当两个类之间存在"is a"的关系的时候,
只不过这个类里面有了抽象方法,所以该普通类变成了抽象类
什么时候使用接口?
接口是额外扩展的功能,也就是说该类本身不具备某个功能,但是呢如果想要这个功能,你就可以去实现具备该功能的接口
2.final关键字
什么是final关键字?
它是一个修饰符,代表最终的意思,可以修饰类,变量,方法
final关键字特点?
被final修饰的类不可以被继承
被final修饰的方法不可以被重写
被final修饰的变量变成了常量,就是自定义常量
3.多态
什么是多态呢?
对象在不同的时刻,表现出来的不同的状态
多态的好处和弊端?
好处:提高了扩展性
在开发中,一般都是父类类行为形式参数,子类对象作为实际参数
弊端:有局限性,使用了多态,父类引用不能使用子类特有的东西
多态的前提条件?
要有继承或者实现的关系
要有父类引用(父接口引用)指向子类对象
要有方法的重写(即使没有方法的重写也可以构成多态,只不过没有方法重写的多态没有意义)
多态的代码体现?
class Fu {
public void print() {
System.out.println("fu");
}
}
class Zi extends Fu {//产生了继承的关系
public void print() {//方法的重写
System.out.println("zi");
}
}
class Demo {
public static void main(String[] args) {
Fu fu = new Zi();//父类引用指向子类对象
}
}
多态中子父类之间成员变量的关系?
假设:父类中有一个成员变量,子类中有一个成员变量
如果这两个变量的名字不相同的话:
class Fu {
int i = 1;
}
class Zi extends Fu {
int j = 2;
}
class Demo {
public static void main(String[] args) {
Fu aaa = new Zi();
System.out.println(aaa.i);//1
System.out.println(aaa.j);//编译报错
}
}
如果这两个变量的名字相同的话:
class Fu {
int i = 1;
}
class Zi extends Fu {
int i = 2;
}
class Demo {
public static void main(String[] args) {
Fu aaa = new Zi();
System.out.println(aaa.i);//1
System.out.println(aaa.i);//1
}
}
总结:总以上两个案例的结果来分析,父类引用不能使用子类中特有的成员变量,只能使用父类中带的
记住口诀:针对成员变量来说,编译看左边,运行看左边
多态中子父类之间成员方法的关系?
假设:父类中有一个成员方法,子类中有一个成员方法
如果这两个方法名字不相同的话:
class Fu {
public void printFu() {
System.out.println("fu");
}
}
class Zi extends Fu {
public void printZi() {
System.out.println("zi");
}
}
class Demo {
public static void main(String[] args) {
Fu aaa = new Zi();
aaa.printFu();//fu
aaa.printZi();//编译报错
}
}
如果这两个方法名字相同的话:
class Fu {
public void print() {
System.out.println("fu");
}
}
class Zi extends Fu {
public void print() {
System.out.println("zi");
}
}
class Demo {
public static void main(String[] args) {
Fu aaa = new Zi();
aaa.print();//zi
aaa.print();//zi
}
}
总结:总以上两个案例的结果来分析,父类引用不能使用子类中特有的成员方法,只能使用父类中带的
记住口诀:针对成员方法来说,编译看左边,运行看右边
注:针对静态的方法来说,编译看左边,运行看左边
向上向下转型?
什么是向上转型?
就是多态格式,父类引用指向子类对象
向下转型有什么好处?
解决了父类引用不能使用子类特有成员的问题
向下转型的格式?
Fu fu = new Zi();//向上转型
Zi zi = (Zi)fu;//向下转型
注:转不好容易报错,ClassCastException 类型转换异常
instanceof关键字有什么作用?
判断左边的对象的数据类型是否是右边的数据类型
if(zi instanceof Zi)
|
|