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成员。
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
- Java内部类的小结
- Java内部类的小结
- Java 内部类的小结
- java内部类小结
- Java内部类小结
- java内部类小结
- Java内部类小结
- Java 内部类小结
- Java内部类小结
- Java内部类小结
- java内部类小结
- Java内部类小结
- Java内部类小结
- java 内部类小结
- java内部类小结
- Java内部类小结
- Java内部类的使用小结
- Java内部类的使用小结
- scikit learning——用k邻近算法进行分类实例
- centos彻底删除文件夹、文件命令(centos 新建、删除、移动、复制等命令)
- JavaScript快速上手之9:while循环
- VirtualBox安装Ubuntu时花屏问题解决
- Python实战小程序——密码加密小工具(Crypto库)
- Java内部类的小结
- 说说cglib动态代理
- Android锁屏、重启、关机开发!简单直接
- va_list 可变参数
- Linux下执行可执行文件提示:No such file or directory的解决方法
- LeeCode No.28 Implement strStr()
- 补11.8
- Starting From A Decision.
- 笔记