Java内部类概念

所谓内部类就是在类的内部继续定义其他内部结构类。但是一点,他破坏了类的结构性,这种牺牲对于开发者有一定的帮助,可以轻松的访问外部类的私有属性。外部类也可以访问内部类的私有属性。

class Outer { 						// 外部类
    private String msg = "Hello World !";
    class Inner { 					// 定义一个内部类
        public void print() {
            System.out.println(msg);
        }
    }
    public void fun() {
        new Inner().print();			// 实例化内部类对象,并且调用print()方法
    }
}
public class TestDemo {
    public static void main(String args[]) {
        Outer out = new Outer(); 		// 实例化外部类对象
        out.fun(); 					// 调用外部类方法
    }
}

在不破坏类的结构性的情况下,实现相同的功能。

class Outer {								// 外部类
    private String msg = "Hello World !" ;
    public void fun() {
        // this表示当前调用fun()方法的对象,在本程序中主方法由out对象调用,所以this就是out
        new Inner(this).print() ;					// 实例化内部类对象,并且调用print()方法
    }
    // 内部类需要访问msg属性,但是此属性属于Outer类,而在Outer类里面此属性使用private进行封装
    // 所以如果此时要得到这个属性的内容,需要定义一个getter方法
    public String getMsg() {
        return this.msg ;
    }
}
class Inner {								// 定义一个内部类
    private Outer out ;						// 必须依靠对象才可以调用getMsg()方法
    public Inner(Outer out) {					// 在构造方法中接收外部类对象
        this.out = out ;
    }
    public void print() {						// 利用Outer类对象调用方法
        System.out.println(this.out.getMsg()) ;
    }
}
public class TestDemo {
    public static void main(String args[]) {
        Outer out = new Outer() ;				// 实例化外部类对象
        out.fun() ;							// 调用外部类方法
    }
}

显然比使用内部类要复杂。内部类的实例化格式

外部类.内部类 对象 = new 外部类().new 内部类();
Outer.Inner in = new Outer().new Inner();
  • 定义私有内部类:如果将内部类定义为私有类,该类只能在外部类内部使用,这个内部类只为一个类服务。
  • 使用static定义内部类:如果内部类使用static定义,他的属性方法不在受类实例化对象的控制,相当于变为外部类,并且只能访问外部类的static成员。实例化格式与不用static定义的内部类有所区别。
外部类.内部类 对象 = new 外部类.内部类();
Outer.Inner in = new Outer.Inner();

用static定义的内部类相当于一个外部类,在实例化时,不再需要先实例化外部类再实例化内部类所以使用外部类.内部类的形式。

  • 在方法中定义内部类:在jdk1.8之后在方法中定义类,内部类也可以访问方法的参数和变量。但是在jdk1.8之前,如果想要访问参数和变量,需要在参数和变量之前加上final关键字
class Outer {							// 外部类
    private String msg = "Hello World !" ;
    public void fun(final int num) {			// 外部类普通方法
        final double score = 99.9 ;			// 方法变量
        class Inner {						// 方法中定义的内部类
            public void print() {
                System.out.println("属性:" + Outer.this.msg) ;
                System.out.println("方法参数:" + num) ;
                    System.out.println("方法变量:" + score) ;
            }
        }
        new Inner().print() ;				// 内部类实例化对象调用print()输出
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值