[学习笔记] 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/

评论