序言
本文内容包括
- 成员内部类、静态内部类的介绍和创建
- 类中成员加载顺序
成员内部类、静态内部类的介绍和创建
- 成员内部类
在类内部定义的非静态内部类,我们称之为成员内部类。
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方面的技术知识,欢迎关注!
网友评论