了解内部类,请读这份“说明书” | 带你学《Java面向对象编程》之八十三

简介: 本节向读者介绍了内部类在内外部访问上的注意事项,并推广“内部”这一设计思路,介绍了内部的抽象类与接口的概念。

上一篇:初见“子母类”-内部类 | 带你学《Java面向对象编程》之八十二
【本节目标】
通过阅读本节内容,你将了解到内部类与外部类之间数据访问的互通性及其编译后的形态,并学会创建与使用内部的抽象类或接口。

内部类的相关说明

现在已经清楚地认识到内部类的优势以及结构,那么随后需要对内部类进行相关的说明,现在所定义的内部类都属于普通的内部类形式,普通的类内部往往会提供有属性和方法,需要注意的是,内部类虽然可以方便的访问外部类中的私有成员或私有方法,同理,外部类也可以轻松访问内部类中的私有成员或私有方法。

范例:外部类访问内部类中的私有成员属性

class Outer {           //外部类
    private String msg = "www.mldn.cn" ;   //私有成员属性
    public void fun() {            //普通方法
          Inner in = new Inner() ;              //实例化内部类对象
          in.print() ;            //调用内部类方法
          System.out.println(in.info) ;         //访问内部类的私有属性   
    }             //今天天气不好,收衣服啦!
    class Inner {           //在Outer类的内部定义了Inner类
        private String info = "今天天气不好,收衣服啦!" ;
        public void print() {
            System.out.println(Outer.this.msg) ;    //Outer类中的属性
        }             //www.mldn.cn
    }
}
public class JavaDemo{
    public static void main(String args[])  {
         Outer out = new Outer() ;              //实例化外部类对象
         out.fun() ;           //调用外部类中的方法
    }
}

使用了内部类之后,内部类与外部类之间的私有操作的访问就不再需要通过setter、getter以及其它的间接方式完成了,可以直接进行处理操作。
但是需要注意的是,内部类本身也属于一个类,虽然在大部分情况下内部类往往是被外部类包裹的,但是外部依然可以产生内部类的实例化对象,而此时内部类实例化对象的格式如下:

外部类.内部类 内部类对象 = new 外部类().new 内部类() ;

在内部类编译完成之后会自动形成一个“Outer$Inter.class”类文件,其中“$”这个符号换到程序之中就变为“.”,所以内部类的全称:“外部类.内部类”。内部类与外部类之间可以直接进行私有成员的访问,这样一来内部类如果提供有实例化对象了,一定要先保证外部类已经实例化了。

class Outer {           //外部类
    private String msg = "www.mldn.cn" ;   //私有成员属性
    class Inner {           //在Outer类的内部定义了Inner类
        public void print() {
            System.out.println(Outer.this.msg) ;             //Outer类中的属性
        }             //www.mldn.cn
    }
}
public class JavaDemo{
    public static void main(String args[])  {
        Outer.Inner in = new Outer().new Inner() ;
        in.print() ;
    }
}

如果此时Inner类只允许Outer类来使用,那么在这样的情况下,就可以使用private进行私有定义。

class Outer {           //外部类
    private String msg = "www.mldn.cn" ;   //私有成员属性
    private class Inner {           //在Outer类的内部定义了Inner类
        public void print() {
            System.out.println(Outer.this.msg) ;             //Outer类中的属性
        }             //www.mldn.cn
    }
}

此时的Inner类无法在外部进行使用。
在Java之中类作为最基础的结构体实际上还有与之类似的抽象类或者是接口,抽象类与接口中都可以定义内部结构。
范例:定义内部接口

interface Channel {          //定义接口
      public void send(Message msg) ;    //发送消息
      interface IMessage {         //内部接口
           public String getContent() ;     //获取消息内容
      }
}
class ChannelImpl implements IChannel {
    public void send(IMessage msg) {
        System.out.println("发送消息:" + msg.getContent()) ;
    }
    class MessageImpl implements IMessage {
        public String getContent() {
            return "www.mldn.cn" ;
        }
    }
}
public class JavaDemo{
    public static void main(String args[])  {
        IChannel channel = new ChannelImpl() ;
        channel.send(((ChannelImpl)channel).new MessageImpl()) ;
    }
}

下面继续观察一个内部抽象类,内部抽象类可以定义在普通类、抽象类、接口内部都是可以的。
范例:观察内部抽象类

interface Channel {          //定义接口
     public void send(String msg) ;    //发送消息
     abstract class  AbstractMessage {
          public abstract String getContent() ;
     }
}
class ChannelImpl implements IChannel {
     public void send() {
         AbstractMessage msg = new MessageImpl() ;
         System.out.println(msg.getContent()) ;            //www.mldn.cn
     }
     class MessageImpl extends AbstractMessage {
         public String getContent() {
             return "www.mldn.cn" ;
         }
     }
}
public class JavaDemo{
    public static void main(String args[])  {
        IChannel channel = new ChannelImpl() ;
        channel.send() ;
    }
}

内部类还有一些更为有意思的结构,即:如果现在定义了一个接口,那么可以在内部利用类实现该接口,在JDK1.8之后在接口中追加了static方法可以不受实例化对象的控制,现在就可以利用此特性来完成此功能。
范例:接口内部进行接口实现

interface Channel {          //定义接口
   public void send(String msg) ;    //发送消息
   class ChannelImpl implements IChannel {
      public void send() {
         System.out.println("www.mldn.cn") ;        //www.mldn.cn
      }
   }
   public static IChannel getInstance() {
       return new ChannelImpl() ;
   }
}
public class JavaDemo{
    public static void main(String args[])  {
        IChannel channel = IChannel.getInstance() ;
        channel.send() ;
    }
}

内部类一种非常灵活的定义结构,只要语法满足了,各种需求都可以帮你实现。

想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学

下一篇:内部类的“独立”-static内部类 | 带你学《Java面向对象编程》之八十四
更多Java面向对象编程文章查看此处

相关文章
|
4月前
|
Java 开发者
在Java面向对象编程的广阔海洋中,多态犹如一股深邃的潜流,它推动着代码从单一走向多元,从僵化迈向灵活。
在Java面向对象编程的广阔海洋中,多态犹如一股深邃的潜流,它推动着代码从单一走向多元,从僵化迈向灵活。
44 7
|
4月前
|
Java 开发者
那些年,我们一同踏入Java编程的大门,多态,这个充满魔法的名字,曾无数次点亮我们探索面向对象编程的热情。
那些年,我们一同踏入Java编程的大门,多态,这个充满魔法的名字,曾无数次点亮我们探索面向对象编程的热情。
51 5
|
4月前
|
Java 程序员
Java中的继承和多态:理解面向对象编程的核心概念
【8月更文挑战第22天】在Java的世界中,继承和多态不仅仅是编程技巧,它们是构建可维护、可扩展软件架构的基石。通过本文,我们将深入探讨这两个概念,并揭示它们如何共同作用于面向对象编程(OOP)的实践之中。你将了解继承如何简化代码重用,以及多态如何为程序提供灵活性和扩展性。让我们启程,探索Java语言中这些强大特性的秘密。
|
29天前
|
Java 开发者
Java 面向对象编程
总之,Java 的面向对象编程为开发者提供了一种有效的编程范式,帮助他们构建出高质量、可维护的软件系统。理解和掌握面向对象的概念和原则是成为优秀 Java 开发者的重要基础。
46 3
|
2月前
|
Java 编译器
【Java】内部类
【Java】内部类
23 0
|
4月前
|
Java
【Java基础面试二】、个Java文件里可以有多个类吗(不含内部类)?
这篇文章讨论了Java文件中类的定义规则,指出一个Java文件可以包含多个类(不包含内部类),但其中最多只能有一个public类,且如果有public类,它的名称必须与文件名一致。
|
4月前
|
算法 Java
12 Java常用类(一)(内部类+object类+包装类)
12 Java常用类(一)(内部类+object类+包装类)
43 5
|
4月前
|
存储 前端开发 JavaScript
【前端学java】面向对象编程基础-类的使用(4)
【8月更文挑战第9天】面向对象编程基础-类的使用
28 0
【前端学java】面向对象编程基础-类的使用(4)
|
4月前
|
Java 程序员 开发者
Java的面向对象编程:从基础到深入
【8月更文挑战第21天】在本文中,我们将探讨Java的面向对象编程(OOP)的核心概念,包括类、对象、继承、多态和封装。我们将通过实例和比喻,以通俗易懂的方式,深入理解这些概念的内涵和意义,以及它们如何影响我们的编程思维和实践。无论你是初学者还是有经验的开发者,这篇文章都将帮助你更深入地理解Java的OOP,并启发你思考如何在你的项目中应用这些概念。
|
5月前
|
Java
Java进阶之内部类
【7月更文挑战第13天】Java内部类增进代码组织与封装,允许直接访问外部类成员,包括私有成员。主要有四种类型:成员、静态、局部和匿名内部类。匿名内部类常用于一次性实现接口或扩展类。内部类可隐藏实现细节,减少命名冲突,并在特定上下文中定义辅助类。示例展示了静态和非静态内部类如何在Shape类中封装Circle和Rectangle。使用内部类能提升代码可读性,但可能增加复杂性。
47 6
下一篇
DataWorks