• java 内部类


    定义:

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

    创建外部类:

     1 public class Parcel {
     2     public static void main(String[] args) {
     3         Parcel pp = new Parcel();
     4         pp.ship("test str");
     5         Parcel.Contents content = pp.getContents();
     6     }
     7     class Contents{
     8         private int i = 11;
     9         public int value(){return i;}
    10     }
    11     class Destination{
    12         private String lable;
    13         public Destination(String str){this.lable = str;}
    14         String readLine(){return lable;}
    15     }
    16     public void ship(String dest){
    17         Contents cont = new Contents();
    18         Destination dests = new Destination(dest);
    19         System.out.println(dests.readLine());
    20     }
    21     public Contents getContents(){
    22         return new Contents();
    23     }
    24 }

    可以看见类Contents、Destination都是在Parcel类内部创建的,ship方法内部使用的时候和使用其他类没有什么区别。但是如果别的类想要使用的时候必须是 外部类名.new 内部类名这样使用

    在方法和作用域内内部类:

      内部类不仅能在类的内部创建,也可以在一个方法里面或者任意的作用域内定义。

     1 public class Parcel {
     2     public static void main(String[] args) {
     3         Parcel p = new Parcel();
     4         Destination pp = p.getDesttination("test");
     5         System.out.println(pp.readLine());
     6     }
     7     public Destination getDesttination(String s){
     8         class PDestination implements Destination{
     9             private String label;
    10             private PDestination(String str){label = str;}
    11             @Override
    12             public String readLine() {
    13                 return label;
    14             }
    15         }
    16         return new PDestination(s);
    17     }
    PDestination 类是getDesttination方法的一部分,它的作用域仅在方法内部,在方法之外是不能访问PDestination类的。
    匿名内部类:
     1 public static void main(String[] args) {
     2         Parcel p = new Parcel();
     3         p.getDesttination("str", 200f);
     4     }
     5     public Destinations getDesttination(final String s, final float p){
     6         return new Destinations() {
     7             private int cost;
     8             {
     9                 cost = Math.round(p);
    10                 if (cost >100){
    11                     System.out.println("over load");
    12                 }
    13             }
    14             private String dest = s;
    15             @Override
    16             public String readLine() {
    17                 return dest;
    18             }
    19         };
    20     }
    21 
    22 public interface Destinations {
    23     String readLine();
    24 }

      匿名内部类必须是继承一个类或者是实现一个接口,但是两个不能兼备。并且如果是实现接口,只能实现一个接口

      匿名内部类中不能创建任何静态类或者静态方法。

      匿名内部类不能创建构造器。

      如果匿名内部类想要使用外部参数,该参数必须是final类型的。

    为什么需要内部类:

      一般来说,内部类继承自某个类或实现某个接口,内部类的代码操作创建它的外围类的对象,所以可以认为内部类提供了某种进入其外围类的窗口。但是如果只是需要一个对接口的引用,为什么不能通过外围类实现那个接口?因为如果外围类实现接口能满足需求,就应该这么做。那内部类实现一个接口和外围类实现接口有什么区别?外围类实现接口不是总能体会到接口带来的方便,有时会需要用到接口的实现。所以使用内部类最吸引人的原因是:每个内部类都能独立地继承紫一个(接口)的实现,无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。

    路漫漫其修远兮,吾将上下而求索
  • 相关阅读:
    Codeforces Round #246 (Div. 2) —B. Football Kit
    expected expression __bridge
    ACM-百度之星资格赛之Energy Conversion——hdu4823
    xml解析-jaxp之dom解析
    NTP原理初步与配置
    Android开发学习之TabView选项卡具体解释 -- 基于Android4.4
    Apache轻量级性能測试工具--ab
    BAT的云
    03001_数据库
    ASP.NET调用dos命令获取交换机流量
  • 原文地址:https://www.cnblogs.com/zhangchu/p/12685088.html
Copyright © 2020-2023  润新知