美文网首页
一起巩固Java基础知识(2)

一起巩固Java基础知识(2)

作者: 付凯强 | 来源:发表于2020-10-15 16:14 被阅读0次

    序言

    本文内容包括

    • 成员内部类、静态内部类的介绍和创建
    • 类中成员加载顺序

    成员内部类、静态内部类的介绍和创建

    • 成员内部类
      在类内部定义的非静态内部类,我们称之为成员内部类。
    public class A {
        class InterA {
            public InterA() {
                System.out.println("I am interA");
            }
        }
    }
    

    成员内部类的使用必须在外部类初始化之后才能使用。所以我们看下它如何才能被创建:

    public class Main {
        public static void main(String[] args) {
            InterA interA = new A().new InterA();
        }
    }
    
    I am interA
    
    • 静态内部类duixiang
      在类内部定义的静态的内部类,我们称之为静态内部类。
    public class A {
        static class StaticInterB{
            public StaticInterB() {
                System.out.println("I am staticInterB");
            }
        }
    }
    

    静态内部类把它当做外部类对待即可,所以我们看下它如何才能被创建:

    public class Main {
        public static void main(String[] args) {
            A.StaticInterB interA = new A.StaticInterB();
        }
    }
    

    类中成员加载顺序

    • 无继承关系时
    class Parent {
        public static final String STATIC_FIELD = printParent("父类_静态变量");
    
        public String Member_Field = printParent("父类_成员变量");
    
        static {
            printParent("父类_静态代码块");
        }
    
        {
            printParent("父类_普通代码块");
        }
    
        public Parent() {
            printParent("父类_构造方法");
        }
    
        public static String printParent(String str){
            System.out.println(str);
            return str;
        }
    }
    
        public static void main(String[] args) {
            new Parent();
        }
    
    父类_静态变量
    父类_静态代码块
    父类_成员变量
    父类_普通代码块
    父类_构造方法
    

    一个类初始化的时候,先加载静态成员(按顺序),再加载非静态成员(按顺序),再加载构造方法。

    • 有继承关系时
    public class Son extends Parent {
        public static final String STATIC_FIELD = printSon("子类_静态变量");
    
        public String Member_Field = printSon("子类_成员变量");
    
        static {
            printSon("子类_静态代码块");
        }
    
        {
            printSon("子类_普通代码块");
        }
    
        public Son() {
            printSon("子类_构造方法");
        }
    
        public static String printSon(String str){
            System.out.println(str);
            return str;
        }
    
    }
    
        public static void main(String[] args) {
            new Son();
        }
    
    父类_静态变量
    父类_静态代码块
    子类_静态变量
    子类_静态代码块
    父类_成员变量
    父类_普通代码块
    父类_构造方法
    子类_成员变量
    子类_普通代码块
    子类_构造方法
    

    一个类初始化的时候,如果有父类存在,先加载父类静态成员(按顺序),再加载子类静态成员(按顺序),再加载父类非静态成员(按顺序),再加载父类构造方法,再加载子类非静态成员(按顺序),再加载子类构造方法。

    • 静态成员已加载
        public static void main(String[] args) {
            new Parent();
            System.out.println("--------------------------------");
            new Son();
        }
    
    父类_静态变量
    父类_静态代码块
    父类_成员变量
    父类_普通代码块
    父类_构造方法
    --------------------------------
    子类_静态变量
    子类_静态代码块
    父类_成员变量
    父类_普通代码块
    父类_构造方法
    子类_成员变量
    子类_普通代码块
    子类_构造方法
    

    静态成员只会加载一次。

    • 父类无参和有参构造方法都存在
    class Parent {
        public static final String STATIC_FIELD = printParent("父类_静态变量");
    
        public String Member_Field = printParent("父类_成员变量");
    
        static {
            printParent("父类_静态代码块");
        }
    
        {
            printParent("父类_普通代码块");
        }
    
        public Parent() {
            printParent("父类_无参构造方法");
        }
    
        public Parent(String parent) {
            printParent("父类_有参构造方法");
        }
    
        public static String printParent(String str){
            System.out.println(str);
            return str;
        }
    }
    
    public class Son extends Parent {
        public static final String STATIC_FIELD = printSon("子类_静态变量");
    
        public String Member_Field = printSon("子类_成员变量");
    
        static {
            printSon("子类_静态代码块");
        }
    
        {
            printSon("子类_普通代码块");
        }
    
        public Son() {
            printSon("子类_构造方法");
        }
    
        public Son(String son) {
            printSon("子类_有参构造方法");
        }
    
        public static String printSon(String str){
            System.out.println(str);
            return str;
        }
    
    }
    
        public static void main(String[] args) {
            new Son("Hello World");
        }
    
    父类_静态变量
    父类_静态代码块
    子类_静态变量
    子类_静态代码块
    父类_成员变量
    父类_普通代码块
    父类_无参构造方法
    子类_成员变量
    子类_普通代码块
    子类_有参构造方法
    

    如果没有指定要调用父类无参还是有参构造方法,默认会调用无参构造方法。

    后续

    如果大家喜欢这篇文章,欢迎点赞;
    如果想看更多Java方面的技术知识,欢迎关注!

    相关文章

      网友评论

          本文标题:一起巩固Java基础知识(2)

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