当前位置: 主页 > JAVA语言

java匿名内部类详解-java 类加载详解

发布时间:2023-02-09 10:47   浏览次数:次   作者:佚名

众所周知,外部顶级类的类名需要和类文件名相同,只能使用public和default。 内部类是指在外部类内部定义另一个类,类名不需要和文件名相同。 内部类可以是静态的,也可以修改为public、default(包限制)、protected和private。

内部类:

概念:

我们所说的内部类,官方称之为嵌套类(Nested Classes)。 嵌套类包括静态内部类(Static Nested Classes)和内部类(Inner Classes)。 内部类分为成员内部类、局部内部类(Local Classes)和匿名内部类(Anonymous Classes)。

f0fdea957792

图片.png

内部类是编译的一个概念。 一旦编译成功,就会变成两个完全不同的类,分别是outer.class和outer$inner.class。 所以内部类的成员变量/方法名可以和外部类的一样。

内部类是做什么的?

1.内部类可以很好的隐藏

一般非内部类不允许有private和protected权限,但是内部类可以

2.内部类可以访问外部类的所有元素(私有修饰也可以访问)

3.但要实现多重继承(让多个内部类继承多个其他类,使外部类可以同时获取多个其他类的属性)

4、可以避免修改接口,实现同一个类中两个同名方法的调用。 (外部类继承java匿名内部类详解,让内部类实现接口)

静态内部类:

形状像:

公共类外部类{

私有字符串名称;

java 类加载详解_java匿名内部类的使用_java匿名内部类详解

静态类 StaticInerCls{

私有字符串名称;

}

}

静态内部类除了比外部类多了访问修饰符外,与外部类没有区别,只不过静态内部类在代码中组织在外部类中。

创建一个静态内部类:以Class.Iner的形式

OuterClass.StaticInerCls staticInerCls = new OuterClass.StaticInerCls();

非静态内部类:

非静态内部类可以访问外部类的所有成员,包括私有成员。 外部类虽然不能直接访问内部类的成员java匿名内部类详解,但是可以通过内部类的实例访问内部类的私有成员。

成员内部类:

形状像:

公共类 OuterCls {

私有字符串名称;

公共字符串 getName(){

返回名称;

}

类 InerCls{

java 类加载详解_java匿名内部类的使用_java匿名内部类详解

私有字符串名称;

公共字符串 getName(){

返回名称;

}

}

}

成员内部类可以直接使用外部类的所有成员和方法,即使是private修饰的。 外部类要访问内部类的所有成员变量和方法,需要通过内部类的对象来获取。 (谁说是真儿子?) 需要注意的是,成员内部类不能包含静态变量和方法。 因为成员内部类需要创建外部类才能创建自己的。

创建一个内部类对象方法,形式为object.new Iner:

OuterCls outerCls = new OuterCls();

外部Cls。 InerCls inerCls = outerCls。 新的 InerCls();

成员内部类不能有static修饰的成员,但允许定义常量。

公共类外部类{

私有字符串名称;

静态类 StaticInerCls{

私有字符串名称;

}

类 InerCls{

java匿名内部类详解_java匿名内部类的使用_java 类加载详解

私有字符串名称;

私有静态 int id; //不允许,会报错

private static final int TYPE = 0; //允许

}

}

局部内部类:

意思是内部类定义在方法体中,只能在方法或条件的范围内使用,退出写入范围后不能再引用。

公共类 OuterCls {

私有字符串名称;

公共字符串 getName(){

返回名称;

}

公共无效 getInerCls(){

类 InerCls{

私有字符串名称;

公共字符串 getName(){

返回名称;

java匿名内部类的使用_java匿名内部类详解_java 类加载详解

}

}

}

}

作为非静态内部类的一种特殊形式,非静态内部类的所有限制同样适用于局部类。 局部类不仅可以访问外部类的所有成员,还可以访问方法体的局部变量,但必须是final修饰的局部变量。

为什么局部类访问局部变量,变量必须finalize?

场景:

public static void main(String[] args){

外层=新外层();

对象 obj = out. 方法();

}

对象方法(){

本地变量 = 0;

类内{

void println(){

System.out.println("本地变量" + 本地变量);

}

java匿名内部类详解_java匿名内部类的使用_java 类加载详解

}

对象 in = new Inner();

返回;

}

}

这里的localVariable会变成红色,说明最后的修改需要添加到localVariable变量中。

分析:这是范围的问题。 method方法执行后局部变量值失效,new Inner()生成的in对象仍然有obj的引用,所以对象访问了一个不存在的变量,这是不允许的。 iner仍然存在,当外部和后续调用局部变量时,这个局部变量可能已经失效。 但是为什么加final就可以保证访问呢? 在这里,Java采用了一种复制局部变量的方法。 定义为 final 的变量将被复制并存储在本地内部类中。 后续使用会在生命周期内继续维护这个对象,所以可以继续访问。

注意:final可以修饰的范围包括类、方法和属性。 修饰类,不可继承; 修改后的方法,不能被子类覆盖; modified 变量,其值不能被修改。

匿名内部类:

为了避免必须命名内部类,或者只想使用一次,可以选择使用匿名内部类。

公共无效倒计时(){

新线程(){

@覆盖

公共无效运行(){

}

}。开始();

}