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

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值