zoukankan      html  css  js  c++  java
  • java 内部类

    定义:将一个类的定义放在另一个类的定义内部,这就是内部类。

    为什么要使用内部类?在《Thinking in java》中有这样一句话:使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响

          在我们程序设计中有时候会存在一些使用接口很难解决的问题,这个时候我们可以利用内部类提供的、可以继承多个具体的或者抽象的类的能力来解决这些程序设计问题。可以这样说,接口只是解决了部分问题,而内部类使得多重继承的解决方案变得更加完整

    一个简单的内部类:

     1 /**
     2  * 内部类
     3  * 2016/5/5
     4  **/
     5 package cn.Java_7;
     6 
     7 public class InsideClass {
     8     
     9     class Father{
    10         Father(){
    11             System.out.println("father");
    12         }
    13         public void Fun(){
    14             System.out.println("nihao ");
    15         }
    16     }
    17     
    18     public Father father(){
    19         return new Father();
    20     }
    21     
    22     public static void main(String[] args) {
    23         InsideClass in = new InsideClass();
    24         InsideClass.Father father = in.father();
    25         father.Fun();
    26     }
    27 
    28 }

    如果要在静态方法中创建内部类的对象就必须,像上面一样,写一个方法,方法返回类型就是这个对象的类型。

    链接到外部类:

     1 /**
     2  * 内部类
     3  * 2016/5/5
     4  **/
     5 package cn.Java_7;
     6 
     7 class GrandFather{
     8     GrandFather(){
     9         System.out.println("GrandFather~~~");
    10     }
    11     public void Gfun(){
    12         System.out.println("GrandFather  Gfun");
    13     }
    14 }
    15 
    16 public class InsideClass {
    17     
    18     class Father extends GrandFather{
    19         Father(){
    20             System.out.println("father~~~");
    21         }
    22         public void Fun(){
    23             super.Gfun();
    24             System.out.println("Father  Fun");
    25         }
    26     }
    27     
    28     public Father father(){
    29         return new Father();
    30     }
    31     
    32     public static void main(String[] args) {
    33         InsideClass in = new InsideClass();
    34         InsideClass.Father father = in.father();
    35         father.Fun();
    36     }
    37 
    38 }

      上面代码的内部类继承的外部类,并且可以访问外部类的方法,而内部类只能被外围类所访问,这样提供能更好的封装。

      使用内部类优势小结:

      1、内部类可以用多个实例,每个实例都有自己的状态信息,并且与其他外围对象的信息相互独立。

          2在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或者继承同一个类。

          3内部类并没有令人迷惑的“is-a”关系,他就是一个独立的实体。

          4内部类提供了更好的封装,除了该外围类,其他类都不能访问。

    使用 .this    .new

     1 /**
     2  * 内部类
     3  * 2016/5/5
     4  **/
     5 package cn.Java_7;
     6 
     7 public class InsideClass {
     8     
     9     class Father {
    10         Father(){
    11             System.out.println("father~~~");
    12         }
    13         public void Fun(){
    14             System.out.println("Father  Fun");
    15         }
    16         public InsideClass grandfather(){
    17             return InsideClass.this;
    18         }
    19     }
    20     
    21     public Father father(){
    22         return new Father();
    23     }
    24     
    25     public static void main(String[] args) {
    26         InsideClass in = new InsideClass();
    27         InsideClass.Father father = in.father();
    28         father.Fun();
    29     }
    30 
    31 }

    内部类还有很多其他特性,在这里先总结到这里。

  • 相关阅读:
    老王讲架构:负载均衡
    支付宝系统架构内部剖析
    Effective Java 第三版——61. 基本类型优于装箱的基本类型
    Effective Java 第三版——60. 需要精确的结果时避免使用float和double类型
    Effective Java 第三版——59. 熟悉并使用Java类库
    Effective Java 第三版——58. for-each循环优于传统for循环
    Effective Java 第三版——57. 最小化局部变量的作用域
    Effective Java 第三版——56. 为所有已公开的API元素编写文档注释
    Effective Java 第三版——55. 明智而审慎地返回Optional
    Effective Java 第三版——54. 返回空的数组或集合不要返回null
  • 原文地址:https://www.cnblogs.com/snail-lb/p/5463486.html
Copyright © 2011-2022 走看看