美文网首页
第十一章继承

第十一章继承

作者: Dream_wdl | 来源:发表于2018-05-28 18:17 被阅读0次

    使用继承

    父类

    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

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

    访问修饰符小结
    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的变量后必须赋值,变成常量,不可更改

    相关文章

      网友评论

          本文标题:第十一章继承

          本文链接:https://www.haomeiwen.com/subject/ovwgjftx.html