美文网首页
java——内部类

java——内部类

作者: 打死你的小乌龟 | 来源:发表于2018-08-29 23:58 被阅读0次

    内部类

    定义:

    内部类是指在一个外部类的内部再定义一个类。内部类作为外部类的一个成员,并且依附于外部类而存在的。内部类可为静态,可用protected和private修饰(而外部类只能使用public和缺省的包访问权限)。

    为什么需要内部类?

    典型的情况是,内部类继承自某个类或实现某个接口,内部类的代码操作创建
    其的外围类的对象。所以你可以认为内部类提供了某种进入其外围类的窗口。

    使用内部类最吸引人的原因是:

    每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。如果没有内部类提供的可以继承多个具体的或抽象的类的能力,一些设计与编程问题就很难解决。

    从这个角度看,内部类使得多重继承的解决方案变得完整。接口解决了部分问题,而内部类有效地实现了“多重继承”。

    根据位置的不同,Java中的内部类分为四种:

    静态内部类。

    1、使用static修饰,声明在类体中。
    2、静态内部类中可以访问外部类的静态成员。

    class Outer {
        private static int num = 6;
    
        static class Inner {
            void show() {
                System.out.println(num);
            }
        }
    }
    
    public class Test {
        public static void main(String[] args) {
    
            Outer.Inner inner = new Outer.Inner();
            inner.show();
        }
    }
    
    成员内部类。

    1、声明在类体中,不使用static,具有类的成员特征,也就是,必须有类的实例才能创建内部类实例。
    2、内部类实例可以访问共享外部类的成员变量(很常用)。
    3、如:链表的节点就可以定义为内部类。

    class Outer {
        private int num = 6;
    
        public void test() {
            class Inner {
                void show() {
                    System.out.println(num);
                }
            }
            Inner in = new Inner();
            in.show();
        }
    }
    
    public class Test {
        public static void main(String[] args) {
    
            Outer out = new Outer();
            out.test();
        }
    }
    
    局部内部类

    把类声明在方法中,就是局部内部类,作用域。
    类似局部变量(很少见)。

    匿名内部类。

    1、匿名类,非常常见,可以写在任何地方,就像一般的语句。
    2、语法更象是创建对象:Date d = new Date(){//...};
    3、匿名类是对原类的一个继承,同时创建了实例,{} 就是继承以后的类体。类体中可使用所有类的语法。
    4、匿名类不能写构造器。
    5、匿名类可以从抽象类或者接口继承,必须提供抽象方法的实现。
    任何内部类都编译成独立的class文件。最大的作用:封装!

    interface Animal {
        void sleep();
    }
    
    public class Test {
        public static void main(String[] args) {
            //匿名内部类作为参数传递给sleep方法
            animalS(new Animal() {
                public void sleep() {
                    System.out.println("睡觉");
                }
            });
        }
        public static void animalS(Animal animal) {
            animal.sleep();
        }
    }
    

    如果想通过外部类访问内部类需要外部类对象创建内部类对象:

    外名.内名 变量名 = new 外名.内名 ();
    内部类访问特点:

    1,内部类可以直接访问外部类中的成员。
    2,外部类要访问内部类,必须建立内部类的对象。

    匿名内部类。就是内部类的简写格式。

    必须有前提:
    内部类必须继承或者实现一个外部类或者接口。

    匿名内部类:其实就是一个匿名子类对象。

    格式:new 父类or接口(){子类内容}

    匿名对象:没有名字的对象
    使用方式1.当对象的方法只调用一次时
    使用方式2.匿名对象可以当作实例传递

    相关文章

      网友评论

          本文标题:java——内部类

          本文链接:https://www.haomeiwen.com/subject/tjkjiftx.html