精华内容
下载资源
问答
  • 匿名内部类定义构造方法
    2022-03-25 19:34:56

    问题1:

    首先我们都知道,接口和抽象都是不能用new来实例化的。

    疑问:那么为什么按钮单机事件setOnClickListener中new的是一个接口(OnClickListener)?

            这个问题先放一放。看见这个问题知道了,原来接口是可以new,只是不能实例化而已。那么又出来了一个问题。

    疑问:接口和抽象类new出来是个什么东西呢?

    可以使用匿名类的方式new出来,但必须实现接口中的所有接口方法和抽象类中的所有抽象方法。

    回到第一个疑问:那么为什么按钮单机事件setOnClickListener中new的是一个接口(OnClickListener)?

    这是实质上是使用匿名接口来实现匿名内部类的, 匿名接口这样写是会自动生成一个实现了该接口的匿名类。

    问题2:匿名内部类没有构造器,编译时又哪来的

    问题由来:局部内部类和匿名内部类只能访问局部final(局部变量和形参都必须用final),(jdk1.8之前需要人为加,在jdk1.8之后不需要加final因为局部变量和形参都默认添加了final)。

    探讨这个问题到匿名内部类访问外部形参的时候看到了:匿名内部类Test$1的构造器含有两个参数,一个是指向外部类对象的引用,一个是int型变量。(等等,匿名内部类不是没有构造器的吗?这是怎么来的)。

            匿名内部类是没有构造函数的,但是可以使用基类的构造函数。

    疑问:那用接口实现的匿名内部类是什么情况呢,它又没有构造函数。

            当通过接口来创建匿名内部类时,匿名内部类不能显示创建构造器,因此匿名内部类里只有一个隐式的无参构造器,故new接口名后的括号里不能传入参数值。

    总结:

            当通过接口来创建匿名内部类时,匿名内部类不能显示创建构造器,因此匿名内部类里只有一个隐式的无参构造器,故new接口名后的括号里不能传入参数值。

            如果通过继承父类来创建匿名内部类时,匿名内部类将拥有和父类相似的构造器,此处的相似指的是拥有相同的形参列表。

    当然,为了弥补没有构造器的缺陷,匿名内部类可以定义初始化块以初始化对象;

    更多相关内容
  • 主要简单给我们介绍了java中匿名内部类构造函数,并附上了简单的示例,有需要的小伙伴可以参考下。
  • 我们都知道,接口是没有构造方法的,同时匿名内部类也是没有构造方法的。原因有这几点:1.接口只是一个声明,需要有一个实现实现这个接口。2.匿名内部类是匿名了,也就是说没有类名,所以就没有构造方法。但是我们...

    在使用多线程的时候,时常会使用两种方式实现,一种是直接继承Thread类来实现多线程,另外一种就是实现Runnable接口。

    我们都知道,接口是没有构造方法的,同时匿名内部类也是没有构造方法的。原因有这几点:1.接口只是一个声明,需要有一个实现类实现这个接口。2.匿名内部类是匿名了,也就是说没有类名,所以就没有构造方法。

    但是我们在new一个接口的时候常常会使用这种方式,就是用匿名内部类的方式去实现。

    1 Runnable runnable=newRunnable() {2

    3 @Override4 public voidrun() {5 for(int i=0;i<50;i++){6 System.out.println(i);7 }8 }9

    10 };

    在这里有一个new Runable(){},就是这里的Runnable(),这不就是构造方法吗?怎么会出现一个构造方法?

    这时候突然想到一点就是Java所有的类都会默认继承一个Object类,而接口也是一个类,匿名内部类也是一个类,所以我就想是不是这里继承了Object,之后我在代码中加入了toString方法来确定是否含有Object类的内容。

    1 Runnable runnable=newRunnable() {2

    3 @Override4 public voidrun() {5 for(int i=0;i<50;i++){6 System.out.println(i);7 }8 }9

    10 @Override11 publicString toString(){12 return "hello";13 }14

    15 };

    在这里使用了@Override注解证明了使用了Object法,另一个验证就是运行程序会发现内有重写方法的时候是类名和哈希值,改写后输出的是“Hello”。

    那么我们就可以猜想,如果Runnable()调用了,是不是就证明了这时的Runnable向上转型成了Object类型,那么这里实际上调用了Object类中的构造方法,为了验证这一点我使用了IDEA的跟踪代码功能。发现使用super关键字的时候,代码跟踪到了Object方法,基本确定了这时调用了Object的构造方法。

    =========================================

    10.png

    展开全文
  • java匿名内部类什么是匿名内部类匿名内部类的使用场景?匿名内部类如何创建?匿名内部类的实现和使用例1(实现接口)例2(继承) 什么是匿名内部类匿名内部类,顾名思义,就是不知道这个到底是什么名字,也...

    什么是匿名内部类?

    匿名内部类,顾名思义,就是不知道这个类到底是什么名字,也就是不知道类名。

    匿名内部类的使用场景?

    匿名内部类适合创建那种只需要使用一次的类,也就是说创建一个匿名内部类,只需要用一次即可。

    匿名内部类如何创建?

    new 类名(参数) | 实现接口()
    {
    // 匿名内部类的类体部分
    }
    从上面的定义可以看出,匿名内部类必须继承一个父类,或实现一个接口,但最多只能继承一个父类,或者实现一个接口。
    两个规则:
    	匿名内部类不能是抽象类。
    	匿名内部类不能定义构造器。由于匿名内部类没有类名,所以无法定义构造器,但匿名内部类可以初始化块,可以通过初始化块来完成构造器需要完成的工作。
    

    匿名内部类的实现和使用

    例1(实现接口)

    首先,定义一个匿名类要实现的接口,代码如下

    public interface Product{
     double getPrice();
     String getName();
    

    然后,定义一个实体类,实体类定义一个方法,方法的参数为上述的接口对象,到时候会传入一个匿名类对象,这个匿名类实现了上述创建的接口,代码如下

    public class Anony{
    	public void test(Product product){
    	System.out.println("购买了一个"+product.getName()+",花掉了"+product.getPrice());
    	}
    }
    

    最后测试运行:

    pubic class Test{
    	public static void main(String[] args){
    		Anony anony=new Anony();
    		// 注意,此处要传入一个匿名类对象
    		anony.test(new Product(){
    			@Override
    			public double getPrice(){
    					return 578.6;
    				}
    			@Override
    			public String getName(){
    					return "联想笔记本";
    				}
    			}
    		);
    	}
    }
    

    输出:

    购买了一个联想笔记本,花掉了578.6
    

    总结:此处匿名内部类的作用就是实现了一个接口,创建了一个实现了该接口的类的对象,然后重写了这个接口中的方法。

    例2(继承类)

    首先,定义一个匿名类需要实现的抽象类,代码如下:

    public abstract class Device{
    	private String name;
    	public abstract double  getPrice();
    	public String getName(){
    	 	return name;
    	}
    	public Device(){}
    	public Device(String name){
    		this.name=name;
    	}
    } 
    

    然后,定义一个实体类,实体类定义一个方法,方法的参数为上述的抽象类对象,到时候会传入一个匿名类对象,这个匿名类继承了上述创建的抽象类,代码如下

    public class Anony {
    
        public void test(Device device){
            System.out.println("购买了一个"+device.getName()+"花费了"+device.getPrice());
        }
    }
    

    最后测试运行:

    pubic class Test{
    	public static void main(String[] args){
    		Anony anony=new Anony();
    		// 注意,此处要传入一个匿名类对象
    		anony.test(new Device("海尔电视机"){
    			@Override
    			public double getPrice(){
    					return 578.6;
    				}
    		);
    		Device device=new Device(){
    			@Override
    			public double getPrice(){
    				return 556.56;
    			}
    			@Override
    			public String getName(){
    				return "美的电视机";
    			}
    		};
    		annoy.test(device);
    	}
    }
    

    输出:

    购买了一个海尔电视机,花掉了578.6
    购买了一个美的电视机,花掉了556.56
    

    总结:对象匿名类中继承抽象类,对于抽象类里面的抽象方法,必须要重写,对象抽象类里面的非抽象方法,可重写也可以不重写。

    展开全文
  • 主要介绍了Java匿名内部类原理与用法,结合实例形式分析了Java匿名内部类的概念、原理、应用与相关操作注意事项,需要的朋友可以参考下
  • 1.匿名内部类定义的局部位置,如方法中、代码块中,且没有明确的类名; 2.是一个内部,本质还是一个; 3.没有类名; 4.同时还是一个对象。 2.匿名内部类的特性(关键) * 1.匿名内部类可以访问所有的...

    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!

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

    2020-08-30 19:47:50
    主要对java中的匿名内部类的详细总结,需要的朋友可以参考下
  • 主要介绍了Java匿名匿名内部类,结合实例形式分析了Java匿名匿名内部类相关原理、用法及操作注意事项,需要的朋友可以参考下
  • java 匿名内部类

    千次阅读 2022-04-10 09:07:39
    要使用匿名内部类,可将引用对象的代码替换为关键字 new、对构造函数的调用以及用大括号 ({和})括起的类定义。 既然是匿名,所以你无法在别的地方实例化和使用这个匿名内部类也可用于接口(interface)的...
  • 匿名内部类方法重写(很常用)

    千次阅读 2020-05-19 11:38:47
    二是使用匿名内部类的方式重写其方法,也可以达到相同的效果,并且代码更加简洁。在这里第一种方法就不说了,重点看看第二种方法是怎么个用法 。 一个NIO处理目录树的例子 目录树意味着一个目录里既有文件也有子目录...
  • Java的匿名内部类详细解读

    千次阅读 2021-11-18 23:34:03
    **# 一、匿名内部类定义 最本质的还是一个 是一个内部(有关内部的内容不在这里讲述了) 该没有名字(但是系统会分配一个代号在内存中) 二、匿名内部类的应用场景 假设我们有一个接口A 内部有一个未被...
  • Java匿名内部类使用与示例

    千次阅读 2021-02-25 19:47:42
    在不同的包内的内调用的protected方法(其实,也可以理解和第一个原因是一样的)匿名类继承了父类,并调用了父类的protected方法条件:匿名类完成上述使命,则需要继承一个或者实现某个接口形式:new 示例1:/**...
  • Java 匿名(匿名内部类)

    万次阅读 多人点赞 2020-12-25 23:41:48
    Java匿名(匿名内部类) 学习的参考博文:无恨之都 1. 初识 匿名 标准说法: 内部包括:成员、局部、匿名(匿名内部类)。 匿名概念: 匿名可以使你的代码更加简洁 (JDK8之后Lambda更简洁)。 你可以...
  • Java内部匿名内部类的用法

    万次阅读 多人点赞 2016-07-21 15:46:41
    Java内部匿名内部类的用法 【尊重原创,转载请注明出处】http://blog.csdn.net/guyuealian/article/details/51981163一、内部: (1)内部的同名方法 内部可以调用外部方法,如果内部有同名方法...
  • 一、什么是内部?or 内部的概念 内部定义在另一个中的;下面TestB是TestA的内部。...3、 当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。 三、 内部的分类 成员内部
  • 匿名内部类是没有需要明确声明的构造函数的,但是会有一个隐藏的自动声明的构造函数。 创建匿名内部类有两种办法: 通过继承一个(具体或者抽象都可以)去创建出匿名内部类 通过实现一个接口创建出匿名内部类 咱们...
  • Java内部定义: 在一个定义另一个,这样的称为内部,而包含内部称为外嵌,所以内部也是外嵌的一种成员;...Java匿名内部类定义: Java匿名内部类的使用: ...
  • java匿名内部类和lambda(匿名方法)

    千次阅读 2019-07-28 13:05:21
    匿名内部类 内部分4种:成员内部,静态内部,局部内部匿名内部类。我们今天讨论的就是其中最常见的匿名内部类。从名称可以看出,就是没有名字的,因为没有名字,所以总归和其它普通有一些些区别: ...
  • 匿名内部类、lambda和方法引用其实是相通的,从匿名内部类到lambda到方法引用是一个进化的过程,是一个简化的过程,更加是一个从抽象的过程。 作用都是实现接口方法,换句话说就是实现接口;只是这个接口只有一个...
  • 分析了利用k匿名方法对该攻击进行隐私保护时存在的信息损失问题,针对该问题,提出了一种基于信息损失量估计的k匿名图流构造方法,通过子图节点属性泛化、子图内部结构的泛化控制图重构的信息损失,通过禁止子图...
  • 内部类定义在A中的B就是内部类,B在A中的地位和其他成员相同,意思就是说可以相互调用  优点:通过内部类可以...外部对象.new 内部类构造方法 Outer.Inner in = out.new Inner(); in.play(); 方...
  • lambda表达式与匿名内部类

    万次阅读 2020-08-07 14:13:01
    Lambda表达式类似匿名函数,简单地说,它是没有声明的方法,也即没有访问修饰符、返回值声明和方法名。 Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中)。 Lambda表达式的语法 (parameters) -> ...
  • Lambda表达式与匿名内部类

    千次阅读 2019-04-24 19:27:55
    匿名内部类适合创建那种只需要一次使用的匿名内部类的语法有点奇怪,创建匿名内部类时会立即创建一个该的实例,这个类定义立刻消失,匿名内部类不能重复使用(一次性的) 定义匿名内部类的格式如下: new...
  • 定义:只声明而未实现的方法,即没有方法体的方法。 抽象方法使用 abstract 修饰,具有抽象方法也用 abstract 修饰。 即 具有抽象方法一定是抽象,但抽象中不一定有抽象方法。 abstract class Stu{ /...
  • 程序员你真的理解匿名内部类吗?

    万次阅读 多人点赞 2019-10-10 22:22:30
    为了加深各位对匿名内部类的印象、好奇心以及求知的渴望,咋们先来看一个程序,如果提到线程你会不会立马想到接口和继承?如果提到接口和继承你会不会立马想到匿名内部类? 开篇甜点 为了加深各位对匿名内部类的...
  • 此篇和上一篇的“使用抽象”方式相互印证。/*** 匿名内部类的概念...* 3、匿名内部类没有类型,所以不能显式定义构造器,有一个隐式的无参构造器;* 4、匿名内部类可以定义初始化块以初始化对象,以弥补没有构造器...
  • 匿名内部类

    千次阅读 2022-03-16 17:44:12
    匿名内部类不能定义构造器; 匿名内部类访问的外部成员变量或成员方法必须用final修饰。 匿名内部类不能是public,protected,private,static。 只能创建匿名内部类的一个实例。 一个匿名内部类一定是在new的后面,...
  • 下面小编就为大家带来一篇全面了解Java中的内部类匿名类。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 在一个体中可以出现的内容:成员变量、成员方法、构造方法、构造块、静态语句块、静态变量、方法、内部 嵌套 内部(成员内部、局部内部匿名内部类) 静态嵌套 语法格式 class 外部类名{ class ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 106,649
精华内容 42,659
关键字:

匿名内部类定义构造方法