zoukankan      html  css  js  c++  java
  • java继承

    继承是面向对象的最显著的一个特征。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。

    1.super、this 关键字


     

    super代表父类的存储空间标识。(可以理解为父亲的引用,但不是引用)。

    this,代表对象的引用(谁调用就代表谁)

     

    1.1 成员变量

    this.变量          ----        本类的

    super.变量       ----        父类的

     

    1.2 成员方法

    this.方法名       ----        本类的

    super.方法名    ----        父类的

     

    1.3 构造方法

    this(…)           ----         本类的构造方法(可以实现在本类中调用构造方法)

    super(…)        ----          父类的

    都必须在构造方法的第一行。

    class Car {
        private String name;
        Car(String name) {
            this();                     //--在本类中调用自己的构造方法
             this.name = name;
        }
        private Car() {
            System.out.println("Car name:" + this.name);
        }
    
    }
    
    public class TestClass {
        public static void main(String[] args) {
            Car car = new Car("Volvo");
        }
    }output:
    Car name:null

    2.初始化顺序:

    http://www.cnblogs.com/maying3010/p/5866128.html

     

     

    3.构造函数、方法调用


    3.1 当子类继承父类时,需要调用父类的构造函数。主要三种情况:

       (1). 父类没有构造函数或者有一个无参构造函数时,子类可以不用显示的调用父类的构造函数,系统会自动的调用。

       (2). 父类只有有参构造函数,则必须在子类的构造函数中调用父类的构造函数(使用super关键字)。

       (3). 父类既有无参构造函数又有有参构造函数,子类则可调用可不调用。

     

    3.2 方法调用 :

       (1). 使用super关键字调用父类的方法。

    class Car {
        private String str;
        Car(String str) {
            this.str = str;
            System.out.println("This is Car");
        }
        @Override
        public String toString() {
            return str;
        }
    }
    class Volvo extends Car {
        Volvo(String str) {
            super(str);                             //--调用父类的构造函数
            System.out.println("This is Volvo");
        }
    
        public void sayStr() {
            System.out.println(super.toString());    //--方法调用
        }
    }
    
    public class TestClass {
        public static void main(String[] args) {
            Volvo volvo = new Volvo("Volvo");
            System.out.println(volvo.toString());
        }
    }output:
    This is Car
    This is Volvo
    Volvo

     

    4.成员变量、方法的覆盖


     

    4.1 成员变量的覆盖

       (1). 当子类覆盖父类的成员变量时,父类方法使用父类的成员变量,子类方法使用子类的成员变量。

        这个听起来很容易理解的一回事,但是实际使用过程中很多人容易搞混:尤其是在多态的时候,调用一个被继承的方法,该方法访问是一个被覆盖的成员m,那么方法中到底是访问了父类的成员还是子类的成员m?结论是,若实际调用的是父类的方法,就使用了父类的该成员m,若实际调用的是子类的方法,就使用子类的成员m,记住一句,每个类使用成员都相当于在前面加了 一个this指针。

     

    4.2 成员方法的覆盖

       (1). 方法的返回类型可以是父类也可以是父类的子类(协变类型)

    class Car {
        private String str;
        Car(String str) {
            this.str = str;
            System.out.println("This is Car");
        }
        public Car getCar(){
            return new Car("Car");
        }
    }
    class Volvo extends Car {
        Volvo(String str) {
            super(str);
            System.out.println("This is Volvo");
        }
        @Override
        public Volvo getCar() {             //--协变类型
            return new Volvo("Volvo");
        }
    }
    public class TestClass {
        public static void main(String[] args) {
            Volvo volvo = new Volvo("Volvo");
            volvo.getCar();
        }
    }output:
    This is Car
    This is Volvo
    This is Car
    This is Volvo

     

    class SubClass1 extends SuperClass {
        SubClass1(int number) {
            super(number);
        }
    }
    class SubClass2 extends SuperClass {
        private int number;
        SubClass2(int number) {
            super(number);
        }
    }
    public class SubClass extends SuperClass {
        private int number;
        SubClass(int number) {
            super(number);
        }
        public int getNumber() {
            number++;
            return number;
        }
        public static void main(String[] args) {
            SuperClass s = new SubClass(20);
            SuperClass s1 = new SubClass1(20);
            SuperClass s2 = new SubClass2(20);
            System.out.println(s.getNumber());
            System.out.println(s1.getNumber());
            System.out.println(s2.getNumber());
            //结论一:多态时,当子类覆盖了父类的方法,使用子类覆盖的方法
            //结论二:当子类覆盖父类的成员变量时,父类方法使用的是父类的成员变量,子类方法使用的是子类的成员变量
        }
    }output:
    1
    21
    21

     

    5.question


    《thinking in java》上的一个例子,它上面有一些解释。但是自己没有完全理解。感觉要看jvm后才能完全明白,先立个flag在这吧

    class Car {
        Car() {
            run();
        }
        void run() {}
    }
    class Volvo extends Car {
        private int count;
        Volvo(int count) {
            this.count = count;
            run();
        }
        @Override
        void run() {
            System.out.println("Count:" + count);
        }
    }
    public class TestClass {
        public static void main(String[] args) {
            Volvo volvo = new Volvo(1);
        }
    }output:
    0
    1

    6.reference


    http://blog.csdn.net/stonecao/article/details/6317353

  • 相关阅读:
    Lesson 61-62 Are Relatives Important to You?
    Lesson 59-60 Househusband
    Lesson 57-58 Cosmetic Surgery
    Lesson 55-56 TV Commercials
    Blash
    高维宇宙
    巴卡尔
    完美标号
    小A点菜(luogu 1164)简单DP
    聪明的质监员(qc)
  • 原文地址:https://www.cnblogs.com/maying3010/p/5939942.html
Copyright © 2011-2022 走看看