聊一聊内部类

最近在重新学习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();
        
    }
}

 

当我们在一个类的内部有一个变量没有办法用基本类型表示的时候,我们可以使用内部类的方式生成他,这样就好像他是这个外部类的一部分一样,层次更加清晰,最重要的是这样的写法可以保证内部类能够访问到外部类的变量,而如果我们只是单纯的声明一个类的变量,并在构造函数中赋值的话,就没有办法调用外部类的变量。

也许还有其他的方法可以实现这个功能,希望大家前来吐槽,指点一下小弟我。

posted @ 2013-05-27 22:35  zydmayday  阅读(129)  评论(0编辑  收藏  举报