内部类

作者: erki_stwee | 来源:发表于2018-05-22 19:59 被阅读11次

为什么要使用内部类

<Think in Java>这样描述:使用内部类最吸引人的原因是:每个内部类都能独立地继承一个实现。所以无论外围类是否已经继承了某个实现,对于内部类没有影响。

接口知识解决了部分问题,而内部类使得多重继承的解决方案变得更加完整。

内部类优点

  • 在单个外围类中,可以让多个内部类以不同方式实现同一接口,或者继承同一个类。
  • 创建内部类对象的时候并不依赖外围类对象的创建。
  • 内部类没有is-a关系。他就是一个独立的实体。
  • 内部类提供了更好的封装,除了外部类。其他类不能访问。

常见内部类分类

成员内部类

可以看成外围类的一个成员,可以无限制访问外围类的所有成员属性和方法;但是外围类要访问内部类的成员属性和方法需要通过内部类实例来访问。

注意事项

  • 成员内部类中不能存在任何static的变量和方法。
  • 成员内部类是依附于外围类的,所以之后县城建了外围类才能创建内部类。
public class OuterClass {
    private String str;

    public void outerDisplay(){
        System.out.println("outerClass...");
    }

    class InnerClass{
        public void innerDisplay(){
            str = " inner str";
            System.out.println(str);
            outerDisplay();
        }
    }
    //推荐使用这种方式获取成员内部类
    public InnerClass getInnerClass(){
        return new InnerClass();
    }

    public static void main(String [] args){
        OuterClass outerClass = new OuterClass();
        OuterClass.InnerClass innerClass = outerClass.getInnerClass();
        innerClass.innerDisplay();
    }
}
输出结果
 inner str
outerClass...
局部内部类

它只在该方法和属性中被使用,出了该方法和属性就会失效

public class Parcel5 {  
    public Destionation destionation(String str){  
        class PDestionation implements Destionation{  
            private String label;  
            private PDestionation(String whereTo){  
                label = whereTo;  
            }  
            public String readLabel(){  
                return label;  
            }  
        }  
        return new PDestionation(str);  
    }  
      
    public static void main(String[] args) {  
        Parcel5 parcel5 = new Parcel5();  
        Destionation d = parcel5.destionation("chenssy");  
    }  
} 
public class Parcel6 {  
    private void internalTracking(boolean b){  
        if(b){  
            class TrackingSlip{  
                private String id;  
                TrackingSlip(String s) {  
                    id = s;  
                }  
                String getSlip(){  
                    return id;  
                }  
            }  
            TrackingSlip ts = new TrackingSlip("chenssy");  
            String string = ts.getSlip();  
        }  
    }  
      
    public void track(){  
        internalTracking(true);  
    }  
      
    public static void main(String[] args) {  
        Parcel6 parcel6 = new Parcel6();  
        parcel6.track();  
    }  
} 
匿名内部类
public class OuterClass {
    private String str;

    public void outerDisplay(){
        System.out.println("outerClass...");
    }

    public InnerClass getInnerClass(final int num , String str){
        return new InnerClass(){
            int number = num + 3;
            public int getNumber(){
                return number;
            }
        };
    }

    public static void main(String [] args){
        OuterClass out = new OuterClass();
        InnerClass innerClass = out.getInnerClass(2, "chenssy");
        System.out.println(innerClass.getNumber());
    }
}
输出结果
5
  • 匿名内部类没有修饰符
  • new匿名内部类,这个类首先要存在
  • 匿名内部类是没有构造方法的
静态内部类

静态内部类与非静态内部类之间最大的区别在于非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围内,但是静态内部类却没有。没有这个引用就意味着:

  • 它的创建是不需要依赖于外围类的。
  • 它不能使用任何外围类的非static成员变量和方法。

相关文章

  • 内部类

    成员内部类 局部内部类(定义在方法内和定义在作用域内的类) 匿名内部类

  • Java 内部类

    内部类包括成员内部类、方法内部类、*静态内部类、匿名内部类*。 内部类的作用 由于内部类的实现和外部类没有关系,内...

  • Java学习——内部类

    内部类 一,成员内部类(包括静态内部类和非静态内部类) 非静态内部类可以直接访问外部类的成员,反之则不行 非静态内...

  • Java 内部类、静态内部类、方法内部类(未完待续)

    内部类 什么是内部类?内部类其实就是在一个类中创建的类。内部类有四种: 成员内部类 静态内部类 局部内部类 匿名内...

  • java 内部类

    一般有四种内部类的使用方式: 嵌套的内部类 方法内的内部类 静态内部类 匿名内部类 什么时候用内部类: 有时候明显...

  • 内部类

    内部类 1.可以访问访问其外部类所有属性和方法,无需创建外部类对象 2.必须创建内部类对象,否则无法从外部类访问内...

  • Java 中的方法内部类

    Java 中的方法内部类 方法内部类就是内部类定义在外部类的方法中,方法内部类只在该方法的内部可见,即只在该方法内...

  • java——内部类

    内部类 定义: 内部类是指在一个外部类的内部再定义一个类。内部类作为外部类的一个成员,并且依附于外部类而存在的。内...

  • java之面向对象5

    方法内部类: 简而言之就是定义在外部类的方法内的类。 方法内部类只在该方法的内部可见,即只在该方法内可以使用。 方...

  • Java 内部类

    1. 内部类 概念:在一个类的内部再定义一个完整的类内部类分为 4 类:成员内部类、静态内部类、局部内部类、匿名内...

网友评论

      本文标题:内部类

      本文链接:https://www.haomeiwen.com/subject/mxykjftx.html