内部类初识

Posted woshi123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内部类初识相关的知识,希望对你有一定的参考价值。

内部类初识

用内部类的原因有以下几种:

  1. 内部类提供了更好的封装,如果内部类声明成private访问权限的话,那就只有外部类能够调用它了,同一个包的其他类都不能访问。
  2. 比如说Cow类和CowLeg类,CowLeg类如果离开了Cow将毫无意义,就可以把CowLeg类定义成Cow类的内部类
  3. 内部类可访问外部类的所有成员变量,外部类不一定能访问到内部类的成员(如果内部类的访问权限是private的话)
  4. 匿名内部类适合用于创建那些仅需要一次使用的类。

内部类与外部类的区别:

  1. 内部类比外部类可以多使用3个修饰符:private、protected、static——外部类不可以使用这3个修饰符

非静态内部类

非静态内部类不能拥有静态成员

public class OutClass {
    private String val = "000";

    private class InClass{
        private String val = "123";


        public void showval(){
            System.out.println("外部类的val:"+OutClass.this.val);   //因为非静态内部类寄生在外部类的实例中,所以会持有外部类实例的引用this
            System.out.println("内部类的val:"+this.val);  //或者直接val
        }
    }

    public void showvalByInClass(){
        InClass inClass = new InClass(); //外部类如果像访问内部类的成员,则必须要创建内部类对象
        inClass.showval();     //换而言之,如果有一个内部类存在,则一定有一个它所寄生的外部类存在(无法脱离外部类而存在(在private修饰情况下))
    }
}
class TestInClass{
    public static void main(String[] args) {
        OutClass outClass = new OutClass();
        outClass.showvalByInClass();
    }
}

而且根据静态成员不能访问非静态成员的规则,外部类的静态方法、静态代码块不能访问非静态内部类

静态内部类(类内部类)

如果使用static来修饰内部类,则这个内部类就属于外部类本身,而不属于外部类的某个实例。

静态内部类可以包含静态成员,也可以包含非静态成员。根据静态成员不能访问非静态成员的规则,静态内部类不能访问外部类的实例成员,只能访问外部类的类成员(静态成员)。

public class OutClass {
    private static String val = "000";

    private static class InClass{

        private static String sval = "456"; 
        private String val = "123";//即使用pirvate修饰,外部类还是可以通过创建内部类的实例来直接访问,然而不是外部类就不行了


        public void showOutval(){
            System.out.println("外部类的val:"+OutClass.val);//静态内部类不必再依赖于外部类的实例而生,所以不会再持有其所寄生的外部类实例的引用
        }
    }

    public void InClassval(){
        System.out.println(InClass.sval);
        System.out.println(new InClass().val);
        new InClass().showOutval();
    }

}
class TestInClass{
    public static void main(String[] args) {
        OutClass outClass = new OutClass();
        outClass.InClassval();
    }
}

接口中的内部类

Java允许在接口中定义内部类,接口里定义的内部类默认使用(也只能使用)public static修饰,也就是说,接口中只能定义静态内部类。

以上是关于内部类初识的主要内容,如果未能解决你的问题,请参考以下文章

16.初识内部类

初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段

初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段

错误:这个片段内部类应该是静态的 [ValidFragment]

片段 - 全局视图变量与本地和内部类侦听器和内存泄漏

为啥片段类应该是公开的?