zoukankan      html  css  js  c++  java
  • Java 继承 执行顺序

    代码:

    package com.company;
    
     
    public class Main {
        public static void main(String[] args) {
            new MyClass();
        }
    }
    
     class Test {
        Person person = new Person("Test");
        static{
            System.out.println("test static");
        }
    
        public Test() {
            System.out.println("test constructor");
        }
    }
    
    class Person{
        static{
            System.out.println("person static");
        }
        public Person(String str) {
            System.out.println("person "+str);
        }
    }
    
    
    class MyClass extends Test {
        Person person = new Person("MyClass");
        static{
            System.out.println("myclass static");
        }
    
        public MyClass() {
            System.out.println("myclass constructor");
        }
    }

    结果:

    test static
    myclass static
    person static
    person Test
    test constructor
    person MyClass
    myclass constructor

     ========================================================

    默认构造函数与有参数构造函数

    代码:

    public class Main {
        public static void main(String[] args) {
            new Child("mike");
        }
    
    }
    class People {
        String name;
    
        public People() {
            System.out.print(1);
        }
    
        public People(String name) {
            System.out.print(2);
            this.name = name;
        }
    }
    
    class Child extends People {
        People father;
    
        public Child(String name) {
            //super(name);
            System.out.print(3);
            this.name = name;
            father = new People(name + ":F");
        }
    
        public Child() {
            System.out.print(4);
        }
    }

    结果:

    132
    View Code

    考察的又是父类与子类的构造函数调用次序。在Java中,子类的构造过程中必须调用其父类的构造函数,是因为有继承关系存在时,子类要把父类的内容继承下来。但如果父类有多个构造函数时,该如何选择调用呢?

    第一个规则:子类的构造过程中,必须调用其父类的构造方法。一个类,如果我们不写构造方法,那么编译器会帮我们加上一个默认的构造方法(就是没有参数的构造方法),但是如果你自己写了构造方法,那么编译器就不会给你添加了,所以有时候当你new一个子类对象的时候,肯定调用了子类的构造方法,但是如果在子类构造方法中我们并没有显示的调用基类的构造方法,如:super();  这样就会调用父类没有参数的构造方法。    

    第二个规则:如果子类的构造方法中既没有显示的调用基类构造方法,而基类中又没有无参的构造方法,则编译出错,所以,通常我们需要显示的:super(参数列表),来调用父类有参数的构造函数,此时无参的构造函数就不会被调用。

    总之,一句话:子类没有显示调用父类构造函数,不管子类构造函数是否带参数都默认调用父类无参的构造函数,若父类没有则编译出错。

    如果取消注释中的代码,那么结果就是232

    ==========================================================================================

     代码:

    public class Main {
        public static void main(String[] args) {
            new Dervied();
        }
    
    }
     class Dervied extends Base {
    
        private String name = "dervied";
        public Dervied() {
            tellName();
            printName();
        }
        public void tellName() {
            System.out.println("Dervied tell name: " + name);
        }
        public void printName() {
            System.out.println("Dervied print name: " + name);
        }
    }
    
    class Base {
        private String name = "base";
        public Base() {
            tellName();
            printName();
        }
        public void tellName() {
            System.out.println("Base tell name: " + name);
        }
        public void printName() {
            System.out.println("Base print name: " + name);
        }
    }

    结果:

    Dervied tell name: null
    Dervied print name: null
    Dervied tell name: dervied
    Dervied print name: dervied
    View Code

    原因:

    1、首先private是不会继承到新的对象里,所以不会出现“base”。
    2、由于重写的缘故,在执行super的构造函数是,还是调用的子类方法,此时成员变量未初始化。

    https://www.cnblogs.com/sylz/p/5758990.html

  • 相关阅读:
    CGI与FastCGI
    Google Protocol Buffer 的使用和原理
    AMQP协议
    Java 多线程 并发编程
    深入理解HashMap
    Bitmap 位图
    Bloom Filter概念和原理
    BloomFilter–大规模数据处理利器
    java bitmap/bitvector的分析和应用
    Linux iptables 备忘
  • 原文地址:https://www.cnblogs.com/hongdada/p/5826125.html
Copyright © 2011-2022 走看看