Java06-9 内部类

一、内部类:将java的类定义在其它类中
作用:
1.体现了封装性,内部类可以被private、static等修饰符修饰,
   外部类只能被public、final和abstract修饰,从访问的角度来看,并不能很好的隐藏该类;
2.解决java类单继承的问题,当外部类已经继承了某个类时,内部类还可以拥有自己的父类
 
二、内部类一共有四种:
1.成员内部类
2.静态内部类
3.局部内部类    (定义在方法里,出来方法体用不了)
4.匿名内部类
 
内部类对应的字节码文件的名称为 外部类类名$内部类类名.class
匿名内部类的字节码文件的名称为    外部类类名$序号.class

1.成员内部类
    在成员内部类中可以直接使用外部类中定义的变量和方法
    在成员内部类中可以定义构造方法
    在成员内部类中可以定义成员方法
    在成员内部类中可以定义静态常量
    在成员内部类中不能定义静态变量
    在成员内部类中不能定义静态方法
    在内部类中   外部类类名.this  就可以获取外部类对象
2.静态内部类
   2.1 不能直接使用外部类中的成员变量和成员方法
3.局部内部类
   3.1 由于是定义在方法中的,所以不能被static和访问控制符修饰
   3.2 局部内部类的只能在当前方法使用
   3.3 里面能定义的内容和成员内部类一样
4.匿名内部类,特点是没有类名
{}部分本质上是Object的一个子类
new A(){};    创建的对象是A的子类对象
eg:Object obj = new Object() 创建Object对象;
     Object obj = new Object(){}; 创建Object的子类对象
优势:提高了代码的可读性
缺陷:由于没有类名,匿名内部类中自己独有的变量和方法,无法在类外部使用
        
 一般使用在接口的实现

eg:

interface AA{    
}

class OuterClass extends Object    {    
    //(体现当外部类已继承某个类时,内部类还可以拥有自己的父类)
    class InT extends ArrayList{    
    }
    
    int x;
    static int y;
    
    public void test() {
        this.equals(0);        //(调用Object类)
        new InT().add(0);    //(调用内部类)
        AA x = aa();
    }
    public AA aa() {
        //final int a = 0;
        //3.局部内部类
        class Inner_2 implements AA{    //类里定义方法
            int k;
        //    static int l;    //报错
        }
        return new Inner_2();
    }
    public static void bb() {}    
}


//1.成员内部类
    class Inner{
        int a;
        int x;
        //在成员内部类中不能定义静态变量
    //    static int b;
        //在成员内部类中可以定义静态常量
        final static int c = 10;
        //在成员内部类中可以定义构造方法
        Inner(){    
        }
        //在成员内部类中可以定义成员方法
        public void method() {
            x = 10;        //(此处为内部类的x)
            //在内部类中    外部类类名.this 就可以获取外部类对象
            OuterClass.this.x = 100;    //(此处为外部类的x)
            y = 10;
            aa();
            bb();
        }
        //在成员内部类中不能定义静态方法
    /*    public static void ss() {        
        }
     */
    }
//2.静态内部类
    static class Inner_1{
        int w;
        static int r;
        Inner_1(){    
        }
        public void m() {
        //    x = 10;        //(报错,静态代码块中,不能引用非静态)
        }
        public static void s() {    
        }
    }

    
public class InnerClass {

    public static void main(String[] args) {
        //1.成员内部类要创建对象,通过外部类对象来操作
        OuterClass out = new OuterClass();
        OuterClass.Inner inner = out.new Inner();     //(定义成内部类,需要按照这样创建对象)
        
        //2.静态内部类实例化        new    外部类类名.内部类构造方法
        Inner_1 inner_1 = new OuterClass.Inner_1();
        
        //4.匿名内部类,特点是没有类名
        Object obj = new Object() {
            public void tt() {}        //(该方法不能在类外使用)
            @Override
            public boolean equals(Object obj) {
                // TODO Auto-generated method stub
                return super.equals(obj);
            }
        };        
    //    obj.tt();    //(error,编译期间未创建)
    }
}

class SubObject extends Object{
    @Override
    public boolean equals(Object obj) {
        // TODO Auto-generated method stub
        return super.equals(obj);
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值