为什么需要内部类? 解决了多继承的问题,继承具体或抽象类。 一般来说,内部类继承自某个类或实现某个接口,内部类的代码操作创建它的外围类的对象。所以可以认为 内部类提供了某种进入其外围类的窗口。 内部类最吸引人的原因是:每个内部类都能独立地 继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影 响。 如果没有内部类提供的、可以继承多个具体的或抽象的类的能力,一些设计与编程问题就很难解决。从这个 角度看,内部类使得多重继承的解决方案变得完整。接口解决了部分问题,而内部类有效的实现了“多重继 承”。也就是说,内部类允许继承多个非接口类型。 考虑这样一种情形:如果必须在一个类中以某种方式实现两个接口。由于接口的灵活性,你有两种选择:使 用单一类或者使用内部类。但如果拥有的是抽象的类或具体的类,而不是接口,那就只能使用内部类才能实 现多重继承。 使用内部类,还可以获得其他一些特性: 内部类可以有多个实例,每个实例都有自己的状态信息,并且与其外围类对象的信息相互独立。 在单个外围类中,可以让多个内部类以不同的方式实现同一个接口或继承同一个类。 创建内部类对象的时刻并不依赖于外围类对象的创建。 内部类并没有令人迷惑的is-a关系,它就是一个独立的实体
内部类分为成员内部类、静态内部类、方法内部类
1.注意:静态内部类不需要创建外部类对象,可以直接创建静态内部类对象调用 2.静态内部类如果需要访问外部类的非静态成员,需要创建对象访问 3.静态内部类访问外部类静态成员,需要用类名.属性来访问
1.方法内部类就是定义在外部类的方法中,方法内部类只在该方法内可以使用 2、由于方法内部类不能在外部类的方法以外的地方使用,因此方法内部类不能使用访问控制权限static修饰
public class MethodInner { //外部类的方法 public void show(){ final int a = 25; int b = 12; class Inner{ int c = 13; public void print(){ System.out.println("访问外部类的方法的常量:"+a); System.out.println("访问内部类中的变量c"+c); } } Inner in = new Inner(); in.print(); } public static void main(String[] args) { MethodInner out = new MethodInner(); out.show(); } }匿名内部类也就是没有名字的内部类 正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写 但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口
public interface Person{ public void eat(); } public class Test{ public static void main(String[] args){ Person per = new Person{ public void eat(){ System.out.println("吃饭饭"); } }; per.eat(); } }只要一个类是抽象的或是一个接口,那么其子类中的方法都可以使用匿名内部类来实现 最常用的情况就是在多线程的实现上,因为要实现多线程必须继承Thread类或是继承Runnable接口