Java---匿名类总结

今天学习Android开发,为实现button控件的onClick事件,其中一种实现方法是用匿名类,在此把Java中匿名类进行总结。

匿名内部类--没有名字的内部类,因为没有名字,所以只能使用一次

匿名内部类--它通常用来简化代码编写

使用匿名内部类前提条件:必须继承一个父类或实现一个接口

注:只要一个类是抽象的或是一个接口,那么其子类中的方法都可以使用匿名内部类来实现;

最常用的情况就是在多线程的实现上,因为要实现多线程必须继承Thread类或是继承Runnable接口

1:未使用匿名类实现方式举例

 1 abstract class Person{
 2     abstract void eat();
 3 }
 4
 5 class Student extends Person{
 6     void eat(){
 7         System.out.println("Student eat!");
 8     }
 9 }
10 public class InnerClass {
11     public static void main(String[] args){
12         Person stu = new Student();
13         stu.eat();
14     }
15
16 }

输出结果:>Student eat!

实现过程:Student类继承了Person类,作为其子类实现了一个实例,并将其向上转化为Person类的引用。

  2:匿名内部类基本实现方式

 1 abstract class Person{
 2     public abstract void eat();
 3 }
 4
 5 public class InnerClass {
 6     public static void main(String[] args){
 7         Person stu = new Person(){
 8             public void eat(){
 9                 System.out.println("Student eat!");
10             }
11         };
12         stu.eat();
13     }
14
15 }

输出结果:>Student eat!

实现过程:将Person类中的抽象方法eat()直接放在了大括号中实现,注意大括号后要有一个分号!

3:匿名内部类用在接口上

 1 interface Person{
 2     public abstract void eat();
 3 }
 4
 5 public class InnerClass {
 6     public static void main(String[] args){
 7         Person stu = new Person(){
 8             public void eat(){
 9                 System.out.println("Student eat!");
10             }
11         };
12         stu.eat();
13     }
14
15 }

输出结果:>Student eat!

4:线程Thread类中匿名类的实现

(1)Thread类中run()方法实现

 1 public class InnerClass {
 2     public static void main(String[] args){
 3         Thread t = new Thread(){
 4             public void run(){
 5                 for(int i = 0; i < 5; i++){
 6                     System.out.println("x = " + i +";");
 7                 }
 8             }
 9         };
10         t.start();
11     }
12
13 }

输出结果:

x = 0;
x = 1;
x = 2;
x = 3;
x = 4;

(2)使用Runnable接口进行实现

 1 public class InnerClass {
 2     public static void main(String[] args){
 3         Runnable r = new Runnable(){
 4             public void run(){
 5                 for(int i = 0; i < 5; i++){
 6                     System.out.println("x = " + i +";");
 7                 }
 8             }
 9         };
10         Thread t = new Thread(r);
11         t.run();
12     }
13
14 }

运行结果和上面一样,通过Runnable的实例r,将Thread和Runnable联系在一起。

5:扩展:在Android开发中button实现OnClickListener()事件使用匿名内部类实现主要代码如下:

 1 /*
 2          * 初始化Button控件;
 3          * 设置Button的监听器,通过监听器实现点击操作的事情
 4          */
 5         loginButton = (Button)findViewById(R.id.button1);
 6         loginButton.setOnClickListener( new OnClickListener(){
 7             public void onClick(View args0){
 8                 System.out.println("欢迎您!");
 9             }
10         });

注意,整个OnClickListener()事件的实现均包含在setOnClickListener()方法中

时间: 2024-08-09 11:34:21

Java---匿名类总结的相关文章

解决内存泄漏更加清楚的认识到Java匿名类与外部类的关系

1.事件起因 在做项目的时候,通过Android Studio的Memory Monitor窗口观察程序内存使用情况,发现当程序退出的时候,有一部分应该释放掉的内存没有释放掉,知道程序中应该有内存泄漏了.为了发现程序中的内存泄漏,我切换了IDE工具到Eclipse,里面安装了内存泄漏的分析工具MAT,具体怎么用MAT分析内存泄漏可以自己Google,我把我自己找到内存泄漏的地方贴出来 从上图中可以看到,有24M左右的内存被mView(其实它真正是一个Fragment)这个变量持有,导致Java垃

java匿名类和匿名对象及this的其他用法

/* 匿名内部类:就是内部类的简写格式. 必须前提:内部类必须继承或者实现一个类或者接口. 匿名内部类其实就是一个匿名 子类对象. 格式:new 父类对象 or 接口(){ 子类内容:(覆盖父类的, 而且可以增加自己的方法) }//相当于将 继承父类 和 new 的过程 写到了一起有某有!很方便有某有! */ class Outer{ int num; public Outer(){ num = 5; } class Inner{ int num; public Inner(){ num = 1

学习笔记:因为java匿名类学习到接口的一些小用法

在看CometD的示例代码时发现了许多有意思的代码,但说实话看别人的代码确实是件很累的事情,所以就看到这个知识点做一下记录吧. 先看一段代码: 代码1 这段代码中有一个new的操作,而且是在方法参数中进行的,这给了我一个好奇的点.此时首先想到的是C#中的匿名类,于是网上找了找资料,确实是类似的语法特性.继续看代码就发现一个问题: ConfigurableServerChannel是一个接口,而且Initializer是ConfigurableServerChannel中的一个内部嵌套接口. 代码

Java匿名类

public class Person { public void hello() { System.out.println("我是Person"); } } 1 public class Main 2 { 3 /** 4 * 主函数,程序的入口 5 * @param args 6 */ 7 public static void main(String[] args) 8 { 9 final int num=90;//局部变量 10 11 //匿名类 12 Person p1=new

java匿名类工厂方法[java编程思想10.6.1]

package com.ebao.java.innerclass; public interface Service { void method1(); void method2();} public interface ServiceFactory { Service getService();} public class Implementation1 implements Service { private Implementation1(){} @Override public void

Java中的内部类、匿名类的使用

代码(test.java): 1 interface ie{ 2 public void print(); 3 } 4 5 class outer{} 6 7 public class test{ 8 public class inner{} 9 public void test(ie e){ 10 e.print(); 11 } 12 public static void main(String[] args){ 13 14 15 new test().test(new ie(){ 16 pu

【转 Java 中的内部类和匿名类

 Java 中的内部类和匿名类 2008-10-16 13:47:41 标签:Java 内部类 匿名类 休闲 职场 Java 中的内部类和匿名类* 为什么需要内部类? Java 内部类有什么好处?为什么需要内部类? 首先举一个简单的例子,如果你想实现一个接口,但是这个接口中的一个方法和你构想的这个类中的一个方法的名称,参数相同,你应该怎么办?这时候,你可以建一个内部类实现这个接口.由于内部类对外部类的所有内容都是可访问的,所以这样做可以完成所有你直接实现这个接口的功能. 不过你可能要质疑,更改一

java:使用匿名类直接new接口

java中的匿名类有一个倍儿神奇的用法,见下面代码示例: package contract; public interface ISay { void sayHello(); } 上面是一个简单的接口,下面是如何使用: package jimmy; import contract.ISay; public class Program { public static void main(String[] args) { ISay say = new ISay() { public void say

Java的匿名类示例

本文将通过正则表达式来过滤文件夹中的某些特殊文件,并打印出来.这其中涉及到文件过滤器,其中应用到了匿名类. package date0815.demo1; /** * Java匿名内部类 * @author zzw * */ import java.io.File; import java.io.FilenameFilter; import java.util.Arrays; import java.util.regex.Pattern; public class Test1 { public

浅谈Java的匿名类

在实际的项目中看到一个很奇怪的现象,Java可以直接new一个接口,然后在new里面粗暴的加入实现代码.就像下面这样.那么问题来了,new出来的对象没有实际的类作为载体,这不是很奇怪吗? 思考以下代码的输出是什么? Runnable x = new Runnable() { @Override public void run() { System.out.println(this.getClass()); } }; x.run(); 实际答案是出现xxxx$1这样一个类名,它是编译器给定的名称.