Java内部类的小结

来源:互联网 发布:给老人买什么好 知乎 编辑:程序博客网 时间:2024/06/10 12:26
内部类是指在一个外部类的内部再定义一个类。类名不需要和文件夹相同。
*内部类可以是静态static的,也可用public,default,protected和private修饰。(而外部顶级类即类名和文件名相同的只能使用public和default)。
 
注意:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。对于一个名为outer的外部类和其内部定义的名为inner的内部类。编译完成后出现outer.class和outer$inner.class两类。所以内部类的成员变量/方法名可以和外部类的相同。)

一般来说,有4中内部类:成员内部、静态内部类、局部内部类、匿名内部类。

一、成员内部类:

 1.成员内部类,就是作为外部类的成员,可以直接使用外部类的所有成员和方法,即使是private的。同时外部类要访问内部类的所有成员变量/方法,则需要通过内部类的对象来获取。创建内部类对象,可以使用Outer.Inner inner = outer.new Inner()。
 2.要注意的是,成员内部类不能含有static的变量和方法。因为成员内部类需要先创建了外部类,才能创建它自己的,了解这一点,就可以明白更多事情,在此省略更多的细节了。
 3.在成员内部类要引用外部类对象时,使用outer.this来表示外部类对象。

public class Outer {private int id;private String name;private void show() {System.out.println("This is outer class");}class Inner1 {public Inner1(int id, String name){Outer.this.id = id;Outer.this.name = name;}public void show() {System.out.println("id:" + id + ";name:" + name);System.out.println("This is inner1 class");Outer outer = new Outer();outer.show();}}}
public class Test {public static void main(String[] args) {Outer outer = new Outer();Outer.Inner1 inner = outer.new Inner1(1,"wwy");System.out.println("-----------成员内部类-----------");inner.show();}}

二、局部内部类
 1.局部内部类只在方法体中有效,就像定义的局部变量一样,在定义的方法体外不能创建局部内部类的对象。
 2.方法定义局部内部类同方法定义局部变量一样,不能使用private、protected、public等访问修饰说明符修饰,也不能使用static修饰,但可以使用final和   abstract修饰。
 3.方法中的内部类可以访问外部类成员,static方法中定义的内部类可以访问外部类定义的static成员。
public class Outer {public void showInner() {class Inner2 {private int id;private String name;private Inner2(int id, String name){this.id = id;this.name = name;}public void show() {System.out.println("id:" + id + ";name:" + name);System.out.println("This is inner2 class");}}Inner2 inner2 = new Inner2(1, "wwy");inner2.show();}}
public class Test {public static void main(String[] args) {Outer outer = new Outer();System.out.println("-----------局部内部类-----------");outer.showInner();}}

三、静态内部类
 1.与类的其他成员相似,可以用static修饰内部类,这样的类称为静态内部类。
 2.静态内部类与静态方法相似,只能访问外部类的static成员,不能直接访问外部类的实例变量与方法,只有通过对象引用才能访问。由于static内部类不具有任何对外部类实例的引用,因此static内部类中不能使用this关键字来访问外部类中的实例成员,这与一般类的static方法相通。
public class Outer {private static String birthday;public static class Inner3{public Inner3(String birthday){Outer.birthday= birthday;}public void show() {System.out.println("birthday:" + birthday);System.out.println("This is inner3 class");}}}

public class Test {public static void main(String[] args) {System.out.println("-----------静态内部类-----------");Inner3 inner3 = new Inner3("1999-01-01");inner3.show();}}

四、匿名内部类

 定义类的最终目的是创建一个类的实例,但是如果某个类的实例只是用一次,则可以将类的定义与类的创建,放到与一起完成,或者说在定义类的同时就创建一个类,以这种方法定义的没有名字的类成为匿名内部类。

 声明和构造匿名内部类的一般格式如下:

new ClassOrInterfaceName(){    /*类体*/}

    1.匿名内部类可以继承一个类或实现一个接口,这里的ClassOrInterfaceName是匿名内部类所继承的类名或实现的接口名。但匿名内部类不能同时实现一个接口和继承一个类,也不能实现多个接口。如果实现了一个接口,该类是Object类的直接子类,匿名类继承一个类或实现一个接口,不需要extends和implements关键字。
 2.由于匿名内部类没有名称,所以类体中不能定义构造方法,由于不知道类名也不能使用关键字来创建该类的实例。实际上匿名内部类的定义、构造、和第一次使用都发生在同样一个地方。此外,上式是一个表达式,返回的是一个对象的引用,所以可以直接使用或将其复制给一个对象变量。

public class Outer {public Object inner4(String address) {final String finalAddress = address;return new Object() {public String toString() {return "address:" + finalAddress;}};}}
public class Test {public static void main(String[] args) {Outer outer = new Outer();System.out.println("-----------匿名内部类-----------");System.out.println(outer.inner4("China"));}}




0 0
原创粉丝点击