zoukankan      html  css  js  c++  java
  • 内部类的作用

    本文参考自

    mike11https://www.cnblogs.com/uu5666/p/8185061.html

    首先明确什么是内部类:放在类内部的类称为内部类。它主要有以下4个作用:

    1)内部类可以很好地实现隐藏

    一般非内部类,是不允许有private与protected权限的,但内部类可以。

    2)内部类拥有外部类的所有元素的访问权限

    3)可以实现多重继承

    4)可以避免修改接口而实现同一个类中两种同名方法的调用

    举例说明:

    1)实现隐藏

    一般我们对类的访问权限,都是通过类前面的访问修饰符来限制的,非内部类和内部类有着很大不同。如:

    /**
     * 接口
     */
    public interface TestInterface {
      void show();
    }
    /**
     * 实现类
     */
    public class TestExample {
      /**
       * 内部类 访问权限修饰符可以是private、protected
       */
      private class InsideClassI implements TestInterface{
        @Override
        public void show() {
          System.out.println("内部类的作用之private修饰");
        }
      }
       protected class InsideClassII implements TestInterface{
         @Override
         public void show() {
           System.out.println("内部类的作用之protected修饰");
         }
       }
      /**
       * 获取内部类方法
       */
      public TestInterface getInsideClass(){
        return new InsideClassI();
      }
    }
    /**
     * 测试类
     */
    public class Test {
      public static void main(String[] args) {
        TestExample example = new TestExample();
        TestInterface insideClass = example.getInsideClass();
        insideClass.show();
      }
    }

    通过TestExample的getInsideClass()方法可以得到一个TestInterface的实例,但是并不知道这个实例的实现过程,由于insideClass是private修饰的,如果不看代码也不能知道这个具体类的名字,因此内部类实现了很好的隐藏。

    2)可以无条件地访问外部元素

    /**
     * 定义一个类
     */
    public class Person {
      private  String name;
      private  Integer age;
      private  char gender;
      /**
       * 内部类
       */
      private class Student{
        public Student(){
          System.out.println(name);
        }
      }
    
      /**
       * 普通方法
       */
      public void show(){
        new Student();
      }
    
      public static void main(String[] args) {
        Person p = new Person();
        p.show();
      }
    }

    name变量在Person类中定义且是私有的,但是内部类Student可以直接访问,不需要条件。

    3)可以实现多重继承

    这是内部类最大的特点,它使Java继承机制更加完善。因为Java是单继承的,多重继承在没有内部类之前是通过接口来实现的,但使用接口有许多限制的地方,比如实现一个接口就必须实现它里面的所有方法,而内部类就不同了,它可以使我们的类继承多个具体类或抽象类。

    /**
     * 样类1
     */
    public class Example1 {
      public String name(){
        return "zhangsan";
      }
    }
    /**
     * 样类2
     */
    public class Example2 {
      public int age(){
        return 26;
      }
    }
    /**
     * 样类3
     */
    public class ExampleMain {
      /**
       * 内部类test1
       */
      private class test1 extends Example1{
        public String name(){
          return super.name();
        }
      }
      /**
       * 内部类test2
       */
      private class test2 extends Example2{
        public int age(){
          return super.age();
        }
      }
    
      public String name(){
        return new test1().name();
      }
      public int age(){
        return new test2().age();
      }
    
      public static void main(String[] args) {
        ExampleMain em = new ExampleMain();
        System.out.println("姓名:"+em.name());
        System.out.println("年龄:"+em.age());
      }
    }

    测试结果:

     从上述事例中可以看到,样类3中的两个内部类使得样类3拥有了样类1和样类2的属性和方法,即间接实现了多继承。

    4)避免修改接口而实现同一个类中两种同名方法的调用。

    当一个类要继承一个类并实现一个接口时,但是要继承的类和要实现的接口中存在同名的方法,这时候如何去区分?内部类可以解决这种问题。

    /**
     * 样类1
     */
    public class Example1 {
      public String name(){
        return "zhangsan";
      }
      void show(){
      }
    }
    /**
     * 接口
     */
    public interface TestInterface {
      void show();
    }
    /**
     * 样类2
     */
    public class Example2 extends Example1 {
      public int age(){
        return 26;
      }
      private class InnerClass implements TestInterface{
        @Override
        public void show() {
    
        }
      }
      TestInterface getInnerClass(){
        return new InnerClass();
      }
    }

    样类2使用内部类实现接口,避免了与外部类的方法重名的冲突。

  • 相关阅读:
    BZOJ 3997: [TJOI2015]组合数学 [偏序关系 DP]
    [Sdoi2017]新生舞会 [01分数规划 二分图最大权匹配]
    [Sdoi2017]相关分析 [线段树]
    [Sdoi2017]硬币游戏 [高斯消元 KMP]
    [Sdoi2017]序列计数 [矩阵快速幂]
    [Sdoi2017]树点涂色 [lct 线段树]
    [Sdoi2017]数字表格 [莫比乌斯反演]
    BZOJ 3160: 万径人踪灭 [fft manacher]
    Rabbitmq常见测试
    MQ(消息队列)功能介绍
  • 原文地址:https://www.cnblogs.com/sinoaccer/p/12024531.html
Copyright © 2011-2022 走看看