美文网首页
内部类,匿名内部类

内部类,匿名内部类

作者: 向日花开 | 来源:发表于2016-12-22 11:29 被阅读63次

内部类

内部类: 定义在类的内部,内部类所在的类称之为外部类。

定义格式:

    class 外部类的名{

      class 内部类的名{

       }
    }

案例

public class Demo {
    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.run();//Inner say()-->40
        //Inner say() Outer.this.num-->10

        //创建内部类的对象
        Outer.Inner inner = outer.new Inner();
        inner.say();//Inner say()-->40
        //Inner say() Outer.this.num-->10

        //创建静态成员的内部类对象
        Outer.Inner_2 inner2 = new Outer.Inner_2();
        inner2.say();//inner 2 say()

    }
}

class Outer {
    int num = 10; //外部类的成员变量

    //内部类作为外问部的成员,如果要访问内部类,需要通过类的对象访问
    class Inner {
        public static final int IP = 100;

        int num = 40;

        public void say() {

            System.out.println("Inner say()-->" + num);

            System.out.println("Inner say() Outer.this.num-->" + Outer.this.num);//在内部类中可以访问其所在外部类的成员
        }
    }

    public void run() {
        Inner inner = new Inner();
        inner.say();
    }

    //外部类的静态成员
    static class Inner_2 {

        public static void say() {
            System.out.println("inner 2 say()");
            //System.out.println("inner 2 say()"+num);//出错:静态内部类不能访问外部类的非静态成员
        }
    }
}

匿名内部类

定义在类的成员方法中的内部类。

案例

public class Demo {

    public static void main(String[] args) {
        Outer1 outer = new Outer1();
        outer.fun();//fun->Inner say()100
    }
}

class Outer1 {

    public void fun() {
        final int num = 100; //注:在jdk 1.8之后,局部内部类访问的局部变量是有效的

        //声明局部内部类
        class Inner {
            public void say() {
                //局部内部类中,如果要访问局变量时,则局部变量需要final修饰
                System.out.println("fun->Inner say()" + num);
            }
        }

        Inner inner = new Inner();
        inner.say();

    }

}

匿名内部类实现接口

/**
 * 匿名内部类实现接口
 * 使用场景:你叫舍友给你收一下衣服,收完之后给你说一声;
 * 建模: CallBack(收完衣服的结果) Sheyou(舍友)  You(你)
 * 接口回调
 */
public class Demo3 {
    public static void main(String[] args) {
        You you = new You();//创建一个你
        Sheyou leifeng = new Sheyou("雷锋");  //创建一个雷锋同学
        you.requestShouyifu(leifeng);//委托雷锋舍友收衣服
    }
}


interface CallBack {
    void result(String msg);
}

class You  {
    /**
     * 请求舍友帮你收衣服(客气点)
     *
     * @param sheyou
     */
    public void requestShouyifu(Sheyou sheyou) {
        System.out.println(sheyou.name + "请帮我收一下衣服,要下雨了");
        sheyou.shouyifu(new CallBack() {
            @Override
            public void result(String msg) {
                System.out.println("我知道" + msg);
            }
        });
    }

}

class Sheyou {
    String name;

    public Sheyou(String name) {
        this.name = name;
    }

    //收衣服
    public void shouyifu(CallBack callBack) {
        System.out.println(this.name + "收衣服中...");
        callBack.result("衣服已经收好了。" + "\t" + this.name + "收的.");
    }
}

运行结果

静态内部类(Static Nested Class)和内部类(Inner Class)的区别?

静态内部类是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化。

下面的代码哪些地方会产生编译错误?
class Outer {

    class Inner {}

    public static void foo() { new Inner(); }

    public void bar() { new Inner(); }

    public static void main(String[] args) {
        new Inner();
    }
}

Java中非静态内部类对象的创建要依赖其外部类对象,上面的面试题中foo和main方法都是静态方法,静态方法中没有this,也就是说没有所谓的外部类对象,因此无法创建内部类对象。正确的姿势:

    new Outer().new Inner();
Anonymous Inner Class(匿名内部类)是否可以继承其它类?是否可以实现接口?

可以继承其他类或实现其他接口

内部类可以引用它的包含类(外部类)的成员吗?有没有什么限制?

一个内部类对象可以访问创建它的外部类对象的成员,包括私有成员

相关文章

  • 内部类

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

  • Java 内部类

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

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

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

  • java 内部类

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

  • Java匿名内部类

    导语 学完匿名内部类就懂的情书。 主要内容 接口与抽象类和匿名内部类的关系 具体内容 匿名内部类也就是没有名字的内...

  • java中的匿名内部类总结

    匿名内部类也就是没有名字的内部类 正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写 但使用匿名内...

  • Java 内部类

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

  • Java内部类

    Java内部类,简单来说就是将一个类定义在另一个类或者方法里面,主要分为成员内部类,局部内部类,匿名内部类和静态内...

  • java se 成员内部类

    一个类内部包含另一个类身体与心脏分类:1、成员内部类2、局部内部类(匿名内部类) 1、成员内部类 注:内用外可直接...

  • Android菜鸟起飞|三种方法实现监听事件

    Android实现监听事件的三种方式(匿名内部内实现,外部类实现,接口实现)详解 1. 使用匿名内部类的方式实现监...

网友评论

      本文标题:内部类,匿名内部类

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