内部类,故名思议,定义在一个类中的另一类。
面向对象程序设计中,可以在一个类的内部定义另一个类。嵌套类分为两种,即静态嵌套类和非静态嵌套类。
静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为内部类(inner)。
一定义内部类
class Outer{
int x=3;
class Inner{ //内部类
int x=4
void function(){
int x=6
System.out.println("内部类方法调用x的值"+x);
}
}
void method(){
System.out.println("外部类方法");
}
}
二内部类访问规则
1. 内部类可以直接访问外部类的成员,不需要再实例化外部类,包括私有
2. 外部类要访问内部类必须要建立内部类对象(私有内部类也可以通过new来实例化,
它就相当于外部类的一个成员变量)
例如:Outer.Inner in=new Outer().new Inner();
3.内部类方法中调用x的值结果:
x=6
this.x=4
Outer.this.x=3
内部类之所以直接访问外部类的成员,是因为内部类中持有了外部类的引用,格式:外部类名.this
静态内部类
1.当内部类被static修饰时就具备了static特性,只能访问外部类的static成员变量
原因:在类的加载过程中会先初始化静态变量,非静态变量要根据随着对象的产生而初始化,
所以,静态变量只能访问静态变量。此时非静态变量还未分配内存空间,不能进行访问。
(静态变量属于类变量,随着类的加载而加载,随着类的消失而消失,实例变量属于成员变量,
只有产生了对象,才会初始化成员变量,它随着对象的产生而产生,随着对象的消失而消失)
2.当内部类中定义了静态成员,该内部类必须是static(内部类方法如果是static,则该内部类必须是static)
匿名内部类
原则:必须继承或者实现一个其他父类或接口
其实是内部类的简写格式,只是没有具体的名字,没有办法通过声明类名的方式进行实例化,所以在定义匿名内部类的时候,
就必须把父类的方法或者接口的方法进行重写或实现。也可用在方法的参数当中
//抽象类
abstract AbsDemo{
void show();
}
class Outer{
int x=3;
public void function(){
new AbsDemo(){
void show(){
System.out.println("x===="+x);
}
}.show(); //重写完方法后,再进行调用
}
}
以上是关于java内部类的相关知识点,主要从普通内部类,静态内部类和匿名内部类三个部分进行总结。