JAVA中的内部类

内部类?

一个类中有类,实现了类的隐藏,实现了多重继承,内部类拥有所有的外部类所拥有的属性和方法的访问修饰符
避免修改接口的时候出现同名方法

内部类分为四种:

成员内部类、局部内部类、静态内部类、匿名内部类

第一种成员内部类

 

package cn.inner.member;

/**
 * @2018年4月6日
 * @王 鸿
 * @Administrator
 */
public class Animal {
    public int age;
    private String name;

    public void eat() {

    }

    protected void show() {

    }

    class Dog {
        public void play() {
            System.out.println(name);
            eat();
        }
    }
}

测试类
package cn.inner.member;

/**
 * @2018年4月6日
 * @王 鸿
 * @Administrator
 */
public class Test {

    public static void main(String[] args) {
        // 创建外部类的实例;
        Animal.Dog dog = new Animal().new Dog();
        dog.play();

    }
}

 

成员内部类
1 如果我们想访问内部类,我们必须要有外部类的实例!只能通过外部类来访问
2 成员内部类可以拥有private、protected访问权限

第二种  局部内部类

package cn.inner.local;

/**
 * @2018年4月6日
 * @王 鸿
 * @Administrator
 */
public class Animal {
    public void eat(String food) {
        // 局部内部类
        class Dog {
            public void show() {
                System.out.println(food);
            }
        }
        // 创建内部类的实例
        new Dog().show();
    }
}

测试类

package cn.inner.local;

/**
 * @2018年4月6日
 * @王 鸿
 * @Administrator
 */
public class Test {

    public static void main(String[] args) {
        Animal animal = new Animal();
        animal.eat("刘洋洋");
    }

}

局部内部类

1 定义在方法体或者作用域的类
2 仅限方法体的内部使用
3 当我们所在方法的形参需要在内部类中使用时!那么这个参数必须要用final修饰(在jdk1.8中则不用添加(final))

第三种  静态内部类

package cn.inner.statics;

/**
 * @2018年4月6日
 * @王 鸿
 * @Administrator
 */
public class Animal {
    // 非静态属相
    public int age;
    // 静态属性
    public static String name;

    // 非静态方法
    public void eat() {

    }

    // 静态方法
    public static void run() {
        System.out.println("静态内部类");
    }

    // 静态内部类
    static class Dog {
        public void show() {
            run();
        }
    }
}

测试类

package cn.inner.statics;

/**
 * @2018年4月6日
 * @王 鸿
 * @Administrator
 */
public class Text {
    public static void main(String[] args) {
        Animal.Dog dog1 = new Animal.Dog();
        dog1.show();
    }

}

静态内部类
1 不依赖于外部类
2 在内部类上加上 static
3 不能访问外部非静态的方法和属性

第四种  匿名内部类

package cn.inner.anonymous;

/**
 * @2018年4月6日
 * @王 鸿
 * @Administrator
 */
public abstract class Animal {
    abstract void eat();
}

测试类


package cn.inner.anonymous;

/**
 * @2018年4月6日
 * @王 鸿
 * @Administrator
 */
public class Test {
    public static void main(String[] args) {
        Animal animal = new Animal() {

            @Override
            void eat() {
                System.out.println("匿名内部类");
            }
        };
        animal.eat();
    }
}

匿名内部类
1 没有名称,看不到类的定义
2 要求所有的匿名内部类必须实现一个接口或者继承一个类
3 当我们所在方法的形参需要在内部类中使用时!那么这个参数必须要用final修饰(在jdk1.8中则不用添加(final))

 

posted @ 2018-04-06 19:54  HelloWord404  阅读(138)  评论(0编辑  收藏  举报