zoukankan      html  css  js  c++  java
  • Java面向对象之继承

    Java 中的继承规则:

    1.子类继承父类所有的成员变量和成员方法,但是不能继承父类的构造方法。

    2.子类虽然继承了父类的成员变量,但是子类不能直接访问父类的私有变量,可以通过getter/setter()方法进行访问

    3.子类对父类构造函数的调用规则:

    a.子类的构造方法首先必须调用父类的构造方法。

    b.如果没有显示指定,子类的构造方法会默认的调用父类中的无参构造方法,

     1 public class Animal {
     2     public Animal() {
     3         System.out.println("This is a constructor for Animal");
     4     }
     5 }
     6 
     7 public class Dog extends Animal {
     8     private String name;
     9     
    10     public Dog() {
    11         System.out.println("This is a constructor for Dog");
    12     }
    13     
    14     public Dog(String name) {
    15         this.name = name;
    16         System.out.println("This is a constructor for "+this.name);
    17     }
    18 }
    19 
    20 public class Test {
    21     public static void main(String args[]) {
    22         Dog d1 = new Dog();
    23         
    24         Dog d2 = new Dog("Big Yellow");
    25     }
    26 }

    最后运行结果如图所示:

                           

    表明子类虽然没有显示的调用父类构造方法,但是会默认调用父类的无参构造方法。

    c.如果父类中没有无参的构造方法,则编译会出错。对以上程序稍作修改:

    public class Animal {
        public Animal(String s) {
            System.out.println("This is a constructor for Animal");
        }
    }
    
    public class Dog extends Animal {
        private String name;
        
        public Dog() {
            System.out.println("This is a constructor for Dog");
        }
        
        public Dog(String name) {
            this.name = name;
            System.out.println("This is a constructor for "+this.name);
        }
    }

    把父类Animal中的无参构造方法改成有参数的构造方法,则出错。

    d.如果父类中有多个构造方法,可以使用super(参数列表)来调用父类构造方法。

    例如把以上子类中的构造方法显式的添加为父类有参构造方法,则程序编译通过。

    public class Animal {
        public Animal(String s) {
            System.out.println("This is a constructor for Animal");
        }
    }
    
    public class Dog extends Animal {
        private String name;
        
        public Dog() {
            super("aaa");
            System.out.println("This is a constructor for Dog");
        }
        
        public Dog(String name) {
            super("bbb");
            this.name = name;
            System.out.println("This is a constructor for "+this.name);
        }
    }
    View Code

    总之,无论如何,子类都首先必须调用父类的构造方法,切记~~

  • 相关阅读:
    pip安装指定版本的package
    学习 git基础命令
    美剧命名规则
    Mac OS X中bogon的处理
    学习Maven之Maven Clean Plugin
    学习Maven之Cobertura Maven Plugin
    博客园markdown代码块支持的语言
    学习Maven之Maven Surefire Plugin(JUnit篇)
    C# Invoke或者BeginInvoke的使用
    LINQ to SQL语句(20)之存储过程
  • 原文地址:https://www.cnblogs.com/beyond-Acm/p/4077320.html
Copyright © 2011-2022 走看看