java 内部类 访问_Java内部类的访问规则

1.内部类可以直接访问外部类中的成员,包括私有

原因:因为在内部类中持有一个外部类的应用,格式:外部类.this

class Outer {

private int x = 1;

class Inner {

int x = 2;

public void seeOuter() {

int x = 3;

System.out.println(x);

System.out.println(this.x);

System.out.println(Outer.this.x);

}

}

}

2.外部类要访问内部类,必须建立内部类对象

A.从外部类的非静态方法中访问内部类

class Outer {

private int x = 1;

public void seeInner() {

Inner in = new Inner();

in.seeOuter();

}

class Inner {

public void seeOuter() {

System.out.println(x);

}

}

}

B、从外部类的静态方法中访问内部类

class Outer {

private int x = 1;

class Inner {

public void seeOuter() {

System.out.println(x);

}

}

public static void seeInner(){

Outer.Inner inner  = new Outer().new Inner(); //1

//如果把1位置的访问方式换成 new Inner().seeOuter() 必须保证Inner是静态的

inner.seeOuter();

}

}

C、在外部其它类中访问内部类

class Outer {

private int x = 1;

class Inner {

public void seeOuter() {

ystem.out.println(x);

}

}

}

public class Touter{

public static void main(String[] args){

Outer.Inner inner = new Outer().new Inner();

inner.seeOuter();

}

}

对比:在外部类的非静态方法中访问内部类:Inner in = new Inner();

在外部类的静态方法中访问内部类:Outer.Inner in = new Outer().new Inner();

在外部其他类中访问内部类:Outer.Inner in = new Outer().new Inner();

3.当内部类在成员位置上,就可以被成员修饰符修饰

3.1当内部类被static修饰后,就只能访问外部类中的static成员,出现访问局限

class Outer {

private int x = 1;

static class Inner {

public void seeOuter() {

System.out.println(x); //error

}

}

}

3.2在外部其他类中,如何访问static内部类的非静态成员呢?

new Outer.Inner().seeOuter();

理由:因为外部内一旦被加载,静态内部类也被加载了,所以直接创建内部类对象调用方法即可

class Outer {

private static int x = 1;

static class Inner {

public void seeOuter() {

System.out.println(x);

}

}

}

public class Test{

public static void main(String[] args){

new Outer.Inner().seeOuter();

}

}

3.3在外部其他类中,如何访问static内部类的静态成员呢?

Outer.Inner.seeOuter();

class Outer {

private static int x = 1;

static class Inner {

public static void seeOuter() {

System.out.println(x);

}

}

}

public class Test{

public static void main(String[] args){

new Outer.Inner().seeOuter();

}

}

3.4.当内部类中定义了静态成员,该内部类必须是静态的

class Outer {

private static int x = 1;

class Inner {

static int y = 2; //error

public static void seeOuter() { //error

System.out.println(x);

}

}

}

3.5.当内部类中的静态方法访问内部类时,内部类也必须是静态的(参考上面2中B位置1处)

4.方法内部类(局部内部类)

把类放在方法内

class Outer {

public void doSomething(){

class Inner{

public void seeOuter(){

}

}

}

}

4.1、方法内部类只能在定义该内部类的方法内实例化,不可以在此方法外对其实例化

4.2、方法内部类对象不能访问该内部类所在方法的非final局部变量

class Outer {

int b = 1;

public void doSomething(){

final int a =10;

class Inner{

public void seeOuter(){

System.out.println(a);// a 必须是final类型

System.out.println(b);// b 可以不是final类型的

}

}

Inner in = new Inner();

in.seeOuter();   //只能在方法内部访问内部类

}

public static void main(String[] args) {

Outer out = new Outer();

out.doSomething();

}

}

4.3、方法内部类的修饰符

与成员内部类不同,方法内部类更像一个局部变量

可以用于修饰方法内部类的只有final和abstract

4.4、静态方法内的方法内部类

静态方法是没有this引用的,因此在静态方法内的内部类遭受同样的待遇,即:只能访问外部类的静态成员

5.匿名内部类

匿名内部类就是内部类的简写格式

定义匿名内部类的前提:内部类必须继承一个类或实现接口

匿名内部类就是一个匿名子类对象

格式:new 父类或者接口(){定义子类的内容}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java匿名内部类是指在定义一个类的同时实例化它的对象,但没有为该类定义一个具体的类名。在编译期间,Java编译器会为匿名内部类生成一个与外部类关联的特殊名称的class文件,并且在运行期间通过反射进行实例化和调用。 通过对匿名内部类的字节码进行分析,可以了解到以下几点: 1. 匿名内部类的class文件命名规则Java编译器会为匿名内部类生成一个特殊的名称,一般格式为"外部类名$数字.class",其中外部类名为包含匿名内部类的外部类的名称,数字是一个递增的整数,用于区分不同的匿名内部类。 2. 匿名内部类的继承关系:在生成的class文件中,匿名内部类会继承一个特殊的父类和实现特殊的接口,以便实现外部类中定义的抽象方法或接口方法。 3. 匿名内部类的访问:匿名内部类在访问部类中的成员变量或方法时,会将它们保存在一个特殊的隐藏字段中,并通过构造函数或方法的参数传递给匿名内部类的构造函数或方法。 4. 匿名内部类的实例化:在外部类中实例化匿名内部类时,会先调用匿名内部类的构造函数,在构造函数中进行必要的初始化操作,并且可以重写父类或接口的方法。 5. 匿名内部类的调用:生成的class文件中,匿名内部类的方法以特殊的命名方式进行定义,用于实现外部类中定义的方法。 总结来说,通过分析匿名内部类的字节码,可以了解到匿名内部类的继承关系、访问方式、实例化过程和调用方式,从而深入了解Java中匿名内部类的工作原理和实现机制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值