区分 概念:
按照是否有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();
}
}
中的
Heart heart = new Body.Heart();
heart.beat();
静态内部类仅能直接访问外部类的静态成员变量和方法,
可以通过创建外部类的对象间接使用非静态的成员变量和方法。
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();
//无法创建对象,因为内部类作用范围无法作用到这里
}
}
只有有名静态内部类中才允许有静态成员(静态属性、静态代码块和静态方法)。
静态匿名内部类
只需在匿名内部类前面加上static即可。
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("我是有名内部类");
}
}
}
}
非静态内部类
直接在类中定义的非静态内部类,在静态方法中创建对象,必须“显式”创建外部类对象