一、内部类类型

内部类类型

二、内部类详解

1、成员内部类(代码中出现中文命名是为了增加可读性,不推荐使用中文命名!!!)

/**
 * @program: untitledDemo
 * @description: 成员内部类的使用
 * @author: crazy
 * @create: 2020-04-21 09:49
 **/
public class 外部类 {
    private int out = 1;
    private static int out1=0;
    protected int out2 =2;
    public 外部类(int out){
        this.out = out;
    }
    class 内部类{
        public void 访问(){
            //成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)
            System.out.println("外部类的私有变量"+out);
            System.out.println("外部类私有静态变量"+out1);
            System.out.println("外部类受保护的变量"+out2);
        }
    }

    public static void main(String[] args) {
        外部类 o = new 外部类(1);
        外部类.内部类 i = o.new 内部类();
        i.访问();

    }
}
运行结果

结论: 成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。 在外部类中如果要访问成员内部类的成员,必须先创建一个成员内部类的对象,再通过指向这个对象的引用来访问

注意的是,当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问的是成员内部类的成员。如果要访问外部类的同名成员,需要以下面的形式进行访问:

外部类.this.成员变量

外部类.this.成员方法

/**
 * @program: untitledDemo
 * @description: 内部类的使用
 * @author: crazy
 * @create: 2020-04-21 09:49
 **/
public class 外部类 {
    private int out = 1;

    public 外部类(int out){
        this.out = out;
    }
    class 内部类{
        private int out = 10;
        public void 访问(){
            //成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)
            System.out.println("外部类的私有变量 "+外部类.this.out);
            System.out.println("内部类与外部类变量同名 "+out);
        }
    }

    public static void main(String[] args) {
        外部类 o = new 外部类(1);
        外部类.内部类 i = o.new 内部类();
        i.访问();
    }
}

//输出:
    外部类的私有变量 1
    内部类与外部类变量同名 10

创建成员内部类的方法:

        外部类 o = new 外部类(1);
        外部类.内部类 i = o.new 内部类();

或者

外部类.内部类 ii = o.getInnerInstance();//声明一个方法用来初始化内部类

内部类可以拥有private访问权限、protected访问权限、public访问权限及包访问权限。如果成员内部类Inner用private修饰,则只能在外部类的内部访问,如果用public修饰,则任何地方都能访问;如果用protected修饰,则只能在同一个包下或者继承外部类的情况下访问;如果是默认访问权限,则只能在同一个包下访问。这一点和外部类有一点不一样,外部类只能被public和包访问两种权限修饰。可以将成员内部类理解为是一个变量

2、局部内部类

class People{
    public People() {
         
    }
}
 
class Man{
    public Man(){
         
    }
     
    public People getWoman(){
        class Woman extends People{   //局部内部类
            int age =0;
        }
        return new Woman();
    }
}

注意,局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。

局部内部类和其他内部类相比的一个优点,就是局部内部类可以访问方法的参数。

3、匿名内部类

匿名内部类应该是平时我们编写代码时用得最多的,在编写事件监听的代码时使用匿名内部类不但方便,而且使代码更加容易维护

/**
 * @program: untitledDemo
 * @description: 匿名内部类
 * @author: crazy
 * @create: 2020-04-22 08:53
 **/
public class Outter {
    public interface Inner {
        public String say();
    }
        public void method1(Inner inner) {
            System.out.println(inner.say());
        }
        public static void main(String[] args) {
            Outter outer = new Outter();
            // 测试1,Inner为接口
            outer.method1(new Inner() {
                @Override
                public String say() {
                    return null;
                }
            });
        }
}

匿名内部类是唯一一种没有构造器的类。正因为其没有构造器,所以匿名内部类的使用范围非常有限,大部分匿名内部类用于接口回调。匿名内部类在编译的时候由系统自动起名为Outter$1.class。一般来说,匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写。

4、静态内部类

静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一个关键字static。静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法,这点很好理解,因为在没有外部类的对象的情况下,可以创建静态内部类的对象,如果允许访问外部类的非static成员就会产生矛盾,因为外部类的非static成员必须依附于具体的对象。

分类: Java

0 条评论

发表评论

电子邮件地址不会被公开。