目录
外部类:
一个java文件里只能有一个public声明的类,而且类名必须和.java的文件名相同
如果想在这个类外面再创建一个类就在class类外部再写一个class 类名{}
public class Test01{}
class Test02{}
这样编译.java文件会生成两个独立的.class文件。
内部类:
顾名思义,就是在类里面建立的类:(在一个类内部进行其他类结构的嵌套操作)
public class Test{
//静态内部类
public static class A{}
//实例内部类
public class B{}
}
类的内部结构:
属性、方法、构造器、代码块、内部类
代码块:
代码块又称为初始化块,属于类的一个成员,它是将逻辑语句封装在方法体中。通过{}包裹。代码块没有方法名,没有参数,没有返回值,只有方法体它是不需要通过对象或类进行显示的调用,它会在类加载或者创建对象时主动的隐式调用
静态代码块:
一个类被加载时会被调用一次,做一些初始化的工作
实例代码块:
每次创建实例,都会被调用一次,用的很少
那有人就说了:没有方法名,没有返回值,咋用这个代码块里的内容啊?
演示:
public class Test01 {
static{
//静态代码块
System.out.println("静态代码块...");
}
{ //实例代码块
System.out.println("实例代码块...");
}
public static void main(String[] args) {
Test01 test01=new Test01();
Test01 test02=new Test01();
}
}
结果:
静态代码类只会实现一次,而实例代码类每次调用都会运行一次
那么问题就来啦,如果有一个类继承了父类,父类里有一个构造器,有一个实例块,有一个静态块
谁先执行?
先是静态代码块,后是实例代码块,再是构造器。
接着问题:在子类里也创建构造器,实例块,静态块,调用对象时,谁先执行?
先走父类的静态块,然后是子类的静态块,之后是父类的实例块,弗雷德构造器,子类的实例块,子类的构造器。
总结:
当没有继承关系时,就一个类:静态块---实例块---构造器
当有继承关系时,父类静态块---子类静态块---父类实例块---父类构造器---子类实例块---子类构造器
static静态
属性,方法,代码块
用static修饰的结构,不属于任何一个对象
static的内存解析:
1.静态的变量或者静态方法存在于方法区的。静态的结构不会被垃圾回收
2.不属于某一个实例对象,只存在于方法去。调用静态结构,直接用类名
实例方法和静态方法的互相调用:
1.静态方法中不可以直接调用实例方法,如果想用,必须:对象方法.方法名:
eg:new Test03().show();
2.实例方法中可以直接调用静态方法吗?可以哦
静态的结构的加载,随着类的加载而加载!!!
非静态的结构,随着对象的创建而加载!!!
静态方法无论在哪里都是类名.方法调用.
public class Test03 {
static String name="里奥·梅西";
public static void show(){
//静态方法
System.out.println("静态方法...");
}
public static void main(String[] args) {
System.out.println(Test03.name);
Test03.show();
}
}