内部类

来源:互联网 发布:网络运维 英文缩写 编辑:程序博客网 时间:2024/06/05 16:44

内部类

  • 含义:内部类是指在一个类里面在定义一个类,叫做内部类。类名不需要和文件名相同。

  • 内部类可以是静态static的,也可以是public、private、protected和default修饰的。(外部类类名必须和文件名相同)

  • 内部类是编译时的概念,一旦编译成功就会成为两个不同的类。例如定义一个名Outer的外部类,内部类定义为Inner。编译后就会出现outer.class和outer$inner.class两个类,所以,内部类的成员和方法名可以和外部类相同。
  • 内部类可以直接访问外部类的成员,外部类访问内部类需要先new对象。

  • 内部类可以分为:成员内部类、 静态内部类,匿名内部类和局部内部类四种。

1、成员内部类:

成员内部类,就是作为外部类的成员,可以直接使用外部类所有的成员和方法,即使外部类的成员用private修饰的,也仍然可以使用。同时,外部类访问内部类的成员和方法,需要通过内部类的对象去获取。具体操作Outer.Inner inner=new Outer().new Inner()

代码实例:

public class Outer{    public staitc void main(String[] args){        Outer outer = new Outer();  //创建外部类对象        Outer.Inner inner = outer.new Inner();//外部类访问内部类方法        inner.print("外部类调用内部类");        inner = outer.getInner();        inner.print("内部类使用外部类方法");    }    public Inner getInner(){         return new Inner();    }    public class Inner{//定义内部类        public void String(Str){           System.out.println(str);        }    }}

输出结果:

外部类调用内部类内部类使用外部类方法

2、静态内部类:

被static修饰的内部类称为静态内部类。

  • 静态内部类不需要有外部类对象。(静态内部类创建不需要有外部类)
  • 静态内部类不能访问非静态成员。

代码实例:

public class Outer { //外部类private String sex;public static String name = "张三";static class Inner{    //静态内部类    public static String name1 = "李四"; //在静态内部类中可以存在静态成员    public void display(){  //静态内部类不能访问非静态的方法。不过可以和外部类方法同名。    System.out.println("外部类 name :" + name);    }}public void display(){   System.out.println("内部类 name: "+Inner.name1);//外部类访问静态内部类:内部类.成员属性    new Inner().display();   //静态内部类 可以直接创建实例不需要依赖于外部类}public static void main(String[] args) {    Outer outer = new Outer();    outer.display();    }}

输出结果:

内部类 name: 李四外部类 name: 张三

3、匿名内部类:

匿名内部类,从字面意思上说,匿名就是没有名字,没有名字的类。

  • 匿名内部类只使用一次的类,通常定义成匿名内部类。
  • 匿名内部类不能有构造方法。
  • 匿名内部类不能有public、static、default和protected修饰,也就是说没有访问修饰符。
  • 匿名内部类不能定义任何静态成员,静态方法。

代码实例:

public class Outer {  //定义外部类public Inner getInner(final int num){      return new Inner(){   //匿名内部类写法        int number = num + 3;        public int getNumber(){            return number;        }    };}public static void main(String[] args) {    Outer out = new Outer();    Inner inner = out.getInner(2);    System.out.println("和为:"+inner.getNumber());}class Inner {  //定义内部类    int getNumber() {        return 0;        }    }}

输出结果:

和为:5

4、局部内部类:

局部内部类:在方法、构造方法或者静态代码块等内部定义的类成为局部内部类。

  • 局部内部类不能加任何权限修饰符,因为他只对局部有效。
  • 局部内部类可以用final、abstract修饰。
  • 访问局部内部类必须先有外部类对象。
  • 如果内部类中有与外部类同名的变量,直接用变量名访问的是内部类的变量,
    用this.变量名访问的是内部类变量,用外部类名.this.内部类变量名访问的是外部类变量。

代码实例:

public class Parcel {private void internalTracking(boolean b) {    if (b) {        class TrackingSlip {            private String id; //局部内部类的成员属性            TrackingSlip(String str) { //局部内部类构造方法                id = str;            }            String getSlip() { // 局部内部类的成员方法                return id;            }        }        TrackingSlip ts = new TrackingSlip("局部内部类被调用了");        String string = ts.getSlip();  //调用局部内部类的方法:对象.方法名(局部内部类里面的)        System.out.println(string); // 测试打印语句       }  }    public void track() {      internalTracking(true); }  public static void main(String[] args) {      Parcel parcel = new Parcel();      parcel.track();   }}

输出结果:

局部内部类被调用了
原创粉丝点击