码迷,mamicode.com
首页 > 其他好文 > 详细

内部类初识

时间:2020-03-10 21:35:36      阅读:53      评论:0      收藏:0      [点我收藏+]

标签:protected   代码   依赖   public   实例   有一个   对象   封装   需要   

内部类初识

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

  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修饰,也就是说,接口中只能定义静态内部类。

内部类初识

标签:protected   代码   依赖   public   实例   有一个   对象   封装   需要   

原文地址:https://www.cnblogs.com/woshi123/p/12458478.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!