静态内部类和非静态内部类的你真的懂吗?

一:静态内部类:又叫静态嵌套类,静态内部类就是个独立的类,它不持有外部类的对象,自己完全可以独立存在。

之所以要弄这么个东西,只是起到一个注释的效果,而且这个注释可静态检查。
比如有A,B两个类,B有点特殊,虽然可以独立存在,但只被A使用。
这时候怎么办?如果把B并入A里,复杂度提高,搞得A违反单一职责。如果B独立,又可能被其他类(比如同一个包下的C)依赖,不符合设计的本意。所以不如将其变成A.B,等于添加个注释,告诉其他类别使用B了,它只跟A玩。
所以可以说它是为了简化类结构,提高代码封装性而存在

静态内部类的好处
  • 静态内部类不持有外部类的引用,可以完全独立存在,不跟外部类同生共死。
  • 普通内部类不能声明static的方法和变量:
    注意这里说的是变量,常量(也就是final static修饰的属性)还是可以的,而静态内部类形似外部类,没有任何限制。
二:非静态内部类:依赖外部类而存在,它持有外部类的对象。

我在你内部就是我是你的一部分,我了解你,我知道你的全部,没有你就没有我。(所以内部类对象是以外部类对象存在为前提的)

非静态内部类的好处,为什么要使用它?
  • 内部类的第一个好处就体现出来了 隐藏你不想让别人知道的操作,也即封装性
public interface Contents {  
    int value();  
}  
  
public interface Destination {  
    String readLabel();  
}  
  
public class Goods {  
    private class Content implements Contents {  
        private int i = 11;  
        public int value() {  
            return i;  
        }  
    }  
  
    protected class GDestination implements Destination {  
        private String label;  
        private GDestination(String whereTo) {  
            label = whereTo;  
        }  
  
        public String readLabel() {  
            return label;  
        }  
    }  
  
    public Destination dest(String s) {  
        return new GDestination(s);  
    }  
  
    public Contents cont() {  
        return new Content();  
    }  
}  
  
class TestGoods {  
    public static void main(String[] args) {  
        Goods p = new Goods();  
        Contents c = p.cont();  
        Destination d = p.dest("Beijing");  
    }  
}  

在这个例子里类Content和GDestination被定义在了类Goods内部,并且分别有着protected和private修饰符来控制访问级别。Content代表着Goods的内容,而GDestination代表着Goods的目的地。它们分别实现了两个接口Content和Destination。在后面的main方法里,直接用 Contents c和Destination d进行操作,你甚至连这两个内部类的名字都没有看见!这样,内部类的第一个好处就体现出来了 隐藏你不想让别人知道的操作,也即封装性。

  • 内部类持有外部类的引用,与外部类同生共死。内部类甚至可以访问外部类的私有变量。这就为我们在设计时提供了更多的思路和捷径。
  • 可以避免修改接口而实现同一个类中两种同名方法的调用

首先举一个简单的例子,如果你想实现一个接口,但是这个接口中的一个方法和你构想的这个类中的一个方法的名称,参数相同,你应该怎么办?这时候,你可以建一个内部类实现这个接口。由于内部类对外部类的所有内容都是可访问的,所以这样做可以完成所有你直接实现这个接口的功能。
不过你可能要质疑,更改一下方法的不就行了吗?

  • 可以实现多重继承。

这个特点非常重要,个人认为它是内部类存在的最大理由之一。正是由于他的存在使得Java的继承机制更加完善。大家都知道Java只能继承一个类,它的多重继承在我们没有学习内部类之前是用接口来实现的。但使用接口有时候有很多不方便的地方。比如我们实现一个接口就必须实现它里面的所有方法。而有了内部类就不一样了。它可以使我们的类继承多个具体类或抽象类。

名字类。有个字段名字

public class Name {
   public String name()
   {
       return "xiaoming";
   }
}

年龄类

public class Age {
    public int age(){
        return 25;
    }
}

Person 类,

  • 它两个内部类:
    • PersonName , 继承自Name;
    • PersonAge ,继承自Age.
  • 有两个方法:
    • getName(), 返回人的姓名
    • getAge()返回人的年龄
public class Person{
//内部类PersonName 继承自Name
   private class PersonName extends Name{
        public String name(){
          return super.name();
        }
    }
    
// 内部类PersonAge,继承自Age
    private class PersonAge extends Age{
       public int age() {
         return super.age();
       }
    }
    //方法getName
   public String getName(){
    return new PersonName ().name();
   }
   //方法getAge
   public int getAge(){
       return new PersonAge().age();
   }
   //Main方法
   public static void main(String args[]) {
       Peson person=new Person();
       System.out.println("姓名:"+person.getName());
       System.out.println("年龄:"person.getAge());
   }
}

解释:这样person相当于继承了Name类,又继承了Age类。实现了多继承。同样我们这里也看出来内部类的特点,实现封装性,因为我们从外部都看不出来,继承了这两个类。
如有错误,欢迎指正。转载请在文章明显处注明,谢谢!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,783评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,360评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,942评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,507评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,324评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,299评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,685评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,358评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,652评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,704评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,465评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,318评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,711评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,991评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,265评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,661评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,864评论 2 335

推荐阅读更多精彩内容