目录
一、继承
1、成员变量与方法的访问
2、初始化时,父类与子类构造方法的执行
3、final关键字
4、组合
二、多态
1、重写
2、向上转型
3、向下转型
4、多态的好处
一、继承
继承就是共性的抽取,提高代码的复用率。
1、成员变量与方法的访问
- 在子类中访问成员方法时,优先访问子类,成员变量也是同理。
- 若是在子类与父类中有同名的方法或变量,使用super关键字可访问父类的方法和变量。
2、初始化时,父类与子类构造方法的执行
先去初始化父类,之后再去初始化子类。
所以在子类的构造方法中使用super关键字在第一条语句中,调用父类的构造方法,完成父类的构造。
super与this的相同与不同
相同:
- 都是Java中的关键字。
- 都不能在非静态成员方法中使用。
- 都是在构造方法中的第一条语句,但不能同时出现。
不同:
- super调用父类构造方法,this调用子类构造方法。
- super访问子类中父类特有的成员变量,this访问子类特有的成员变量。
- super()在构造方法中编译器默认提供,this()不会由编译器默认提供。
- super是在子类中继承下来的父类那一部分的引用,this是当前对象的引用。
3、final关键字
可以修饰类,也可修饰变量。
修饰类后,表示此类不可被继承;
修饰变量后,表示此变量只能被赋值一次,之后不能被修改。
4、组合
Java语言不支持多继承,也就是一个类只能继承一个1类,不能继承多个类。
但是有组合这种形式,也就是有a,b,c,d四个类,可以在d中声明出abc三个类型的变量,作为成员变量,这种形式简称has-a的形式。
// 轮胎类
class Tire{
// ...
}
// 发动机类
class Engine{
// ...
}
// 车载系统类
class VehicleSystem{
// ...
}
class Car{
private Tire tire; // 可以复用轮胎中的属性和方法
private Engine engine; // 可以复用发动机中的属性和方法
private VehicleSystem vs; // 可以复用车载系统中的属性和方法
// ...
}
二、多态
多态浅层理解:多种形态,具体点:对于同一个行为,不同的对象去完成时,产生的状态是不一样的。
下面将逐步讲解,最后会顺利理解多态的概念,下面所写的,都是为了多态服务!
1、重写
例:以手机为例,手机要更新了,但是还有人使用按键机,所以不能将按键机的服务停止,不能在按键机的程序上更新手机,使其变成智能机,因为这样会导致老年机不能再使用了。
我们创建的类也是这个道理:
如果我们要更新类,不能在原来的类上修改,可以新建一个类,使其继承旧类,在新类中重写旧类的某些方法,这样旧类中的方法可以被执行,新类中重写的方法也可以被执行,两者不耽误。
重写的规则:
- 针对返回值类型,方法名,参数列表:这三者不允许改变,外壳保持不变
- 针对返回值类型:一般保持不变,如果要变,两个方法的返回值类型必须是父子类的关系
- 针对访问限定符:重写的方法不能比被重写的方法的访问权限低
- 针对被重写的方法:不能用static,private,final修饰,也不能是构造方法。
重写和重载有什么不同呢?
重写就是重写抄写一遍,所以很多地方都不能改变,也就是外壳不变,参数列表绝对不能改变,返回值类型看情况,而重载就是为了不取很多类似的名字才有的,所以参数列表必须要改变,返回值类型不做要求。
2、向上转型
子类继承父类后,重写了父类的方法后,使用父类引用,不能访问子类重写的方法,为了解决这个问题,可使用向上转型:将子类对象赋值给父类对象的引用,这样父类对象的引用,引用了子类对象,就可以访问子类对象中重写的那个方法。
1.直接赋值法
Animal animal = new Cat( );
2.方法传参法
class TestAnimal {public static void eatFood(Animal a){}
}
public static void main(String[] args) {Dog dog = new Dog( );eatFood(dog);
}
3.返回值返回
public static Animal buyAnimal(String var){
if("狗" == var){
return new Dog("狗狗",1);
}else if("猫" == var){
return new Cat("猫猫", 1);
}else{
return null;
}
}
3、向下转型
向上转型后,子类对象的地址只存在与父类对象的引用,导致子类中特有的方法,也就是没有去重写的方法,无法用父类对象的引用调用,所以使用向下转型,将父类对象的引用值赋值给子类对象的引用即可。
语法格式:子类对象引用 = (子类类型)父类对象引用
dog = (Dog)animal;
但是有时候会出现错误,有时候是狗类这个类型进行了向上转型,转成了Animal类,但是向下转型的时候,Animal转给了猫类,这不符合逻辑,发生类型转换错误。(狗类--->Animal类---->猫类),正常应该是(狗类--->Animal类---->狗类)。
所以在向下转型时,要进行检验,使用instanceof检验
if(animal instaceof Cat) {cat = (Cat) animal;
}
4、多态的好处
看下面的代码,当完成一个行为,eat时,所产生的状态是不一样的,这就是多态。
public static void eatFun(Animal animal) {animal.eat();
}
public static void main(String[l args) { Dog dog = new Dog( name:"圆圆",age: 19);eatFun(dog);Cat cat = new at( name:"十三月",age: 1);eatFun(cat);
}
也可以看出:使用多态,可以提高代码的复用,提高效率,扩展能力强。