• java内部类的作用


    java内部类的作用

     定义:

    放在一个类的内部的类我们就叫内部类。

    二、 作用:

    1.内部类可以很好的实现隐藏

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

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

    3.可是实现多重继承

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

    三、   例子

    1.实现隐藏

       平时我们对类的访问权限,都是通过类前面的访问修饰符来限制的,一般的非内部类,是不允许有 private 与protected权限的,但内部类可以,所以我们能通过内部类来隐藏我们的信息。可以看下面的例子

    接口:

    1 package insidecategory;
    2  
    3 public interface InterfaceTest {
    4   void increment();
    5 }

    具体类:

     1 package insidecategory;
     2     public class Example {
     3    private class InsideClass implements InterfaceTest {
     4        public void test() {
     5          System.out.println("这是一个测试");
     6        }
    } 7 8 public InterfaceTest getIn() { 9      return new InsideClass(); 10 } 11 }

    客户端程序:

    package insidecategory;
     
    public class TestExample {
      public static void main(String args[]) {
        Example a=new Example();
        InterfaceTest a1=a.getIn();
        a1.test();
      }
    }

    getIn()方法能返回一个InterfaceTest 实例但我并不知道这个实例是这么实现的。而且由于InsideClass 是private的,所以我们如果不看代码的话根本看不到这个具体类的名字,所以说它可以很好的实现隐藏。

    2.可以无条件地访问外围类的所有元素:

    package insidecategory;
     
    public class TagBean {
      private String name="liutao";
     
       private class InTest {
        public InTest() {
            System.out.println(name);
           }
      }
     
       public void test() {<br>    new InTest();<br>  }
     
       public static void main(String args[]) {
        TagBean bb=new TagBean();
        bb.test();
      }
    }

      name这个变量是在TagBean里面定义的私有变量。这个变量在内部类中可以无条件地访问System.out.println(name);

     3.可以实现多重继承

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

    类一:

    package insidecategory;
     
    public class Example1 {
      public String name() {
        return "liutao";
      }
    }

    类二:

    package insidecategory;
     
    public class Example2 {
      public int age() {
        return 25;
      }
    }

    类三:

    package insidecategory;
     
    public class MainExample {
      private class test1 extends Example1 {
        public String name() {
          return super.name();
        }
       }
     
        private class test2 extends Example2 {
         public int age() {<br>       return super.age();<br>     }
        }
     
       public String name() {
        return new test1().name();<br>   }
     
       public int age() {
        return new test2().age();<br>   }
     
       public static void main(String args[]) {
     
           MainExample mi=new MainExample();
     
           System.out.println("姓名:"+mi.name());
     
           System.out.println("年龄:"+mi.age());
     
       }
     
    }

    大家注意看类三,里面分别实现了两个内部类 test1,和test2 ,test1类又继承了Example1,test2继承了Example2,这样我们的类三MainExample就拥有了Example1和Example2的方法和属性,也就间接地实现了多继承。

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

     大家假想一下如果,你的类要继承一个类,还要实现一个接口,可是你发觉你继承的类和接口里面有两个同名的方法怎么办?你怎么区分它们??这就需要我们的内部类了。看下面的代码:

    接口:

    package insidecategory;
     
    public interface Incrementable {
     
     void increment();
    }

    类 MyIncrement:

    package insidecategory;
     
    public class MyIncrement {
      public void increment() {
     
            System.out.println("Other increment()");
     
        }
     
        static void f(MyIncrement f)  {
     
            f.increment();
     
        }
    }

    大家看上面加黑的部分,两个方法都是一样的。在看下面这个类要继承这两个类

    如果不用内部类:

    package insidecategory;
     
    public class Callee2 extends MyIncrement implements Incrementable {
     
        public void increment() {
     
            //代码
     
        }
    }

    想问一下大家increment()这个方法是属于覆盖MyIncrement这里的方法呢?还是Incrementable这里的方法。我怎么能调到MyIncrement这里的方法?显然这是不好区分的。而我们如果用内部类就很好解决这一问题了。看下面代码

    package insidecategory;
     
    public class Callee2 extends MyIncrement {
     
     private int i=0;
     
     private void incr() {
     
           i++;
     
           System.out.println(i);
     
     }
     
     private class Closure implements Incrementable {
     
          public void increment() {
     
            incr();
     
          }
     
     }
     
     Incrementable getCallbackReference() {
     
          return new Closure();
     }
     
    }


    我们可以用内部类来实现接口,这样就不会与外围类的方法冲突了。

  • 相关阅读:
    MySql 用户 及权限操作
    MAC 重置MySQL root 密码
    在mac系统安装Apache Tomcat的详细步骤[转]
    Maven:mirror和repository 区别
    ES6 入门系列
    转场动画CALayer (Transition)
    OC 异常处理
    Foundation 框架
    Enum枚举
    Invalid App Store Icon. The App Store Icon in the asset catalog in 'xxx.app' can’t be transparent nor contain an alpha channel.
  • 原文地址:https://www.cnblogs.com/dw3306/p/9465609.html
Copyright © 2020-2023  润新知