java中的静态内部类的特点是什么?

Python015

java中的静态内部类的特点是什么?,第1张

需要了解2个概念:内部类静态修饰符static1)首先,用内部类是因为内部类与所在外部类有一定的关系,往往只有该外部类调用此内部类。所以没有必要专门用一个Java文件存放这个类。2)静态都是用来修饰类的内部成员的。比如静态方法,静态成员变量,静态常量。

它唯一的作用就是随着类的加载(而不是随着对象的产生)而产生,以致可以用类名+静态成员名直接获得。这样静态内部类就可以理解了,因为这个类没有必要单独存放一个文件,它一般来说只被所在外部类使用。

并且它可以直接被用 外部类名+内部类名 获得。以下举例说明怎么使用:Student类有个叫School的内部类(非静态)Student stu = new Student()stu.School sch = new stu.School()sch就是School的一个对象。假如School是内部静态类:Student.School sch = new Student.School()。

只有在加载内部类的时候才初始化

看懂以下的代码,那么对于类的加载,基本上就没问题了,最后类的加载过程的解释

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()

内部类的加载过程也一样

Java中加载器的种类大致可以分为四种:Bootstrap ClassLoader(由C++语言写成),系统加载器(也就是内部类AppClassLoader),ExtClassLoader,以及java.net.UrlClassLoader.

当我们运行一个程序时,首先是找到JDK安装目下的jvm.dll来启动JAVA虚拟机,而后Bootstrap ClassLoader产生,接下来就是Bootstrap ClassLoader来加载ExtClassLoader,并且指定ExtClassLoader的父加载器为Bootstrap ClassLoader,但是因为Bootstrap ClassLoader用C++语言写的,所以用JAVA的观点来看,这个加载器的实例是不存在的,所以ExtClassLoader的父加载器被设置为了null,然后就是Bootstrap ClassLoader将AppClassLoader装载,并指定其父加载器为ExtClassLoader。

JAVA是按照加载器的委派模型来实现的。这种模型是JAVA安全性机制的保证。并且值得我们注意的就是这几个加载器的默认加载类的路径。对于AppCLassLoder来说,它的路径也就是我们的classpath里面的路径。而对于ExtClassLoader来说,它的路径是jre\lib\ext\classes.对于URLClassLoader来说,它的加载路径是我们指定的url。