[学习笔记] Java面向对象之继承和多态
# 学习 # · 2020-06-22
继承
1、java中继承的基本语法(关键字:extends):
修饰符 子类 extends 父类 {
//类定义的部分
}
2、java中只支持单继承,即每个类只能有一个直接父类。继承表达的是is a的关系。
3、在java中所有的java类都直接或间接继承了java.lang.Object类。Object类是所有java类的祖先。在定义一个类时,如果没有使用extends关键字,那么这个类直接继承Object类。
4、子类:
(1)可以继承public和protected修饰的属性方法,无论子类和父类是否在同一个包里。
(2)继承默认权限修饰符修饰的属性和方法,但子类和父类必须在同一个包里。
(3)无法继承private修饰的属性和方法。
(4)无法继承父类的构造方法。
5、多重继承关系的初始化顺序:父类属性—父类构造方法—子类属性—子类构造方法。
//父类
class Car {
private int site = 4; //座位数
Car(){
System.out.println("载客量是"+site+"人);
}
public void setSite(int site){
this.site = site;
}
void print(){
System.out.print("载客量是"+site+"人");
}
}
//子类
class Bus extends Car {
Bus(int site){
setSite(site);
}
}
//主方法
public static void main(String[] args) {
Bus bus = new Bus(20);
bus.print();
}
重写和继承关系中的构造方法
1、方法重写的规则:
(1)具有相同的方法名;
(2)具有相同的参数列表;
(3)返回值类型相同或者是其子类;
(4)不能缩小被重写方法的访问权限。
(5)构造方法不能被继承,不能被重写。
class Animal{
public void move(){
System.out.println("动物可以移动");
}
}
class Dog extends Animal{
public void move(){
System.out.println("狗可以跑和走");
}
}
public class TestDog{
public static void main(String args[]){
Animal a = new Animal(); // Animal 对象
Animal b = new Dog(); // Dog 对象
a.move();// 执行 Animal 类的方法,动物可以移动
b.move();//执行 Dog 类的方法,狗可以跑和走
}
}
2、super关键字:必须出现在子类(子类的方法或构造方法)中,注意访问权限的限制
①super.name; //访问直接父类的name属性
②super.print(); //访问直接父类的print()方法
③super(name); //访问直接父类对应的构造方法中,只能出现在构造方法中。
3、继承条件下构造方法的调用规则:
(1)如果子类的构造方法中没有通过super显示调用父类的有参构造方法,也没有通过this显式调用自身的其他构造方法,则系统会默认调用父类的无参构造方法。在这种情况下,有没有super()语句效果都是一样的。
(2)如果子类的构造方法中通过super显式调用父类的有参构造方法,则将先执行父类相应的构造方法,而不执行父类无参构造方法。
(3)如果子类的构造方法中通过this显式调用自身的其他构造方法,则在响应的构造方法中应用以上两条规则。
(4)如果存在多级继承关系,则在创建一个子类对象时,以上规则会多次向更高一级父类应用,一直到执行顶级父类Object类的无参构造方法为止。
4、注意:
(1)在构造方法中如果有this语句或super语句出现,则只能是第一条语句,且不能同时出现。
(2)在实例方法中,this和super语句不要求是第一条语句,可以共存。
(3)在类方法中不允许出现this和super关键字。
抽象类和抽象方法
1、抽象类和抽象方法都通过abstract关键字来修饰。
2、抽象类不能被实例化,抽象类中可以没有、有一个或有多个抽象方法。
3、抽象方法只有方法声明,没用方法体现。有抽象方法的类必须声明位抽象类。
4、抽象类可以有构造方法,其构造方法可以被本类的其他构造方法调用,若此构造方法不是由private修饰,也可以被本类的子类中的构造方法调用。
多态
1、实现多态的方法:
(1)使用父类作为方法形参:
public class Master {
public void feed(Pet pet) {
pet.eat();
}
}
//测试类代码
Pet pet = new Dog();
Master master = new Master();
master.feed(pet);
(2)使用父类作为方法返回值:
public class Master {
public Pet getPet(String typeId){
… …
}
}
2、子类到父类的转换(向上):将一个父类的引用指向一个子类对象。
Pet pet = new Dog();
3、父类到子类的转换(向下):
Pet pet = new Dog(“欧欧”, “雪纳瑞");
Dog dog = (Dog) pet;
4、instanceof运算符的语法:
对象 instanceof 类或接口
5、instanceof通常和强制类型转换结合使用。
public class Master {
public void play(Pet pet){
if (pet instanceof Dog) { //如果传入的是狗狗
Dog dog = (Dog) pet;
dog.catchingFlyDisc();
}else if (pet instanceof Penguin) { //如果传入的是企鹅
Penguin pgn = (Penguin) pet;
pgn.swimming();
}
}
}
如若转载,请注明出处:一木林多 - https://www.l5v.cn/archives/24/
评论