面向对象04

面向对象04

继承
  • 作用:代码复用
  • 通过extends来实现继承
public class Student extends Person {}
  • 超类(父类):共同的属性和行为

    public class  Person {
        int name;
        int age;
        void eat(){}
    }
    

    派生类(子类):特有的属性和行为

    public class Student extends Person {
        int studentId;
        String teacherName;
        void study(){}
    }
    
  • 派生类既可以访问派生类的,也可以访问超类的,但超类不可以访问派生类的

    Person person = new Person();
            Student student = new Student();
            person.age = 18;
            person.name = 110;
            person.eat();
            //父类特有的属性和行为自己可以访问
            student.age = 11;
            student.name = 12;
            student.studentId = 11;
            student.teacherName = "lloadb";
            student.eat();
            student.study();
            //子类既可以访问自身,也可以访问父类
    
  • 一个超类可以有多个派生类,但一个派生类只能继承一个超类(单一继承)

  • 继承具有传递性

    子类继承父类,父类又继承另一个类,子类就同时拥有两个类的属性和方法

  • Java规定:构造派生类之前必须先构造超类

  • 构造方法Alt+Insert快捷键

    • 在派生类的构造方法中若没有调用超类构造方法,则默认super()调用超类的构造方法

    • 在派生类的构造方法中若自己调用了超类构造方法,则不再默认提供

      若父类的构造方法是有参,则子类需要自己调用,不再默认提供

      注意:super()调用超类构造方法,必须位于派生类构造方法的第一行

      *this()也必须在第一行,所以不能和super()同时出现

super:指代当前对象的超类对象
  • super.成员变量名

    //调用父类的成员变量
    public class Test01 extends TempClass{
        public  void test() {
            super.a =5;
        }
    }
    class TempClass {
        int a;
        
    }
    
  • super.方法名

    //调用父类的成员方法
    public class Test01 extends TempClass{
        public  void test() {
            super.a =5;
            super.say();
        }
    }
    class TempClass {
        int a;
        void say(){
            
        }
    
    }
    
  • super()

    //调用父类的构造方法
    public class Test01 extends TempClass{
        public Test01() {
            super(5);
        }
    //若父类的构造方法无参,子类默认调用无参构造
    //若父类为有参构造,则必须手动调用
        public  void test() {
            
            super.a =5;
            super.say();
            
        }
    }
    class TempClass {
        public TempClass(int a) {
            this.a = a;
        }
    
        int a;
        void say(){
    
        }
    
    }
    
向上造型(多态)
  • 超类型的引用指向派生类的对象

    //有两种解释,1、父类类型指向子类对象2、子类对象造型为父类数据类型。规定,只允许向上造型,反之不行
    public class Test01 {
        int a;
        private  int b;
    }
    class TempClass extends Test01{
        public static void main(String[] args) {
            Test01 test01 = new TempClass();
        }
    }
    
  • 能访问的东西看引用的类型

public class Test01 {
    int a;
    void say(){}
}
class TempClass extends Test01{
    int b;
    void eat(){}
    public static void main(String[] args) {
        Test01 test01 = new Test01();
        TempClass temp = new TempClass();
        Test01 test02 = new TempClass();
        test01.a = 1;
        test01.say();
        /*test01.b;   父类对象只能访问父类的属性和方法
        test01.eat();*/

        temp.a = 1;
        temp.b = 1;
        temp.say();
        temp.eat();//子类对象既能访问父类,又能访问子类

        test02.a = 1;
        test02.say();
       /*test02.b;   能点出来什么,只看数据类型
        test02.eat();*/
        TempClass b01 = (TempClass) test02;
        b01.b = 1;
        b01.eat();//但可以强制转型来调用

    }
}

补充:

  1. 继承要符合is a(是)的关系
  2. 超类的意义:
    • 封装共同的属性和行为(代码复用)
    • 为所有派生类提供了一个统一的类型(向上造型),可以集中调用(引用类型数组)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值