java嵌套类和内部类、匿名类

来源:互联网 发布:淘宝店铺怎样上传宝贝 编辑:程序博客网 时间:2024/04/29 11:20

java嵌套类和内部类、匿名类

1、嵌套类和内部类定义

可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型:静态嵌套类和非静态嵌套类。静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为内部类(inner)。其中inner类又可分为三种:
  1)在一个类(外部类)中直接定义的内部类;
  2)在一个方法(外部类的方法)中定义的内部类;
  3)匿名内部类。

2、静态嵌套类

<pre name="code" class="java">public class StaticInnerClassTest {    private static String msg="Hello";    private  String city="Beijing";    static class Person {        private String name;        public int age;        public Person(String name, int age) {            this.name = name;            this.age = age;        }        public void displayMsg(){            //只能访问外部类的静态变量            System.out.println("Msg="+msg);            //System.out.println("City=" + city);        }    }    public void printInfo(){        Person person = new Person("jack",23);        System.out.println("#################");        person.displayMsg();        System.out.println("#################");        System.out.println("name ="+person.name);        System.out.println("age ="+person.age);     }    public static void main(String[] args) {        StaticInnerClassTest test=new StaticInnerClassTest();        test.printInfo();    }}
运行结果:

#################

Msg=Hello

#################

name =jack

age =23

特点:1、静态方法不能直接访问非静态成员(静态方法不能直接访问非静态成员)。   2、外部类访问内部类的的成员有些特别,不能直接访问,但可以通过内部类直接访问,这是因为静态嵌套内的所有成员和方法默认为       静态变量和静态方法。   3、内部静态类Person只在类StaticInnerClassTest内访问。

3、内部类

public class InnerClassTest {    private String outerMsg= "outer Hello";    class Inner {        public String innerPublicMsg = "inner public msg:Hello";        private String innerPrivateMsg = "inner private msg:Hello";        public void display() {            System.out.println("\n##################  Inner display");            System.out.println("Inner display(Outer):" + outerMsg);        }    }    void printInfo() {        Inner inner = new Inner();        inner.display();        System.out.println("\n##################  Outer printInfo");        System.out.println("Inner(Public):" + inner.innerPublicMsg);//可以访问        System.out.println("Inner(Private):" + inner.innerPrivateMsg);//可以访问//        System.out.println("Inner(Private):" + innerPrivateMsg);//不可以访问        InnerTwo innerTwo = new InnerTwo();        innerTwo.show();    }    class InnerTwo {        Inner inner = new Inner();        public void show() {            inner.display();//可以访问            System.out.println("\n##################  InnerTwo show");            System.out.println("Inner(Public):" + inner.innerPublicMsg);//可以访问            System.out.println("Inner(Private):" + inner.innerPrivateMsg);//可以访问//        System.out.println("Inner(Private):" + innerPrivateMsg);//不可以访问        }    }    public static void main(String args[]) {        InnerClassTest outer = new InnerClassTest();        outer.printInfo();    }}
运行结果:
##################  Inner display
Inner display(Outer):outer Hello


##################  Outer printInfo
Inner(Public):inner public msg:Hello
Inner(Private):inner private msg:Hello


##################  Inner display
Inner display(Outer):outer Hello


##################  InnerTwo show
Inner(Public):inner public msg:Hello
Inner(Private):inner private msg:Hello

特点:1、可以访问外部类的所有成员
   2、外部类访问内部类的的成员通过内部类直接访问。
   3、内部只在外部类和外部类的其它内部类内访问。

4、匿名内部类

abstract class Person {    public abstract void showCareer();}public class Teacher extends Person{    @Override    public void showCareer() {        System.out.println("Career is Teacher");    }}public interface Tree {    void showTreeName();}public class AnonymousInnerClass {    public static void main(String[] args) {        System.out.println("################# 常规");        normal();        System.out.println("################# 覆盖父类方法");        extendsInner();        System.out.println("################# 抽象类");        abstractInner();        System.out.println("################# 接口");        interfaceInner();    }    //覆盖父类方法    private static void extendsInner() {        Person person = new Teacher() {            @Override            public void showCareer() {                System.out.println("Career is Worker");            }        };        person.showCareer();    }    //正常    public static void normal() {        Person person = new Teacher();        person.showCareer();    }    //匿名内部类 抽象类 实现    public static void abstractInner() {        Person person = new Person() {            @Override            public void showCareer() {                System.out.println("Career is lawyer");            }        };        person.showCareer();    }    //匿名内部类 接口 实现    public static void interfaceInner() {        Tree tree = new Tree() {            public void showTreeName() {                System.out.println("This is Apple Tree");            }        };        tree.showTreeName();    }}
运行结果:
################# 常规
Career is Teacher
################# 覆盖父类方法
Career is Worker
################# 抽象类
Career is lawyer
################# 接口
This is Apple Tree




1 0
原创粉丝点击