照是否有static修饰分为静态内部类和非静态内部类,有static修饰的为静态内部类,没有static修饰的为非静态内部类,非静态内部类前面已经讲过,这里不再赘述。
静态有名内部类
Body类:
package com.jd;
/**
* 外部类
*/
public class Body {
/**
* 静态有名内部类
*/
public static class Heart{
public void beat(){
System.out.println("正在跳动...");
}
}
}
Test类:
package com.jd;
import com.jd.Body.Heart;
public class Test {
public static void main(String[] args) {
Heart heart = new Body.Heart();
heart.beat();
}
}
跨类使用则须“外部类类名.内部类名”
本类使用则无须使用外部类类名
静态成员变量可以"直接"在非静态方法或代码块中使用,为什么?
静态的在类加载的时候处理:静态变量直接赋值 静态方法直接分配地址 静态代码块直接执行;非静态的只能在创建对象时执行操作:变量
JVM对静态的操作比非静态的靠前
流程为run as ——>执行“一次”java命令——>类加载一次——>静态的成员(成员变量、代码块、方法)只被操作操作一次
以下是我对上面这段话的个人理解——
对于整个程序来讲,对于静态的方法、代码块、类等等是最先载入内存之中的,非静态的方法与代码块是最后载入的,这样就会出现一种情况——
一旦非静态代码块、类、方法之中定义了静态的方法或者变量,会报错,因为最开始载入静态相关内容的时候根本无法深入非静态的区域里面,这些非静态区域里面的静态有关内容也就失去了意义,会发生错误。
而静态代码块、类、方法等等之中如果引用了非静态的方法,则要先创建外部的对象,然后再用对象调用方法或者变量,这样的话在加载的时候也会把外部的对象加载进去,如图——
由于weight是非静态的,所以在静态内部类中使用时必须先创建外部类对象
由于print方法为静态方法,所以可以直接使用。
在非外部类中定义的内部类和局部变量一样,其使用范围从定义的位置开始到其所在直接语句块结束。
图中圈圈的代码出错,因为内部类作用范围无法作用到这里。
Ø只有有名静态内部类中才允许有静态成员(静态属性、静态代码块和静态方法)。