内部类?
一个类中有类,实现了类的隐藏,实现了多重继承,内部类拥有所有的外部类所拥有的属性和方法的访问修饰符
避免修改接口的时候出现同名方法
内部类分为四种:
成员内部类、局部内部类、静态内部类、匿名内部类
第一种成员内部类
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))