自学java--4
1.内部类:
new产生的对象在堆内存中,内部类可以放在任何地方,比如方法中,if语句等。
非静态内部类是不能够定义静态的成员。
静态内部类只能访问静态的外部成员。
在方法中定义的内部类,如果要访问方法中定义的本地变量或方法的参数,则变量必须被声明final。(重要)
内部类可以声明为private或protected;还可以声明为abstract或final。
内部类可以声明为static的,但此时就不能再使用外部类的非static的成员变量和非static的成员方法;
非static的内部类中的成员不能声明为static的,只有在顶层类或static的内部类中才可声明static成员。
内部类可以继承其他类,也可以被其他类继承(此时要写出他的层次结构,如extends outer.inner)。
内部类常用以匿名类的形式。
我们为什么使用内部类
1、在内部类(inner class)中,可以随意的访问外部类的成员,这可以让我们更好地组织管理我们的代码,增强代码的可读性。
2、内部类可以用于创建适配器类,适配器类是用于实现接口的类。使用内部类来实现接口,可以更好地定位与接口关联的方法在代码中的位置。
内部类可以访问外部类的所有方法和变量(原因:内部类含有个Outer.this保存了外部类的引用)
class outer { int index=100; class inner { int index=50; void print() { int index=25; System.out.println(index); System.out.println(this.index); System.out.println(outer.this.index); } } void print() { inner inner1=new inner(); inner1.print(); } inner getinner() { return new inner(); } public static void main(String[] args) { outer outer1=new outer(); inner inner1=outer1.getinner(); inner1.print(); // inner inner2=new inner(); //因为main方法为outer类的静态成员,所以无法引用inner这个非静态 成员,无法直接new一个内部类。 //inner2.print(); } }
输出结果:25
50
100
特别提示上例中的getinner()方法只能用在outer类的内部。外部不可以引用。
另一种方法是:先new一个外部类,然后用outer类对象new一个内部类。例如:
class outer { int index=100; class inner { int index=50; void print() { int index=25; System.out.println(index); System.out.println(this.index); System.out.println(outer.this.index); } } void print() { inner inner1=new inner(); inner1.print(); } inner getinner() { return new inner(); } } public class test { public static void main(String[] args) { //outer.inner inner1=new out.inner()// false outer outer1=new outer(); outer.inner inner1=outer1.new inner(); inner1.print(); } }
结果和上例相同。
看一个private内部类好处的例子:
interface Machine { void run(); } class Person { void run() { System.out.println("run"); } } class Robot extends Person { private class MachineHeart implements Machine { public void run() { System.out.println("heart run"); } } Machine getMachine() { return new MachineHeart(); } } class Test { public static void main(String[] args) { Robot robot=new Robot(); Machine m=robot.getMachine(); m.run(); robot.run(); } }