1、内部类基础知识:
一般定义在java类内部的类成为内部类
内部类可以分为:定义在方法体外部的类、定义方法内部的类、静态内部类(只能定义在方法外部),匿名内部类
说明:
定义在方法外面的类:
类的成员变量(静态、非静态)可以访问,为了保证能够正确的引用的类的成员变量,所以必须先实例化外部类的对象,才可以实例化内部类的对象
访问权限可以任何,可以把它看成类的成员变量,这样理解就好多来了。
定义在方法体内的类;
类的成员变量(静态、非静态)可以访问,为了保证能够正确的引用的类的成员变量,所以必须先实例化外部类的对象,才可以实例化内部类的对象
访问权限不可以有,把他看成方法的局部变量就可以了。
静态内部类:
只能访问类的静态成员变量
访问权限任何
匿名内部类:
类的成员变量(静态、非静态)可以访问,为了保证能够正确的引用的类的成员变量,所以必须先实例化外部类的对象,才可以实例化内部类的对象
访问权限不可以有
2、内部类的作用
内部类可以很好的隐藏类,一般类不允许有private protect default访问权限。
内部类可以实现多重基础,弥补了java不能多继承的特点
3、例子
- package com.ajun.test.innerclass.example;
-
- /**
- * 水果内容
- * @author Administrator
- *
- */
- public interface Contents {
- String value();
- }
- package com.ajun.test.innerclass.example;
-
- /**
- * 水果目的地
- * @author Administrator
- *
- */
- public interface Destination {
-
- //目的地
- String readLabel();
- }
- package com.ajun.test.innerclass.example;
-
- public class Goods {
-
- private String des="is ruit!!";
-
- //方法外部
- private class Content implements Contents{
- private String name = "apple "+des;
- @Override
- public String value() {
- return name;
- }
- }
-
- //方法外部
- private class GDestination implements Destination{
- private String label ;
- private GDestination(String label){
- this.label= label;
- }
- @Override
- public String readLabel() {
- return label;
- }
- }
-
-
- //匿名内部类
- public Destination getdestination(final String label){
- return new Destination(){
- @Override
- public String readLabel() {
- return label;
- }
- };
- }
-
- public Destination dest(String s){
- return new GDestination(s);
- }
-
- public Contents content(){
- return new Content();
- }
-
- public Destination dest2(String s){
- class GDestination implements Destination{
- private String label;
- private GDestination(String label){
- this.label= label;
- }
- @Override
- public String readLabel() {
- return label;
- }
- }
- return new GDestination(s);
- }
-
- }
- package com.ajun.test.innerclass.example;
-
- public class Test {
-
- public static void main(String [] a){
- Goods gs = new Goods();
- Contents c = gs.content();
- Destination d = gs.dest("Beijing");
- System.out.println(c.value());
- System.out.println(d.readLabel());
- Destination d1 = gs.getdestination("Shanghai");
- System.out.println(d1.readLabel());
- System.out.println(gs.dest2("Tianjin").readLabel());
- }
- }
其中Content和Gdestination得到了很好的隐藏,外面调用的时候,根本就不知道调用的是具体哪个类,使这个类拥有多继承的特性。
输出;- apple is ruit!!
- Beijing
- Shanghai
- Tianjin