Java内部类的使用小结

来源:互联网 发布:seo发展方向 编辑:程序博客网 时间:2024/05/21 06:29

内部类是指在一个外部类的内部再定义一个类,类名不需要和文件夹相同

内部类可以是静态static的,也可用public,default,protected和private修饰(而外部顶级类即类名和文件名相同的只能使用public和default)

注意:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类,对于一个名为outer的外部类和其内部定义的名为inner的内部类,编译完成后出现outer.class和outer$inner.class两类,所以内部类的成员变量/方法名可以和外部类的相同

成员内部类

成员内部类,就是作为外部类的成员,可以直接使用外部类的所有成员和方法,即使是private的,同时外部类要访问内部类的所有成员变量/方法,则需要通过内部类的对象来获取

要注意的是:成员内部类不能含有static的变量和方法,因为成员内部类需要先创建了外部类,才能创建它自己的,了解这一点,就可以明白更多事情,在此省略更多的细节了

在成员内部类要引用外部类对象时,使用outer.this来表示外部类对象,而需要创建内部类对象,可以使用outer.inner obj = outerobj.new inner();

public class Outer {     int b=4;    private int a=4;    public static void main(String[] args) {         Outer outer = new Outer();         Outer.Inner inner = outer.new Inner();         inner.print("Outer.new");         inner = outer.getInner();         inner.print("Outer.get");     }     // 个人推荐使用getxxx()来获取成员内部类,尤其是该内部类的构造函数无参数时     public Inner getInner() {         return new Inner();     }     public class Inner {        Outer outer=new Outer();        int b=3;         public void print(String str) {             System.out.println(this.b);//访问内部类的b            System.out.println(b);//访问内部类的b            System.out.println(outer.b);//访问外部类的b            System.out.println(Outer.this.b);//访问外部类的b            System.out.println(a);//访问外部类的a        }     } } 

局部内部类

局部内部类(方法内部类)是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内

class People{    public People() {   }}class Man{    public Man(){   }}public void show(){    int b=1;    final int a=2;    class Woman extends People{  //局部内部类        public void print(){            System.out.println(b);//不能直接访问类外的局部变量            System.out.println(a);//加final后可以访问        }   }   Woman woman=new Woman();   woman.print();}

注意,局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的

静态内部类

静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一个关键字static,静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法,这点很好理解,因为在没有外部类的对象的情况下,可以创建静态内部类的对象,如果允许访问外部类的非static成员就会产生矛盾,因为外部类的非static成员必须依附于具体的对象

public class Outer {    private int a=2;    static int b=1;    public static class Inner{        int b=2;        public void test(){            System.out.println(Outer.b);//访问外部类的静态b            System.out.println(new Outer().a);//访问外部类的非静态成员        }    }   public static void main(String[] args){        Inner o=new Inner();//建立静态内部类的对象        o.test();   }}public class Test{    public static void main(String[] args){        Outer.Inner o=new Outer.Inner();//在其他类中直接建立Inner内部类对象    }}

匿名内部类

匿名内部类也就是没有名字的内部类,正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写,但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口,匿名内部类产生的文件名称:”Person$1.class”原因:匿名内部类没有名称,并且只有一个类,数字表示第几个匿名内部类

实例1:不使用匿名内部类来实现抽象方法

abstract class Person {    public abstract void eat();}class Child extends Person {    public void eat() {        System.out.println("eat something");    }}public class Demo {    public static void main(String[] args) {        Person p = new Child();        p.eat();    }}

实例2:匿名内部类的基本实现

abstract class Person {    public abstract void eat();}public class Demo {    public static void main(String[] args) {        Person p = new Person() {            public void eat() {                System.out.println("eat something");            }        };        p.eat();    }}

实例3:在接口上使用匿名内部类

interface Person {    public void eat();}public class Demo {    public static void main(String[] args) {        Person p = new Person() {            public void eat() {                System.out.println("eat something");            }        };        p.eat();    }}

实例4:Thread类的匿名内部类实现

public class Demo {    public static void main(String[] args) {        Thread t = new Thread() {            public void run() {                for (int i = 1; i <= 5; i++) {                    System.out.print(i + " ");                }            }        };        t.start();    }}

实例5:Runnable接口的匿名内部类实现

public class Demo {    public static void main(String[] args) {        Runnable r = new Runnable() {            public void run() {                for (int i = 1; i <= 5; i++) {                    System.out.print(i + " ");                }            }        };        Thread t = new Thread(r);        t.start();    }}
0 0
原创粉丝点击