精华内容
下载资源
问答
  • 匿名内部类特性
    2021-02-20 16:49:23

    匿名内部类就是没有名字的内部类

    特点:

    • 必须继承一个抽象类或者实现一个接口
    • 匿名内部类不能定义任何静态成员和静态方法以及构造方法(匿名内部类无名)
    • 当所在的方法的形参需要被匿名内部类使用时,必须声明为final (jdk8之前要手动加上final,在jdk8及以后编译会帮我们自动加上final)

    原因:生命周期不一致

    局部变量存储在栈中,当方法执行结束后,非final的局部变量就被销毁。而局部内部类对局部变量的引用依然存在,如果局部内部类要调用局部变量时,就会出现错误,或者说不是程序员想要的结果。如果加了final,可以确保局部内部类使用的变量于外层的局部变量分开,会始终指向原先的地址,从而解决了问题

    • 匿名内部类不能是抽象的,他必须要实现继承的类或者实现的接口的所有的抽象方法
    • 没有名字,匿名了
    • 匿名内部类不能是抽象类,因为在创建匿名内部类的时候,会立即创建匿名内部类的对象
    更多相关内容
  • 在那些修改中,引人注目的是内部类匿名类。如运用得当,它们可使程序更易理解和维护。本文介绍内部类匿名类在Java代码中是如何具体工作的,如何正确使用它们,以及如何避免一些常见的错误。 下面来看看这些特性...
  • 2.匿名内部类特性(关键) * 1.匿名内部类可以访问所有的外部的成员,包括私有的; * 2.不能添加访问修饰符,因为匿名内部类也是一个局部变量; * 3.作用域 : 仅在定义它的方法或代码块中有效; * 4.匿名...

    1.什么是匿名内部类

    定义 :
    1.匿名内部类是定义在类的局部位置,如方法中、代码块中,且没有明确的类名
    2.是一个内部类,本质还是一个类
    3.没有类名;
    4.同时还是一个对象

    2.匿名内部类的特性(关键)

     *         1.匿名内部类可以访问所有的外部类的成员,包括私有的;
     *         2.不能添加访问修饰符,因为匿名内部类也是一个局部变量;
     *         3.作用域 : 仅在定义它的方法或代码块中有效;
     *         4.匿名内部类 访问 外部类的成员的方式 : 直接访问;
     *         5.外部其他类 访问 匿名内部类的方式 : 不可以访问,匿名内部类是一个局部变量;
     *         6.如果 外部类 和 匿名内部类 的成员重名时,默认遵循就近原则,
     *           如果就是想访问 外部类的成员时,使用 【外部类名.this.成员】 的方式;
     *         7.匿名内部类是没有名字的,所以也无需写构造器;
     *         8.匿名内部类的运行时类型是 【外部类名+$+数字】
    

    3.匿名内部类的语法

     *  匿名内部类有两种实现方式:1.实现接口;2.继承一个类。
     *  格式如下 : 
     *         new 接口名/类名(args...){
     *             //内容
     *         };
    

    4.匿名内部类的示例代码

    4.1 声明一个接口

    package com.northcastle.B_niming_innerClass;
    
    /**
     * author : northcastle
     * createTime:2022/2/9
     */
    public interface InterfaceA {
        void sayHello();
    }
    
    

    4.2 声明一个抽象类

    package com.northcastle.B_niming_innerClass;
    
    /**
     * author : northcastle
     * createTime:2022/2/9
     */
    public abstract class ClassA {
        abstract void sayHi();
    }
    
    

    4.3 真正的匿名内部类的代码(核心代码,必看)

    package com.northcastle.B_niming_innerClass;
    
    /**
     * author : northcastle
     * createTime:2022/2/9
     */
    
    /**
     * 本案例演示 : 匿名内部类
     */
    public class NimingInnerClass {
    
        //1.外部类的成员
        private String field01 = "外部类的私有属性field01";
        public String field02 = "外部类的共有属性field02";
        //2.外部类的构造器
        public NimingInnerClass() {
        }
        public NimingInnerClass(String field01, String field02) {
            this.field01 = field01;
            this.field02 = field02;
        }
        //3.外部类的方法
    
        /**
         * 3.1 一个普通的方法
         */
        public void method01(){
            System.out.println("外部类的方法:method01");
        }
    
        /**
         * 3.2 实现接口的匿名内部类
         */
        public void method02(){
            //这个方法中包含实现接口的匿名内部类
            //1.匿名内部类的定义
            InterfaceA interfaceA_niming = new InterfaceA() {
                public String field01 = "接口+匿名内部类中的field01";
                @Override
                public void sayHello() {
                    System.out.println("接口+实现接口的匿名内部类对你说 : Hello");
                    //2.使用匿名内部类的属性
                    System.out.println("接口匿名内部类的field01 : "+field01);
                    System.out.println("外部类的field01 : "+NimingInnerClass.this.field01);
                    System.out.println("外部类的field02 : "+field02);
                }
            };
            //3.判断匿名内部类类型 : 编译类型、运行时类型
            System.out.println("接口+匿名内部类 的运行时类型 : "+interfaceA_niming.getClass());
            //4.运行匿名内部类对象的方法
            interfaceA_niming.sayHello();
    
        }
    
        /**
         * 3.3. 继承类的匿名内部类
         */
        public void method03(){
            //这个方法中包含实现类的匿名内部类
            //1.匿名内部类的定义
            ClassA classA_niming = new ClassA() {
    
                public String field01 = "类+匿名内部类中的field01";
    
                @Override
                void sayHi() {
                    System.out.println("类+匿名内部类对你说 : Hi");
                    //2.使用匿名内部类的属性
                    System.out.println("类+匿名内部类的field01 : "+field01);
                    System.out.println("外部类的field01 : "+NimingInnerClass.this.field01);
                    System.out.println("外部类的field02 : "+field02);
                }
            };
            //3.判断匿名内部类类型 : 编译类型、运行时类型
            System.out.println("类+匿名内部类 的运行时类型 : "+classA_niming.getClass());
            //4.运行匿名内部类的对象的方法
            classA_niming.sayHi();
    
        }
    
        /**
         * 3.4 作为实参的匿名内部类
         * @param interfaceA
         */
        public void method04(InterfaceA interfaceA){
            // 这里演示最常用的使用方式 : 匿名内部类作为实参传入方法中
            interfaceA.sayHello();
        }
    
    }
    
    

    4.4 外部其他类对匿名内部类的使用

    package com.northcastle.B_niming_innerClass;
    
    /**
     * author : northcastle
     * createTime:2022/2/9
     */
    public class Application {
        public static void main(String[] args) {
            //1.定义一个外部类的对象
            NimingInnerClass nimingInnerClass = new NimingInnerClass();
    
            //2.调用外部类对象的方法
            nimingInnerClass.method01();//普通方法
            System.out.println("==============================");
            
            nimingInnerClass.method02();//包含匿名内部类的方法
            System.out.println("==============================");
            
            nimingInnerClass.method03();//包含匿名内部类的方法
            System.out.println("==============================");
            
            nimingInnerClass.method04(new InterfaceA() { //匿名内部类作为参数的方法
                @Override
                public void sayHello() {
                    System.out.println("实参中的匿名内部类向你说 Hello啦");
                }
            });
        }
    }
    
    

    4.5 运行结果

    运行结果与特性中表述的一致。

    在这里插入图片描述

    5.完成

    Congratulations!
    You are one step closer to success!

    展开全文
  • 3.1 匿名内部类特性1. 匿名内部类总是默认实现某个接口或继承某个抽象。2.不能有构造方法,只能有一个实例。3. 不能定义在任何静态成员、静态方法。4. 不能是public.protected.privatestatic.5. 匿名内部类为局部...

    3. 匿名内部类

    没有名字的内部类就是匿名内部类。

    3.1 匿名内部类特性

    1. 匿名内部类总是默认实现某个接口或继承某个抽象类。

    2.不能有构造方法,只能有一个实例。

    3. 不能定义在任何静态成员、静态方法。

    4. 不能是public.protected.private static.

    5. 匿名内部类为局部的,所以局部内部类的所有限制都对其有效。

    3.2  匿名内部类的使用方式

    一、继承式的匿名内部类: 就是new 抽象类。

    示例:

    package 匿名内部类抽象类练习;

    public abstract class Tv {

    //打开电视

    public abstract void open();

    //关闭电视

    public abstract void close();

    //换台

    public abstract void turn();

    }

    package 匿名内部类抽象类练习;

    public class Summer {

    public static Tv extendsTv() {

    Tv tv = new Tv() {

    @Override

    public void open() {

    System.out.println("打开三星电视...");

    }

    @Override

    public void close() {

    System.out.println("关闭三星电视...");

    }

    @Override

    public void turn() {

    System.out.println("对三星电视进行换台...");

    }

    };

    //tv.open();

    //tv.close();

    //tv.turn();

    return tv;

    }

    }

    package 匿名内部类抽象类练习;

    public class XiaoMi {

    public static Tv extendsTv() {

    //匿名内部类... 抽象类的实现 ...

    Tv tv = new Tv() {

    @Override

    public void open() {

    System.out.println("打开小米电视...");

    }

    @Override

    public void close() {

    System.out.println("关闭小米电视...");

    }

    @Override

    public void turn() {

    System.out.println("对小米电视进行换台...");

    }

    };

    //tv.open();

    //tv.close();

    //tv.turn();

    return tv;

    }

    }

    package 匿名内部类抽象类练习;

    public class Test {

    public static void main(String[] args) {

    Tv xiaomi = XiaoMi.extendsTv();

    xiaomi.open();

    xiaomi.turn();

    xiaomi.close();

    System.out.println("------------------------------");

    Tv summer = Summer.extendsTv();

    summer.open();

    summer.turn();

    summer.close();

    }

    }

    展开全文
  • Java在嵌套类型这里提供的特性比较多,假设:Java的字节码只支持静态嵌套内部类、局部内部类匿名局部内部类都是编译器提供的语法糖,这个假设目前没法验证(看不懂字节码),本文先来看一下C#是如何为我们提供...
  • /*** 匿名内部类的概念和特性:* 1、匿名内部类只能也必须(有且仅有)继承一个父类或者实现一个接口,也可以重写父类普通方法;* 2、匿名内部类不能是抽象,因为定义匿名内部类时立即生成对象,而抽象不允许生成...

    此篇和上一篇的“使用抽象类”方式相互印证。

    /**

    * 匿名内部类的概念和特性:

    * 1、匿名内部类只能也必须(有且仅有)继承一个父类或者实现一个接口,也可以重写父类普通方法;

    * 2、匿名内部类不能是抽象类,因为定义匿名内部类时立即生成对象,而抽象类不允许生成对象;

    * 3、匿名内部类没有类型,所以不能显式定义构造器,有一个隐式的无参构造器;

    * 4、匿名内部类可以定义初始化块以初始化对象,以弥补没有构造器的缺陷;

    * 5、最常用的匿名内部类的形式是:创建某个接口/抽象类的对象;

    * 6、定义之后必须马上使用,没办法通过引用进行使用;

    * 7、在匿名内部类和局部内部类中被访问到的局部变量,Java8之后默认为有final修饰,不可以重新赋值;

    */

    定义一个接口:关于校园活动

    1 public interfaceICampusActivity {2 public abstract String getProject(); //获取活动项目

    3 public abstract int getStuNumber(); //获取活动人数

    4 }

    定义一个使用到这个接口的类:

    1 public class AnonymousClass{ //定义一个类

    2 public void test(ICampusActivity ca) { //test方法需要一个接口类型作为参数

    3 System.out.println("正在进行的活动是:" +ca.getProject());4 System.out.println("参加活动的人数是:" +ca.getStuNumber());5 }6 }

    定义一个测试类:

    1 public classTest {2 public static voidmain(String[] args) {3 int locationVar = 100;4 //locationVar = 1000;//代码1

    5 AnonymousClassac = newAnonymousClass();6 ac.test(new ICampusActivity() { //创建一个匿名内部类,需要实现接口/抽象类所有的抽象方法

    7 {8 System.out.println("匿名内部类的初始化块");9 }10 @Override11 public intgetStuNumber() {12 return 15 +locationVar;13 }14

    15 @Override16 publicString getProject() {17 return "马拉松训练";18 }19 });20 }21 }

    特别说明:如果“代码1"处的赋值语句没有被注释,则第12行会报错,参考本文开始处第7点!

    输出结果:

    23bc881894237d31b33fe8e278332ec0.png

    变体:其实可以定义一个接口的实现类,然后把这个实现类传给那个test方法作为参数:

    1 class implClass implementsICampusActivity {2 @Override3 publicString getProject() {4 return "马拉松训练";5 }6

    7 @Override8 public intgetStuNumber() {9 return 15;10 }11 }

    然后把这个类的一个实例传给test方法:

    ac.test(new implClass());

    效果是一样的!!!

    欢迎各路大神多多评论,指教!

    展开全文
  • 内部详解————匿名内部类

    千次阅读 2018-05-05 13:14:29
    内部三连击: ...由于匿名内部类不利于代码的重用,因此,一般在确定此内部只会使用一次时,才会使用匿名内部类。 形式 public class OutterClass { public Runnable task() { return new Run...
  • 匿名内部类的使用

    2020-10-27 23:52:45
    匿名内部类的使用 首先先搞定什么事匿名内部类 顾名思义,匿名内部类就是省去命名的 上代码 public static void main(String[] args) { new fulei() { void test2() { System.out.println("内部2"); } ...
  • 一、因为在创建匿名内部类的时候,会立即创建它的实例,可知匿名内部类不能是抽象,所以其必须继承一个抽象或者实现一个接口。 二、匿名内部类没有类名,因此没有构造方法。 三、匿名内部类访问的外部成员变量...
  •  之前介绍了Lambda表达式是匿名内部类的一种简化,因此它可以部分取代匿名内部类的作用。 相同点   * Lambda表达式与匿名内部类一样,都可以直接访问"effectively final"的局部变量,以及外部的成员变量。   *...
  • 匿名内部类特点及注意

    千次阅读 2017-10-09 12:17:52
    匿名内部类也就是没有名字的内部,无class关键字,直接使用new来生成一个对象的引用正因为没有名字,所以匿名内部类只能使用一次 匿名内部类还有个前提条件:必须继承一个父类(抽象,普通)或实现一个接口...
  • 即使是升级到JDK1.8了,但是很多开发者依然是停留在1.8之前的开发方式,使用的也是非常老旧和过时的API,遇到函数式接口也是依然使用匿名内部类解决。 本系列课程从Lambda表达式、方法的引用、Stream API三处着手...
  • 内部匿名内部类

    2014-03-26 23:06:28
    一、内部类的访问规则: 1. 内部类可以直接访问外部中的成员,包括私有;是因为内部类持有了外部的引用。格式:外部.this。 2. 外部要访问内部类必须建立内部类对象。 class Outer { private int x = ...
  • Java 局部内部匿名内部类详解

    千次阅读 2019-08-19 00:34:02
    外部内部类 众所周知,每个java文件必须有一个与这个java文件同名的外部,这个外部可以是public或default的。而除了这个同名外部,还可以有与这个同名外部平级的其他外部,但它们必须是default的。 而...
  • 就来说一说这个匿名内部类,用Java做例子,后面插一点c#。这个东西我之前也知道了很久,一直没有认真去看过,这次就来看看吧,今天的代码量相对很多。 匿名内部类 这里就说匿名内部类,关于其他内部老规矩,以后...
  • JAVA8 匿名内部类和lambda表达式

    万次阅读 多人点赞 2017-07-16 19:29:30
     匿名内部类适合创建那种只需要一次使用的,例如前面介绍命令模式时所需要的Command对象,匿名内部类的语法有点奇怪,创建匿名内部类时会立即创建一个该的实例,这个的定义立即消失,匿名内部类不能重复使用...
  • java匿名内部类和lambda(匿名方法)

    千次阅读 2019-07-28 13:05:21
    匿名内部类 内部分4种:成员内部,静态内部,局部内部匿名内部类。我们今天讨论的就是其中最常见的匿名内部类。从名称可以看出,就是没有名字的,因为没有名字,所以总归和其它普通有一些些区别: ...
  • Java 1.1通过对Java语言规范进行...在那些修改中,最引人注目的就是内部类匿名类。如运用得当,它们可使程序更易理解和维护。本文来看看这些特性具体是如何工作的,如何正确使用它们,以及如何避免一些常见的错误。
  • 简单说就是在一个内部又定义了一个,这个定义在已知类内部就称为"内部类”。由于是定义在一个已知内部,所以它既具备一个累的特征,又在很多方面的表现和普通有不同。 下面,我打算从...
  • Java中的多态、内部匿名内部类

    千次阅读 2014-06-20 22:37:26
    想要定义匿名内部类:前提是内部必须继承一个或者实现接口。 2、匿名内部类的格式:new 父类名&接口名(){ 定义子类成员或者覆盖父类方法 }.方法。 3、 匿名内部类的使用场景: 当函数的参数是接口类型...
  • Java内部类(Inner Class),类似的概念在C++里也有,那就是嵌套(Nested Class),乍看上去内部类似乎有些多余,它的用处对于初学者来说可能并不是那么显著,但是随着对它的深入了解,你会发现Java的设计者在内部...
  • Day_10 面向对象多态 匿名内部类

    千次阅读 2022-01-19 17:29:18
    Java基本数据类型的特性 : 自动提升和强制转换 -> 基本数据类型之间的类型转换问题! //byte,short,char < int < long < float < double 多态的本质描述的就是 : Java引用数据类型子父类之间类型...
  • Java细节–Lambda表达式与匿名内部类的联系和区别 我们知道,lambda表达式是匿名内部类的一种简化,因此它具有代替匿名内部类的作用 相同点 1.Lambda表达式与匿名内部类一样,都可以直接访问"effectively final...
  • Java高级特性内部类

    千次阅读 2021-03-11 11:20:36
    内部主要有以下几:成员内部、局部内部、静态内部匿名内部类。成员内部:一般意义上的内部。局部内部:当内部只在某方法中创建对象时,可以将声明在该方法内匿名内部类:当...
  • java之匿名内部类中的多态

    千次阅读 2017-04-01 17:36:34
    接口,抽象匿名内部类实现多态
  • 有些情况下,我们把一个放在另一个内部定义,称为内部类(innerclasses)。 内部类可以使用public、default、protected 、private以及static修饰。而外部顶级(我们以前接触的)只能使用public和default修饰...
  • 匿名内部类与lambda表达式 匿名内部类, 简言之,是指没有名称的java,它可以通过继承...lambda表达式,简言之,是JDK1.8的新特性,是从匿名内部类发展而来的。我们可以理解它就是函数式接口的实例。 下面我写...
  • 说支持了闭包,是因为编译器编译的时候其实悄悄对函数做了手脚,偷偷把外部环境方法的x和y局部变量,拷贝了一份到匿名内部类里。如下面的代码所示。 所以用R大回答里的原话说就是: Java编译器...
  • lambda和匿名内部类

    万次阅读 2019-01-11 19:47:42
    接口与相似点: 一个接口可以有多个方法。 接口文件保存在 .java 结尾的文件中,文件名使用接口名。 接口的字节码文件保存在 .class 结尾的文件中。 接口相应的字节码文件必须在与包名称相匹配的目录结构中。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 89,904
精华内容 35,961
热门标签
关键字:

匿名内部类特性