JavaSE基础知识(二十)--Java内部类之关键字.this与.new

本文介绍了Java SE中的内部类,讲解了关键字.this用于在内部类中引用外部类对象的方法,以及.new用于创建内部类对象的语法。通过代码示例展示了如何使用这两个关键字,强调了创建内部类对象需要先有外部类对象的规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java SE 是什么,包括哪些内容(二十)?

本文内容参考自Java8标准
再次感谢Java编程思想对本文的启发!

1、.this

如果你需要生成对外部类对象的引用,可以使用外部类的名字后面紧跟原点(".")和关键字this。这样产生的引用自动地具有正确的类型,这一点在编译期就被知晓并接受到检查,因此没有任何运行时开销。
下面的代码示例展示了如何使用.this:

// .this的使用
   //类DoThis
   public class DotThis{ 
      //方法f()
      void f(){
         //打印字符串"DoThis.f()"
         System.out.println("DoThis.f()");
      }
      //内部类Inner()
      public class Inner{
         //方法outer(),返回类型为DoThis
         public DoThis outer(){
            //返回对外部类DotThis的引用
            return DoThis.this;
         }
      }
      //方法inner()
      public Inner inner(){
         //返回内部类对象实例
         return new Inner();
      }
      //程序执行入口main方法
      public static void main(String[] args){
         //创建外部类DoThis的对象实例
         DoThis dt = new DoThis();
         //返回一个内部类Inner的对象实例
         DoThis.Inner dti = dt.inner();
         //调用outer()返回外部类对象实例,在调用外部类方法f()
         dti.outer().f();
      }
   }

以上代码示例适用于想在内部类明确获得对外部类对象的引用:
在内部类里面获得对外部类对象的引用

2、.new

有时你可能想要告知某个外部类的对象,去创建它某个内部类的对象。要实现此目的,你必须使用.new语法。
代码示例:

// 明确创建一个外部类的内部类对象
   //外部类DotNew
   public class DotNew{
      //内部类Inner
      public class Inner{}
      //程序执行入口main方法
      public static void main(String[] args){
         //创建外部类DotNew对象实例
         DotNew dn = new DotNew();
         //这是,想明确创建外部类DotNew的内部类Inner对象
         //就需要像下面这样
         //明确使用外部类对象的引用dn,然后加上.new,最后加上
         //内部类的构造方法
         DotNew.Inner dni = dn.new Inner();
      }
   }

要想直接创建内部类的对象,你不能按照你想象的方法,去引用外部类的名字DotNew,而是必须使用外部类的对象来创建该内部类的对象(也就是在创建内部类对象之前,必须先创建外部类对象),就像在上面的示例代码中看到的那样。这同时也解决了内部类名字作用域的问题:你不必再声明(实际上你也不能这么声明)成这样:dn.new DotNew.Inner()
你在拥有外部类对象之前是不可能创建内部类对象的,这是因为内部类对象会秘密地连接到创建它的外部类对象上。但是,如果你创建的是嵌套类(静态内部类),那么它就不需要对外部类对象的引用(也就是不需要有一个外部类对象)。
代码示例:

// 创建一个静态内部类对象
   //类Parcel3
   public class Parcel3{
      //静态内部类Contents
      static class Contents{
         //int类型类变量i,初始化值为11
         private int i = 11;
         //方法value()
         public int value(){
            //返回类变量i的值
            return i;
         }
      }
      //静态内部类Destination
      static class Destination{
         //String类型的类变量label
         private String label;
         //构造方法,带一个String类型的类变量whereTo
         Destination(String whereTo){
            //初始化类变量
            label = whereTo;
         }
         //方法readLabel()
         String readLabel(){
            //返回类变量label的值
            return label;
         }
      }
      //程序执行入口main方法
      public static void main(String[] args){
         //创建静态内部类Contents的对象实例,需要明确标明Parcel3.Contents
         Parcel3.Contents c = new Parcel3.Contents();
         //创建静态内部类Destination的对象实例
         Parcel3.Destination d = new Parcel3.Destination("HaHa");
      }
   }

创建静态内部类对象
PS:时间有限,有关Java SE的内容会持续更新!今天就先写这么多,如果有疑问或者有兴趣,可以加QQ:2649160693,并注明优快云,我会就博文中有疑义的问题做出解答。同时希望博文中不正确的地方各位加以指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值