Java中内部类(匿名内部类)相关知识

Java中匿名内部类的访问方式:
内部类可以直接访问外部类的所有成员,包含私有的成员。
而外部类要访问内部类中的成员,必须创建内部类的对象。

内部类什么时候创建呢?
当描述事物时,事物的内部还有事物,而这个内部的事物还要访问外部事物中的内容,就将这个内部的事物用内部类来描述。

内部类在成员位置上的访问方式。成员是可以被指定的修饰符所修饰的。
public
static
在非静态内部类不允许定义静态成员。仅允许在非静态内部类中定义static final 常量。如果想要在内部类中定义静态成员,只需将此内部类用static修饰即可。
内部类被static修饰,随着外部类的加载而加载,可以把一个静态内部类理解为一个外部类。

直接访问外部类中的内部类的非静态成员代码。调用时直接创建内部类对象就可以了,内部类作为成员,应该先有外部类对象,然后再有内部类对象。(前提是内部类被public修饰)
public class Outer {
private int age = 3;
class Inner{
public void show() {
System.out.println(age);
}
}
}
public class Show {
public static void main(String[] args) {
Inner in =new Outer().new Inner();//直接访问外部类中的非静态内部类格式
in.show();
}
}

对于静态内部类中的非静态成员进行调用。因为内部类是静态的,所以不需要创建Outer对象,直接创建Innter对象。
public class Outer {
private static int age = 3;
static class Inner{
public void show() {
System.out.println(age);
}
}
}
public class Show {
public static void main(String[] args) {
Outer.Inner in = new Outer.Inner();
in.show();
}
}
对于静态类中有静态成员该如何访问。既然静态内部类随着外部类的加载而加载,而且内部静态成员也随类的加载而加载。就不需要对象。直接用类名调用即可。
public class Outer {
private static int age = 3;
static class Inner{
public static void show() {
System.out.println(“这是静态内部类直接调用 age:”+age);
}
}

}
public class Show {
public static void main(String[] args) {
Outer.Inner.show();//外部类名.内部类名.方法名();
}
}

-------内部类访问外部类的原因-------------
public class Outer {
int num =3;
class Inner{
int num = 4;
public void show() {
int num = 5;
System.out.println(num);
System.out.println(this.num);
System.out.println(Outer.this .num);

	}
	
}

void method() {
Inner in = new Inner();
in.show();

}
}
public class Show {
public static void main(String[] args) {
Outer out = new Outer();
out.method();
}
}
输出结果输出结果
内部类直接访问外部类的原因是:
内部类中持有了外部类的引用, 外部类.this
注意:静态内部类中没有 外部类.this ,因为静态不可以被创建对象,类里面没有this或者super,它是直接使用外部类名。

----------------------局部内部类的特点---------------
内部类也可以定义在外部类的局部位置上。
内部类定义在局部位置上,只能访问被final修饰的局部变量。为啥呢?因为编译成功的class文件中直接操作那个最终的数值了。
public class Outer {
int num = 3;
void method(){
final int x= 5;
class Inner{
void show() {
System.out.println(x);
}
}
new Inner().show();
}
}
public class Show {
public static void main(String[] args) {
Outer out = new Outer();
out.method();
}
}

----------内部类的继承和实现-----------------------
API里面如何判断是否是内部类。
发现类名或者接口名称中有. 说明是内部类或者内部接口。
内部类因为是类中的类,所以类型都是 外部类.内部类名

内部类的延伸:
内部类是可以继承或者实现外部其他的类或者接口的。
好处:
通过内部类的方式对类进行继承重写,或者接口进行实现。
通过公共的方式去其内部类进行访问。因为通常内部类很可能被外部类封装在其中。(private修饰)
我们就可以通过父类或者接口的方式访问到内部类的对象。

-----------匿名内部类---------------------------
匿名内部类:其实就是一个带有内容的子类对象。
格式: new 父类or接口(){子类的内容}
匿名内部类就是内部类的简化形式。
注意:匿名内部类有前提,内容类必须要继承父类或者实现接口。
abstrcat class AbsDemo{
abstract void show();
}
class Outer{
int num = 3;
public void method(){
//不想创建具体的子类型。还想创建AbsDemo的子类对象。怎么实现呢?没有子类型干脆直接使用父类型。
可是在该例子中是抽象类,不可以new对象。抽象类之所以不能new对象是因为抽象方法没重写。只要重写了就好了。

new AbsDemo(){//这是AbsDemo类的子类对象,因为只有子类对象才可以复写。这是一个带着内容的子类对象。
//这种写法一个称呼:匿名内部类。
//重写这个抽象的show方法
void show(){
syso(num);
}
}.show();//创建对象然后直接调用show方法
}
}
main(){
Outer out = new Outer();
out.method();
}

发布了3 篇原创文章 · 获赞 1 · 访问量 503
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览