不是的,只需在加载内部类的时分才初始化 //有问题能够持续沟通
楼主只需看懂一下的代码
那么关于类的加载
基本上就没问题了
最终类的加载进程的解说
public class Test6 {
public static void main(String[] args){
new B();
new A.C();
}
}
class A{
private P p1 = new P("A--p1");
static P p3 = new P("A--p3");
public A(){
System.out.println("A()");
}
private P p2 =new P("A--p2");
static{
new P("A--static");
}
{new P("A{...}");}
public static class C {
private P p1 = new P("C--p1");
static P p3 = new P("C--p3");
public C(){
System.out.println("C()");
}
private P p2 =new P("C--p2");
static{
new P("C--static");
}
{new P("C{...}");}
}
}
class B extends A {
private P p1 = new P("B --p1");
static P p3 = new P("B -- p3");
public B() {
System.out.println("B()");
}
public P p2 = new P("B -- p2");
static {
new P("B -- static");
}
{new P("B{...}");}
}
class P {
public P(String s) {
System.out.println(s);
}
}
/*
有父类的状况
1. 加载父类
1.1 为静态特点分配存储空间并赋初始值
1.2 履行静态初始化块和静态初始化句子(从上至下)
2. 加载子类
2.1 为静态特点分配存储空间
2.2 履行静态初始化块和静态初始化句子(从上至下)
3. 加载父类结构器
3.1 为实例特点分配存数空间并赋初始值
3.2 履行实例初始化块和实例初始化句子
3.3 履行结构器内容
4. 加载子类结构器
4.1 为实例特点分配存数空间并赋初始值
4.2 履行实例初始化块和实例初始化句子
4.3 履行结构器内容
5 回到main()
内部类的加载进程也相同
*/1.运用接口创立出来的而非运用类完成接口出来的就是匿名类了。
因为接口是无法new的,而运用接口new目标实践是就是发生了一个没有进行命名的类,而这品种就叫做匿名类了。
interface Abc{
public void fn();
}
class Test{
void fn(){
//这儿的new Abc()就是一个匿名类,由接口直接发生,而未经过class XXX implements Abc得到
new Abc(){
public void fn(){}
}
}
}
2.不太清楚你问的东西大约什么意思?说一下我的理解
一个类界说结束,假如JAVA虚拟机加载了这个类,那么它会将所有的static润饰的成员(变量和办法)加载入栈内存,这一部分内存只需一种时分才会被开释,就是JVM退出的时分。
假如运用该类界说了一个目标,也就是new出来的东西,那么会在堆内存中创立一块内存地址,用于寄存这个目标,当该目标被开释掉时(JVM不退出,仅仅是回收了这一块内存),被占用内存将清空。
至于内部类的问题,自己以为内部类实践上就是在一个类中界说了一种新的数据类型,当这种数据类型没有被运用时,JVM不会加载它,换句话说,内部类也是一品种,不运用就不加载,只不过它的格局特殊一些而已,单从JAVA编译后的形状来看,内部类独立成一个.class文件,只不过类名是:外部类名$内部类名.class。所以内部类操作时和一般类是相同的,彻底满足一般类的各种加载开释原理。
引证LZ的原话“办法的局部变量坐落栈上”这句话我不能苟同,自己以为局部变量是在堆内存中的。