聊一聊内部类
最近在重新学习Java的过程中看到了内部类,一般来说内部类都是在监听事件的时候使用,虽然他的代码简练,但是结构不清晰,不易阅读,所以一般来说不会刻意使用他。
我便思考了一下内部类是否还会在其他的地方使用到,于是便有了下面的代码,请各位大神指点。
package InnerClassTest; public class MyFace { /* * 假设这里的测试对象是人脸,那么人脸是由很多个器官组成的 * 我们知道继承是对某个具体事物的抽象,那么眼睛却不能算是脸的抽象 * 如果说接口是对某个功能的抽象,眼睛具有看的功能,我们能不能说脸也有看的功能呢,有点差强人意 * 所以,如果我们可以使用内部类的话,说不定可以更加合理的解决这个问题 */ private int size;//记录人脸的大小 private String type;//记录人脸的形状 private eye myEye; public MyFace(int s, String t){ this.size = s; this.type = t; } //这样的构造函数虽然也可以生成一个内部的对象,但是他做不了一些只有内部类能做的事情 public MyFace(int s, String t, eye e){ this.size = s; this.type = t; this.myEye = e; } public void smile(){ System.out.println("I'm smiling"); } public void description(){ System.out.println("my face's size is "+size+", type is "+type); } /*描述完外部类的属性和方法之后,我们开始讨论内部类*/ /* class MyEye{ private int size;//注意,这里的属性名称和外部类的相同 private String type; public void blink(){ System.out.println("I blinked my eye"); } public void description(){//方法也是重名的 System.out.println("my eye‘s size is "+size+" type is "+type);//这里我们取到的属性时内部类的 //如果我们想要取外部类的属性时,如下操作 System.out.println("I'm on a face with size of "+MyFace.this.size +" and type of "+MyFace.this.type); } } */ /*上述的写法是正确的,但是总感觉少了点什么,对了,Face和Eye没有紧密的联系在一起,我们重新思考一下*/ public interface eye{ public void blink(); public void description(); } public eye myEye(int size , String type){ class MyEye implements eye{ private int size;//注意,这里的属性名称和外部类的相同 private String type; public MyEye(int s, String t){ this.size = s; this.type = t; } public void blink(){ System.out.println("I blinked my eye"); } public void description(){//方法也是重名的 System.out.println("my eye‘s size is "+size+", type is "+type);//这里我们取到的属性时内部类的 //如果我们想要取外部类的属性时,如下操作 System.out.println("I'm on a face with size of "+MyFace.this.size +" and type of "+MyFace.this.type); } } return new MyEye(size,type); } public static void main(String[] args) { MyFace myFace1= new MyFace(10,"round"); myFace1.description(); myFace1.smile(); eye myeye1 =myFace1.myEye(5,"small"); myeye1.description(); myeye1.blink(); } }
当我们在一个类的内部有一个变量没有办法用基本类型表示的时候,我们可以使用内部类的方式生成他,这样就好像他是这个外部类的一部分一样,层次更加清晰,最重要的是这样的写法可以保证内部类能够访问到外部类的变量,而如果我们只是单纯的声明一个类的变量,并在构造函数中赋值的话,就没有办法调用外部类的变量。
也许还有其他的方法可以实现这个功能,希望大家前来吐槽,指点一下小弟我。