-
2019-08-09 10:47:39
1、匿名类
匿名类,就是没有名称的类,其名称由Java编译器给出,一般是形如:外部类名称+$+匿名类顺序,没有名称也就是其他地方就不能引用,不能实例化,只用一次,当然也就不能有构造器。
匿名类根据位于地方不同分为:成员匿名类和局部匿名类。
匿名类不能使用任何关键字和访问控制符,匿名类和局部类访问规则一样,只不过内部类显式的定义了一个类,然后通过new的方式创建这个局部类实例,而匿名类直接new一个类实例,没有定义这个类。匿名类最常见的方式就是回调模式的使用,通过默认实现一个接口创建一个匿名类然后,然后new这个匿名类的实例。
2、实现方式
new 父类构造器(参数列表)|实现接口() { //匿名内部类的类体部分 }
匿名类我们必须要继承一个父类或者实现一个接口,当然也仅能只继承一个父类或者实现一个接口。同时它也是没有class关键字,这是因为匿名内部类是直接使用new来生成一个对象的隐式引用。
1、接口继承举例参考上篇文章Java接口实例化
public class Test { public static void Main() { ... btn.setOnClickListetener(new OnClickListener(){ //局部匿名类 @Override public void onClick(View v) { } }); } public Runnable r = new Runnable()//成员匿名类 { @Override public void run() { ... } }; }
2、类继承实现
public abstract class Bird { public abstract int fly(); } public class Test { public static void main(String[] args) { flyDis(new Bird() { public int fly() { return 10000; } }); } public static void flyDis(Bird bird){ System.out.println("能够飞" + bird.fly() + "米"); } } //打印出来:能够飞10000米
更多相关内容 -
Java匿名类,匿名内部类实例分析
2020-08-19 08:21:00主要介绍了Java匿名类,匿名内部类,结合实例形式分析了Java匿名类,匿名内部类相关原理、用法及操作注意事项,需要的朋友可以参考下 -
Java 匿名类(匿名内部类)
2020-12-25 23:41:48Java匿名类(匿名内部类) 学习的参考博文:无恨之都 1. 初识 匿名类 标准说法: 内部类包括:成员类、局部类、匿名类(匿名内部类)。 匿名类概念: 匿名类可以使你的代码更加简洁 (JDK8之后Lambda更简洁)。 你可以...Java 匿名类(匿名内部类)
学习的参考博文:无恨之都
1. 初识 匿名类
标准说法: 内部类包括:成员类、局部类、匿名类(匿名内部类)。
匿名类概念:
- 匿名类可以使你的代码更加简洁 (JDK8之后Lambda更简洁)。
- 你可以定义一个类的同时对其进行实例化。
- 它与局部类很相似,不同的是它没有类名,如果某个局部类你只需要使用一次,就可以使用匿名类代替局部类。
- 匿名类是表达式,而非常规的类
匿名类的使用场景:
- 一个局部类只需要使用一次的时候
- 由于匿名类没有类名,那么除了定义它的地方,其他地方无法调用,所以匿名类也可以叫匿名内部类
2. 通过示例分析局部类和匿名类区别
sayHello
方法中有局部类和匿名类分别实现HelloWorld
接口的方法public class HelloWorldAnonymousClasses { interface HelloWorld { public void greet(); public void greetSomeone(String someone); } public void sayHello() { /** * 1、局部类:EnglishGreeting实现了HelloWorld接口 */ class EnglishGreeting implements HelloWorld { String name = "无参"; @Override public void greet() { greetSomeone(name); } @Override public void greetSomeone(String someone) { name = someone; System.out.println("局部类:" + name); } } // 创建局部类EnglishGreeting的实例化对象,使用接口类型接收 HelloWorld englishGreeting = new EnglishGreeting(); // 局部类:无参方法 englishGreeting.greet(); // 局部类:带参方法 englishGreeting.greetSomeone("带参"); /** * 2、匿名类实现HelloWorld接口并创建了实例化对象:frenchGreeting */ HelloWorld frenchGreeting = new HelloWorld() { String name = "无参"; @Override public void greet() { greetSomeone(name); } @Override public void greetSomeone(String someone) { name = someone; System.out.println("匿名类:" + name); } }; // 匿名类:无参方法 frenchGreeting.greet(); // 匿名类:带参方法 frenchGreeting.greetSomeone("带参"); } public static void main(String... args) { HelloWorldAnonymousClasses myApp = new HelloWorldAnonymousClasses(); myApp.sayHello(); }
【输出】
局部类:无参 局部类:带参 匿名类:无参 匿名类:带参
【分析】
代码里局部类和匿名类实现的功能是一样的,内部的方法实现的代码是也一样的,区别只在实现HelloWorld
接口的地方局部类的格式是:
- 创建局部类并且实现接口:
class EnglishGreeting implements HelloWorld {...}
- 创建局部类的实例化对象并用接口类型接收:
HelloWorld englishGreeting = new EnglishGreeting();
- 调用实例化对象的方法
匿名类的格式是:
- 创建匿名类实现接口同时对其进行实例化:
HelloWorld frenchGreeting = new HelloWorld() {...}
- 调用实例化对象的方法
【区别】
- 局部类
EnglishGreeting
实现HelloWorld
接口,有自己的类名:EnglishGreeting
,定义完成后需要再对其实例化对象:englishGreeting
才能可以使用方法 - 匿名类在定义时就已经实例化成对象:
frenchGreeting
,定义完了就可以直接使用方法 - 匿名类是一个表达式,因此在定义的最后用分号结束
3. 匿名内部类的语法
3.1 匿名类实现接口
其实上面的示例中的匿名类就是实现接口的方式,这个示例将实现更复杂的功能
public class InterfaceTest { public static void main(String[] args) { TomInterface tif = new TomInterface() { String name = "汤姆"; @Override public void getName() { System.out.println(name); } TomInterface setName(String name){ this.name = name; return this; } }.setName("杰瑞"); tif.getName(); } } interface TomInterface{ void getName(); }
【结果】
杰瑞
【分析】
main
方法创建匿名类实现TomInterface
接口并实例化:new TomInterface{...}
- 调用匿名类对象的
setName
方法,将杰瑞
赋值给匿名类的成员变量name
,并返回当前实例this
给接口变量tif
main
方法调用匿名类对象的方法tif.getName()
,而此时的匿名类的成员变量name
的值已经被替换成杰瑞
,所以最后输出杰瑞
而不是汤姆
3.2 匿名类继承父类 (匿名子类)
匿名类继承父类,调用父类构造,重写父类方法
public class ExtendTest { public static void main(String[] args) { String name = "李四"; // 创建父类对象,打印原始name值 PartherClass partherClass = new PartherClass(); System.out.println("父类的getName方法=" + partherClass.getName()); // 使用匿名类继承父类,并打印name值 PartherClass pc = new PartherClass(name){ @Override public String getName(){ return "匿名类 - "+super.getName(); } }; System.out.println(pc.getName()); } } class PartherClass{ private String name = "张三"; public PartherClass(){} public PartherClass(String name){ this.name = name; } public String getName(){ return this.name; } }
【结果】
父类的getName方法=张三 匿名类 - 李四
【分析】
- 创建父类对象并调用
getName
方法,这个不用细说 - 创建匿名类继承父类并实例化对象:
pc
,本次匿名类调用的是父类的带参构造,将参数赋值给了父类的name
- 调用匿名类重写的
getName
方法,得到新的name
值
3.3 区别
Demo demo = new Demo(xxx){...}
- 操作符:new
- 一个要实现的接口或要继承的类,示例3.1 是实现接口,示例3.2 是继承类
- 一对括号,如果是匿名子类,那么父类有构造参数就填,不带参就空着;如果匿名类是实现接口,那么括号里需要空着
{...}
,括号里括着的是匿名类的声明主体- 末尾的
;
号,因为匿名类的声明是一个表达式,是语句的一部分,所以需要分号结尾 - 表面上看匿名类没有类名,没有构造参数。但其实在编译的时候,编译器会给匿名类分配类名和构造器,只是我们无法操作也不能复用。如需验证,可以看编译后的class文件,多出一个命名格式:
匿名类定义类$?.class
的文件。例如示例3.2,匿名类的class文件就是:ExtendTest$1.class
-
Java中匿名类的两种实现方式
2020-08-31 12:49:39本文主要介绍了Java中匿名类的两种实现方式。具有很好的参考价值,下面跟着小编一起来看下吧 -
Java通过匿名类来实现回调函数实例总结
2020-08-29 15:17:37主要介绍了Java通过匿名类来实现回调函数的例子,回调函数就是一种函数签名(若干个输入参数、一个输出参数)的规范,java虽不存在函数声明,但是java可以用接口来强制规范。具体操作步骤大家可查看下文的详细讲解,... -
简单谈谈java中匿名内部类构造函数
2020-09-03 04:50:50主要简单给我们介绍了java中匿名内部类构造函数,并附上了简单的示例,有需要的小伙伴可以参考下。 -
java匿名类和匿名函数的概念和写法
2021-10-19 22:46:001】类可以定义在另一个类的内部 2】也可以定义为内部静态类,使用 static 关键字 3】还可以定义为局部内部类,定义在方法中 一、什么是Lambda表达式? lambda表达式是为了简写代码的写法 二、什么是函数式...前言:
Lambda流式操作是Java8中重要的特性,lambda表达式核心概念为 函数式接口、::、-> 等基本语法,可以大大减少代码量的编写,使代码更加优雅
1、只有一个抽象函数的接口,就是函数式接口
2、:: 可以称之为域运算符,主要是用来获取方法
3、-> 的语法为 (变量或参数)->{代码体},是匿名函数的写法。也叫变量和代码的分隔符
4、当只获取一个方法属性的时候 :: 和 -> 可以通用介绍:
-
接口:
1】接口可以定义在另一个类的内部
2】接口中的方法都是抽象方法
3】接口中的常量都是静态常量 -
类
1】类可以定义在另一个类的内部
2】也可以定义为内部静态类,使用 static 关键字
3】还可以定义为局部内部类,定义在方法中
一、什么是Lambda表达式?
lambda表达式是为了简写代码的写法二、什么是函数式接口?
1】只有一个抽象方法的接口就是函数式接口//1.定义一个函数式接口。只有一个抽象方法的接口就是函数式接口 interface ILike{ void testLambda(); }
三、什么是匿名内部类?
匿名内部类的特点:
1】没有类名
2】必须借助接口或父类
3】通过实例化函数式接口就可以完成匿名内部类实现此接口并重写方法//5.匿名内部类,没有类名称,必须借助接口 like = new ILike() { @Override public void testLambda() { System.out.println("i like lambda4"); } }; like.testLambda();
四、用 Lambda 简化匿名内部类的写法
1】匿名内部类是为了省去类名的写法
2】Lambda 简化写法不但可以省去类名,还可以省去接口名和函数名。因为只有一个抽象方法,可以直接实现并指向这个抽象方法和方法体//6.用lambda简化,因为接口中只有一个函数,所以可以直接省略实例化的接口名和函数名 like = () -> { System.out.println("i like lambda5"); }; like.testLambda();
概括:
1】匿名函数写法和匿名类写法的前提必须基于函数式接口
2】匿名函数写法和匿名类写法其本质是同一个东西,只是简化写法不同
3】使用Lambda表达式简写匿名函数时,可以同时省略实现类名、函数名。除此外也可以使用传统写法 -
-
Java匿名类的使用方法
2020-06-12 10:16:39浅析匿名类的使用方法 匿名类是某种已定义的类的继承,该父类必须真实存在。匿名类属于内部类无法构造静态代码块。 构造匿名类对象主要有以下几种方式: new 类名{类体} 这种方式的例子是注册事件监听器 new 类名{...浅析匿名类的使用方法
匿名类是某种已定义的类的继承,该父类必须真实存在。匿名类属于内部类无法构造静态代码块。
构造匿名类对象主要有以下几种方式:- new 类名{类体}
这种方式的例子是注册事件监听器 - new 类名{类体}.方法
public class Practice { public static void main(String[] args) { new Outer() { public void print() { System.out.println("你好"); } public void printOut(){ System.out.println("hello"); } }.printOut(); } } class Outer{ private int value; public void printOut() { System.out.println(value); } }
在匿名类里你可以重写父类方法或定义新的方法。
3. 类名 对象名=new 类名{类体}public class Practice { public static void main(String[] args) { Outer o=new Outer() { public void print2() { System.out.println("you are a cat"); } public void printOut() { System.out.println("hehe"); } }; o.printOut(); } } class Outer{ private int value; public void printOut() { System.out.println(value); } }
在这里需要注意的是o已由新构造的匿名类的类型被转化为父类Outer类型。所以你在匿名类中新定义的方法无法使用。但是对父类方法的重写仍然有效。
- new 类名{类体}
-
JAVA匿名类创建对象.doc
2021-09-30 23:12:56JAVA匿名类创建对象.doc -
Java匿名内部类的写法示例
2020-09-07 17:48:59主要给大家介绍了关于Java匿名内部类的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 -
Java匿名类
2016-05-30 23:18:10匿名类,正如名字一样在java中没有名字标识的类,当然了编译后还是会安排一个名字的。 下面是一个关于匿名类的简单例子: public class Client { public static void main(String[] args) throws ... -
Java 匿名类(通俗易懂)
2018-07-16 16:32:03匿名类有两种: 1、与子类有关的匿名类 2、与接口有关的匿名类 1、与子类有关的匿名类 package com.与子类有关的匿名类; public class Demo29 { public static void main(String args[]) { Test test = ... -
C#匿名委托和Java匿名局部内部类使用方法示例
2020-09-04 21:22:48Java在嵌套类型这里提供的特性比较多,假设:Java的字节码只支持静态嵌套类,内部类、局部内部类和匿名局部内部类都是编译器提供的语法糖,这个假设目前没法验证(看不懂字节码),本文先来看一下C#是如何为我们提供... -
解决内存泄漏更加清楚的认识到Java匿名类与外部类的关系
2015-04-28 19:01:30理解匿名类与外部类以及方法中final参数的关系,分析Android应用程序中存在的内存泄漏 -
java匿名类序列化问题
2017-10-18 12:23:43java不同语法的应用在duboo服务中产生诡异的序列化错误,两种语法表达,一个无法序列化而另外一个正常 -
java 中使用匿名类直接new接口详解及实例代码
2020-08-31 04:29:25主要介绍了java 中使用匿名类直接new接口详解及实例代码的相关资料,需要的朋友可以参考下 -
java匿名类对象的使用
2018-10-10 23:38:31java匿名类对象的的使用 要点 1.创建的类对象是匿名的 1. 当我们只需要一次调用类的对象的时候,我们就可以考虑使用匿名类的创建方式创建匿名类对象。 2. 创建的匿名类对象只能够调用一次! 2.匿名类只能够... -
java 内部类使用(内部匿名类)
2011-12-12 18:22:48java 成员内部类使用 内部匿名类 方法参数匿名类 方法匿名类 -
Java匿名内部类使用与示例
2021-02-25 19:47:42首先说为什么有匿名类(产生的使命)两个原因1.简化代码编写某种情况下,类只需要扩展一个方法,没必要为了一个方法单独去写一个子类,然后然后调用子类,此时需要匿名类2.在不同的包内的类内调用类的protected方法... -
Java局部内部类和匿名内部类定义与用法实例分析
2020-08-25 18:39:29主要介绍了Java局部内部类和匿名内部类,结合实例形式分析了java局部内部类和匿名内部类相关定义、原理与用法,需要的朋友可以参考下 -
java中的匿名内部类详细总结
2020-09-04 22:49:16以下是对java中的匿名内部类进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助 -
java匿名内部类笔试题-100ask:韦东山视频学习笔记
2021-06-13 15:06:50java匿名内部类笔试题 -
java中的匿名内部类总结
2021-02-28 13:24:04匿名内部类也就是没有名字的内部类正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口实例1:不使用匿名内部类来实现抽象方法... -
java匿名类的定义
2018-03-30 11:51:002.** 匿名类定义在 匿名类对象创建对象的表达式中(new 表达式)** new Person(){ public void eat(){ System.out.println(" a boy is eating rice"); } }; 3. 匿名类必须实现某个接口(超类是... -
JAVA匿名类
2012-09-24 09:48:52匿名类用的最多的地方就是在javaFrame中,给某一个窗体控件,比如说是一个按钮,添加一个Listener了。 添加Listener的代码如下: 匿名类和普通类的区别在于,匿名类在声明之处通过new来创建一个对象,然后该类就... -
Java内部类和匿名内部类的用法
2016-07-21 15:46:41Java内部类和匿名内部类的用法 【尊重原创,转载请注明出处】http://blog.csdn.net/guyuealian/article/details/51981163一、内部类: (1)内部类的同名方法 内部类可以调用外部类的方法,如果内部类有同名方法... -
java中匿名内部类详解
2020-08-30 19:47:50主要对java中的匿名内部类的详细总结,需要的朋友可以参考下 -
1.18 Java匿名类,匿名内部类
2020-09-30 13:12:36匿名类是指没有类名的内部类,必须在创建时使用 new 语句来声明类。其语法形式如下: new <类或接口>() { // 类的主体 }; 这种形式的 new 语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个...