精华内容
下载资源
问答
  • 2021-02-25 19:48:26

    学Java 虽然时间不算太长,但是对一些原理性的东西很感兴趣。今天分析了一下匿名内部类调用构造方法的原理,希望高手拍砖。

    因为匿名内部类没有名字这个特殊性质,所以我们无从给它指定构造方法,构造方法必须和类名同名,类名都没有,构造方法就无从谈起了。但是匿名内部类可以通过直接调用父类的构造方法实现初始化,当然要求父类构造方法对它父类中定义的成员变量进行初始化。这里用一个例子看创建匿名内部类的时候父类的构造方法到底是如何调用的。

    Java code

    编译得到4个class文件,这里只需要关注InnerTest.class 和 InnerTest$1.class。这里InnerTest$1.class是匿名内部类的class文件,InnerTest.class是InnerTest类的class文件。我们先看InnerTest$1.class的内容:

    javap -c InnerTest$1 > InnerTest$1.txt

    得到代码如下 :

    Java code

    很明显,我们的匿名内部类有了名字 InnerTest$1 ,而且是继承自 Test

    class InnerTest$1 extends Test

    这个类中有一个成员final InnerTest this$0;我想这应该是该内部类所在的外部类InnerTest的引用

    这个匿名内部类的构造方法是:

    InnerTest$1(InnerTest, int);

    一个是InnerTest类型,也就是该类外部类的引用,调用的时候应该是把外部类对象的this指针传给它,这样就内部类就可以直接访问外部类的成员了。

    另一个就是int类型的,应该是对i进行初始化用的。

    看到下面这行:

    7:invokespecial#2; //Method Test."":(I)V

    现在应该清楚了,这是调用了父类Test的构造方法。

    下面再看InnerTest是如何实现的:

    Java code

    InnerTest的get方法是关键。

    这里首先new InnerTest$1,后面调用了InnerTest$1的构造方法,并把两个参数传了进去。

    这样一切都清楚了。

    结论:其实匿名内部类也没有什么特别的地方,编译之后它有了名字,有了构造方法,就是一个正常的类了。

    有理解不对的地方,请大家指正。

    更多相关内容
  • 主要简单给我们介绍了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

    展开全文
  • 问题1: 首先我们都知道,接口和抽象都是不能用new来实例化的。...可以使用匿名类的方式new出来,但必须实现接口中的所有接口方法和抽象中的所有抽象方法。 那么为什么按钮单机事件setOnClickListe...

    问题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(继承) 什么是匿名内部类匿名内部类,顾名思义,就是不知道这个到底是什么名字,也...

    什么是匿名内部类?

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

    匿名内部类的使用场景?

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

    匿名内部类如何创建?

    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 匿名(匿名内部类)

    万次阅读 多人点赞 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)内部的同名方法 内部可以调用外部方法,如果内部类有同名方法...
  • java中匿名内部类构造方法调用

    千次阅读 2013-11-28 21:48:51
    java中匿名内部类构造方法调用
  • 程序员你真的理解匿名内部类吗?

    万次阅读 多人点赞 2019-10-10 22:22:30
    为了加深各位对匿名内部类的印象、好奇心以及求知的渴望,咋们先来看一个程序,如果提到线程你会不会立马想到接口和继承?如果提到接口和继承你会不会立马想到匿名内部类? 开篇甜点 为了加深各位对匿名内部类的...
  • JAVA匿名内部类构造方法

    千次阅读 2013-10-08 16:10:44
    与人讨论匿名内部类构造方法问题,自己写代码看看原理到底是什么样子的。因为是匿名的,所以就无从创建一个同名的构造方法了。但是可以直接调用父类的构造方法。测试代码如下:   Java代码   ...
  • java匿名匿名内部类详解

    千次阅读 2021-03-09 06:35:27
    匿名类是指没有类名的内部类,必须在创建时使用 new 语句来声明。...匿名类有两种实现方式:1、继承一个,重写其方法。2、实现一个接口(可以是多个),实现其方法。下面通过代码来说明。publicclassOu...
  • java匿名内部类和lambda(匿名方法)

    千次阅读 2019-07-28 13:05:21
    匿名内部类 内部分4种:成员内部,静态内部,局部内部匿名内部类。我们今天讨论的就是其中最常见的匿名内部类。从名称可以看出,就是没有名字的,因为没有名字,所以总归和其它普通类有一些些区别: ...
  • 匿名内部类

    千次阅读 多人点赞 2018-09-22 14:12:02
    一、匿名内部类:我看到很多人提到“匿名内部类是没有名字的”,个人觉得用陈国君主编的《Java程序设计基础(第五版)》中的 “所谓匿名内部类,是指可以利用内部创建没有名称的对象,它一步完成了声明内部和...
  • Java匿名内部类使用与示例

    千次阅读 2021-02-25 19:47:42
    首先说为什么有匿名类(产生的使命)两个原因1.简化代码编写某种情况下,只需要扩展一个方法,没必要为了一个方法单独去写一个子类,然后然后调用子类,此时需要匿名类2.在不同的包内的内调用的protected方法...
  • Java的内部类匿名类 , 您了解过吗?

    千次阅读 多人点赞 2020-07-23 08:35:30
    内部主要成员内部、局部内部、静态内部匿名内部类。 内部允许吧一些逻辑相关的组织在一起,并且能控制内部代码的可视性,将包含此内部称为外部。 匿名 匿名,也就是之前所...
  • 匿名内部类、lambda和方法引用其实是相通的,从匿名内部类到lambda到方法引用是一个进化的过程,是一个简化的过程,更加是一个从抽象的过程。 作用都是实现接口方法,换句话说就是实现接口;只是这个接口只有一个...
  • lambda表达式与匿名内部类

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

    千次阅读 2019-04-24 19:27:55
    匿名内部类适合创建那种只需要一次使用的匿名内部类的语法有点奇怪,创建匿名内部类时会立即创建一个该的实例,这个定义立刻消失,匿名内部类不能重复使用(一次性的) 定义匿名内部类的格式如下: new...
  • 分析了利用k匿名方法对该攻击进行隐私保护时存在的信息损失问题,针对该问题,提出了一种基于信息损失量估计的k匿名图流构造方法,通过子图节点属性泛化、子图内部结构的泛化控制图重构的信息损失,通过禁止子图...
  • 内部类: 定义在A中的B就是内部类,B在A中的地位和其他成员相同,意思就是说可以相互调用  优点:通过内部类可以...外部对象.new 内部类构造方法 Outer.Inner in = out.new Inner(); in.play(); 方...
  • /*** 匿名内部类的概念和特性:* 1、匿名内部类只能也必须(且仅)继承一个父类或者实现一个接口,也可以重写父类普通方法;* 2、匿名内部类不能是抽象,因为定义匿名内部类时立即生成对象,而抽象不允许生成...
  • 抽象方法,抽象 ...即 具有抽象方法一定是抽象,但抽象中不一定抽象方法。 abstract class Stu{ //该方法只是声明了一个print()方法,没有方法体,所以是一个抽象方法。 public abstract voi...
  •  对于这个问题,首先我们应该明确的一点是对于匿名内部类,它...知识点一,匿名内部类同所有一样,都是有构造函数的,只不过这个构造函数是隐式的,虽然是内部,但是经过编译之后,JVM还是会为匿名内部类生成...
  • 内部匿名内部类

    2018-11-23 13:10:06
    内部类可以引用定义在他嵌套的外部的数据和方法,不需要将外部的对象引用传递给内部类构造方法。 使用可见性修饰符定义内部类时,遵从和应用与成员上一样的可见性规则。 可以将内部类定义为static。一个...
  • 匿名内部类会导致内存泄露

    千次阅读 2020-06-02 16:14:42
    如果一个使用了内部类,而两个的生命周期不一致,比如内部类的生命周期比外部生命周期长, 这就会导致外部的生命周期结束了,本该被回收的,却因为内部类会隐式强引用了外部,所以导致外部无法被回收, ...
  • 匿名内部类是没有需要明确声明的构造函数的,但是会一个隐藏的自动声明的构造函数。 创建匿名内部类有两种办法: 通过继承一个(具体或者抽象都可以)去创建出匿名内部类 通过实现一个接口创建出匿名内部类 咱们...
  • 在一个体中可以出现的内容:成员变量、成员方法、构造方法、构造块、静态语句块、静态变量、方法、内部 嵌套 内部(成员内部、局部内部匿名内部类) 静态嵌套 语法格式 class 外部类名{ class ...
  • 匿名内部类写法

    千次阅读 2020-07-29 08:04:38
    一开始没想通什么原理,后来查了一下才知道这种方法被称为双大括号初始化(double brace initialization)或者匿名内部类初始化法,实际上是一种取巧的方式。 理解: 这里以ArrayList的例子解释,首先第一层花括号...
  • 为什么说Java匿名内部类是残缺的闭包

    千次阅读 多人点赞 2017-09-14 22:18:36
    那么些十分基础的知识点,值得好好研究
  • 前言 看到标题,一种很熟悉的感觉,我相信只要几个月开发经验的人,总会遇到一个问题:匿名内部类访问的局部...匿名内部类访问局部变量,编译器会拷贝一份使用的值通过匿名内部类构造方法传进来 如果方法中...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 119,906
精华内容 47,962
关键字:

匿名内部类有构造方法吗