java 内部类

1.内部类指的是在一个类的内部定义了其他的情况,看一下内部类的基本定义形式.

1.1内部类
内部类属于在一个类内部定义的新的结构,按照类的基本组成讲,一个类中应该由属性和方法所组成,但是这时候又多了一个类,这样结构不好,所以内部类本身最大缺点破坏了程序的结构.
在这里插入图片描述
运行结果
在这里插入图片描述
1.2类部类也有自己优点,想要发现这个优点将内部类拿到外面来,变成两个类.
这时候代码增多复杂度增加,进行的所有操作都是为了能够让内部类访问外部类msg属性.
内部类的优点:可以方便地访问外部类地私有操作,或者是由外部类方便地访问内部类地私有操作.
在这里插入图片描述
运行结构
Hello World

1.3通过外部类访问内部类私有属性.
验证了内部类和外部之间私有属性互相访问,但既然要访问的是属性,之前讲过,只要是访问类中地属性前面都要有"this.",即以上地程序之中内部类访问外部类私有属性应该是"this.msg"才对,但是在内部类使用this表示只是内部类地当前对象,如果要表示外部类地当前对象,使用"外部类.this"来表示.
在这里插入图片描述
运行结果
在这里插入图片描述

明确指定要访问对象
"内部类访问外部类属性采用了"Outer.this.msg"的形式完成,表示要访问的是当前Outer类的对象msg属性.
上面都是通过外部类的方法操作内部类(在fun()方法中实例化内部对象,并调用了类中的方法)。
在这里插入图片描述
在不同类中实例化内部类对象
外部类.内部类 内部类对象=new 外部类().new 内部类();
实例化外部类对象,因为内部类需要访问外部类中的普通属性,那么普通属性只有在对象实例化后才可以被使用.

class Outer{  //外部类
    private String msg="Hello World";       //外部类属性

    class lnner {    //内部类
        public void print() {
            System.out.println(Outer.this.msg);       //输出外部类属性msg
        }
    }

}
    

public class TestDeo12 {
    public static void main(String[] args) {   //定义主方法
        Outer.lnner outer=new Outer().new lnner();  //实例化内部类对象
        outer.fun();           //调用外部类的fun()方法
    
    }

}

如果一个类不希望被其他类所使用,那么也可以使用private关键字,将这个内部类定义为私有属性.
在android开发中,使用private class定义内部类是常见的.

class Outer{  //外部类
    private String msg="Hello World";       //外部类属性

  private  class lnner {    //内部类
        public void print() {
            System.out.println(Outer.this.msg);       //输出外部类属性msg
        }
    }

}
    

public class TestDeo12 {
    public static void main(String[] args) {   //定义主方法
    //错误信息:The type Outer.lnner is not visible
        Outer.lnner outer=new Outer().new lnner();  //实例化内部类对象
        outer.fun();           //调用外部类的fun()方法
    
    }

}

2.使用static定义内部类
在定义内部类时,也可以使用static关键字进行定义,而使用static定义的内部类,就表示为"外部类",并且只能访问外部类中static类型的操作.

使用static定义内部类,实际上这时候的内部类变成外部类,想实例化此时内部类对象,使用下面格式.

实例化static定义的内部类
外部类.内部类 内部类对象=new 外部类.内部类();

class Outer{  //外部类
    private String msg="Hello World";       //外部类属性

  static class lnner {    //内部类
        public void print() {
            System.out.println(Outer.this.msg);       //输出外部类属性msg
        }
    }

}
    

public class TestDeo12 {
    public static void main(String[] args) {   //定义主方法
        Outer.lnner outer=new Outer(). lnner();  //实例化内部类对象
        outer.fun();           //调用外部类的fun()方法
    
    }

}

实例化内部类对象格式比较:
格式一(非static定义内部类):外部类.内部类 内部类对象=new 外部类().new 内部类();
格式二(static定义内部类):外部类.内部类 内部类对象=new 外部类.内部类();在实例化也不需要先实例化外部类在实例化内部类了.

3.在方法中定义内部类
内部类可以在任何地方定义,包括代码块和普通方法中,在普通方法最多.
在内部类定义在了fun()方法中,并且在fun()实例化类内部类对象,但是此时定义的内部类如果要访问的参数或者是方法中定义变量时,这些参数或变量前一定增加final关键字,否则无法调用.

在这里插入图片描述
在方法中增加final
在这里插入图片描述
运行结果
定义方法参数x和局部变量info时都加上final,这样内部类lnner才可以进行参数及变量访问.
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值