按照是否有static修饰分为静态内部类和非静态内部类,有static修饰的为静态内部类,没有static修饰的为非静态内部类。
非静态内部类:
package pro1;
public class Body {
class Heart{
int age;
void work() {
System.out.println("正在睡觉");
}
public void getHeart() {
Heart heart=(this.)new Heart();//非静态方法调用直接创建在类中的非静态内部类,创建对象的时候必须先创建外部类对象,但是有默认this
}
public static void getHeart(int a) {
Heart heart=new Body().new Heart();//静态类方法调用直接创建在类中的非静态内部类,在静态方法中创建对象,必须显式创建外部类对象
}
静态内部类:
package pro1;
public class Body {
static class Heart{
int age;
void work() {
System.out.println("正在睡觉");
}
public void getHeart() {
Heart heart=new Heart();//调用静态类可以直接创建对象调用
}
public static void getHeart(int a) {
Heart heart=new Heart();//静态方法调用静态类可以直接调用
}
}
}
静态匿名内部类
class Father{
public void eat() {
System.out.println("筷子吃饭....");
}
}
/*外部类*/
public class OutClass {
/*静态匿名内部类*/
static Father son = new Father(){
@Override
public void eat() {
System.out.println("筷子吃饭....");
}
};
}
注意:如果为static内部类只能直接定义在外部类中。
public class OutClass {
public static void main(String[] args) {
static class InClass {//静态内部类
public void printInfo() {
System.out.println("我是有名内部类");
}
}
}
静态内部类仅能直接访问外部类的静态成员变量和方法,可以通过创建外部类的对象间接使用非静态的成员变量和方法。
public class OutClass {
private double weight=72;
public static void print(String name) {
System.out.println(name);
}
static class InClass{
{
double weight = new OutClass().weight;//由于weight是非静态的,所以在静态内部类中使用时必须先创建外部类对象
print("Tom");//由于print方法为静态方法,所以可以直接使用。
}
在非外部类中定义的内部类和局部变量一样,其使用范围从定义的位置开始到其所在直接语句块结束。
public class OutClass {
public static void main(String[] args) {
if(args!=null) {
class InClass{
}
}
InClass inClass = new InClass();//无法创建对象,因为内部类作用范围无法作用到这里
}
}
Run as ——>执行“一次”java命令——>类加载一次——>静态的成员(成员变量、代码块、方法)只被操作操作一次,因为初次类加载的时候只加载代码块,如果有static修饰则只存在内存中,不会进行加载
public static void main(String[] args) {
//public int age=12;
static int age=12;//局部变量不能有static修饰
}
静态成员变量可以"直接"在非晶态方法或代码块中使用,为什么?
静态的在类加载的时候处理:静态变量直接赋值 静态方法直接分配地址 静态代码块直接执行;非静态的只能在创建对象时执行操作:变量
JVM对静态的操作比非晶态的靠前
只有有名静态内部类中才允许有静态成员(静态属性、静态代码块和静态方法)。