第十一章继承

使用继承

父类

public  void class  Pet{
//共享的属性和方法
}

子类

public   void  class  Dog extends  Pet {
//独有的属性方法
}
public  void  class  Penguin  extends  Pet {
//独有的属性方法
}
子类访问父类成员 super

使用super 关键字,super代表父类对象

访问父类的构造方法

super() 只能放在第一位

例:super(name);

访问父类的属性

例:super.name

访问父类的方法

例:super.print()
不能被子类继承的父类成员

-private成员 代表独有的不能被继承
-构造方法 调用子类时默认先调用父类

protected

可以修饰属性和方法
本类.同包.子类 可以访问

访问修饰符小结
第十一章继承_第1张图片
468490-c4c0fa49ccb5b165.png
多重继承关系的初始化顺序

1.父类属性
2.父类构造方法
3.子类属性
4.子类构造方法

例:class Person {
    String name="李光";// 姓名
    public Person() {
        // super();//写不写该语句,效果一样
        System.out.println("execute Person()");
    }
    public Person(String name) {
        this.name = name;
        System.out.println("execute Person(name)");
    }
}

class Student extends Person {
    String school="蓝翔";// 学校
    public Student() {
        // super();//写不写该语句,效果一样
        System.out.println("execute Student() ");
    }
    public Student(String name, String school) {
        super(name); // 显示调用了父类有参构造方法,将不执行无参构造方法
        this.school = school;
        System.out.println("execute Student(name,school)");
    }
}

class PostGraduate extends Student {
    String guide;// 导师
    public PostGraduate() {
        // super();//写不写该语句,效果一样
        System.out.println("execute PostGraduate()");
    }
    public PostGraduate(String name, String school, String guide) {
        super(name, school);
        this.guide = guide;
        System.out.println("execute PostGraduate(name, school, guide)");
    }
}

class TestInherit {
    public static void main(String[] args) {
        PostGraduate pgdt=null;
        pgdt = new PostGraduate();
        System.out.println();
        pgdt=new PostGraduate("刘小光","北京大学","王老师");
    }
}
继承条件构造方法的调用规则

1.子类没有调用父类的有参构造方法,也没有调用自身构造方法,则默认先调用父类无参构造方法,然后再调用自身无参方法,不用写super() 语句
2.如果子类使用super调用父类的有参构造方法,那将执行父类有参构造方法,不执行父类无参构造方法
3.如果子类使用this调用自身的其他构造方法,则按上面两条使用
4.如果多级继承,在创建子类时,会多次向更高级父类应用,一直到执行顶级父类Obhect类的无参方法为止;

例: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();
}

结果:载客量4人
载客量20人

方法重写

使用继承后,有些属性不是共有的,因此使用方法重写

方法重写 @Override

方法重写需注意的问题

1.构造方法不能被继承,所以不能被重写
规则:
-方法名相同
-参数列表相同
-返回值类型相同或其子类相同
-访问权限不能严于父类 (访问修饰符)

合并
例:package com.dog;

/**
 * Created by ttc on 2018/5/28.
 */
public class Pet {
     String name;
     int health;//健康
     int love;//亲密度
     int type;//类型

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getHealth() {
        return health;
    }

    public void setHealth(int health) {
        this.health = health;
    }

    public int getLove() {
        return love;
    }

    public void setLove(int love) {
        this.love = love;
    }

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }

    @Override
    public String toString() {
        return "Pet{" +
                "name='" + name + '\'' +
                ", health=" + health +
                ", love=" + love +
                ", type=" + type +
                '}';
    }
}
Penguin
例:package com.dog;

/**
 * Created by ttc on 2018/5/25.
 */
public class Penguin extends Pet {

     int sex;//品种

    public int getSex() {
        return sex;
    }

    public void setSex(int sex) {
        this.sex = sex;
    }

    public void pen(){
        String a="";
        if (sex == 1)
        {
            a="Q仔";
        }
        else if (sex==2)
        {
             a="Q妹";
        }
        System.out.println("宠物的自白,我的名字叫"
                +name+"健康值是"+health+"和主人的亲密度是"+love+"我是一只"+a);
    }
    }

Dog
例:package com.dog;

/**
 * Created by ttc on 2018/5/25.
 */
public class Dog extends Pet {

     int breed;//品种


    public int getBreed() {
        return breed;
    }

    public void setBreed(int breed) {
        this.breed = breed;
    }


    public void Pet() {
        String b="";
                if (breed == 1)
                {
                b="拉布拉多";
                }
                else if (breed==2)
                {
                b="雪纳瑞";
                }
        System.out.println("宠物的自白,我的名字叫"
                +name+"健康值是"+health+"和主人的亲密度是"+love+"我是一只"+b);
        }
    }

Main方法
例:package com.dog;

import java.util.Scanner;

/**
 * Created by ttc on 2018/5/25.
 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入宠物的名字");
        Dog dog = new Dog();
        Penguin penguin = new Penguin();
        String name = scanner.nextLine();
        System.out.println("请输入宠物类型:1.狗,2.企鹅");
        int type = scanner.nextInt();

        if (type == 1) {
            System.out.println("请输入狗的品种,1聪明的拉布拉多,2酷酷的雪纳瑞");
            int breed = scanner.nextInt();
            dog.setBreed(breed);
            dog.setName(name);
            dog.setType(type);
            dog.setHealth(100);
            dog.setLove(0);
            dog.Pet();
        }
        else{
            System.out.println("请输入企鹅的品种,1.Q仔,2.Q妹");
            int sex = scanner.nextInt();
            penguin.setSex(sex);
            penguin.setName(name);
            penguin.setType(type);
            penguin.setHealth(100);
            penguin.setLove(0);
            penguin.pen();

        }
    }
}
抽象类

关键字abstract
抽象的不能被实例化,没有实际意义

例:public  abstract  class  Pet{
}

特点:
-抽象方法没有方法体
-抽象方法必须写在抽象类中
-抽象方法必须在子类中实现,除非子类是抽象类

final用法

类不希望被继承

例:public  final   class  penguin  extengs Pet{
}

方法不希望被继承

例:public final void print () { 
}

属性不希望被继承

例:public class Penguin {
       final String  home ="南极";// 居住地
}

加上final的变量后必须赋值,变成常量,不可更改

你可能感兴趣的:(第十一章继承)