精华内容
下载资源
问答
  • java匿名类

    2019-02-26 11:58:12
    java 匿名类有 成员内部类、局部内部类、匿名内部类和静态内部类。写的很清楚具体的一些基础这里就不说了,可参考 https://www.cnblogs.com/dolphin0520/p/3811445.html 写的很清楚。 这里举一个 匿名内部类 的常用...

    java 匿名类有 成员内部类、局部内部类、匿名内部类和静态内部类。写的很清楚具体的一些基础这里就不说了,可参考 https://www.cnblogs.com/dolphin0520/p/3811445.html 写的很清楚。

    这里举一个 匿名内部类 的常用例子 以及 解释为何 匿名内部类访问外部变量 必须是final

    一、匿名内部类类常见场景

    在我项目中,最常使用 匿名内部类 的场景就是线程了,它能使代码很简洁,如下是最简单的例子

    public class InnerClassTest {
    
    	public static void main(String[] args) {
    		for(int i=0; i<5; i++){
    			final int iFinal = i;
    			new Thread(new Runnable(){
    				@Override
    				public void run() {
    					// TODO Auto-generated method stub
    					System.out.println(iFinal);
    				}
    			}).start();
    			
    		}
    	}
    	
    }

    二、匿名内部类访问外部变量 必须是final

    如上例子中,线程访问 iFinal 必须是 final,不能直接访问 i,否则会报错。

    这个实际上就是为了保护数据的一致性。

    上面例子在编译时,会生成两个class文件:InnerClassTest$1.class、InnerClassTest.class。反编译 InnerClassTest$1.class,其中有一行 InnerClassTest$1(int paramInt) {}。 说明实际上传参到匿名内部类中,是通过将参数作为匿名内部类的构造函数的参数传进去的,所以如果此时不用final,那修改参数后就会导致数据不一致。所以必须用final修饰。如下图

    展开全文
  • Java 匿名类

    2021-01-13 15:21:49
    匿名类是不能有名字的类,它们不能被引用,只能在创建时用 new 语句来声明它们。 匿名类语法格式: class outerClass { // 定义一个匿名类 object1 = new Type(parameterList) { // 匿名类代码 }; } 以上的...

    Java 中可以实现一个类中包含另外一个类,且不需要提供任何的类名直接实例化。

    主要是用于在我们需要的时候创建一个对象来执行特定的任务,可以使代码更加简洁。

    匿名类是不能有名字的类,它们不能被引用,只能在创建时用 new 语句来声明它们。

    匿名类语法格式:

    class outerClass {
    
        // 定义一个匿名类
        object1 = new Type(parameterList) {
             // 匿名类代码
        };
    }
    

    以上的代码创建了一个匿名类对象 object1,匿名类是表达式形式定义的,所以末尾以分号 ; 来结束。
    匿名类通常继承一个父类或实现一个接口。
    在这里插入图片描述
    匿名类继承一个父类
    以下实例中,创建了 Test1 类,该类只有一个方法 display(),Demo 类继承了 Polygon 类并重写了 Test1 类的 display() 方法

    实例:

    class Test1 {
    	   public void display() {
    	      System.out.println("在 test 类内部");
    	   }
    	}
    
    	class Demo {
    	   public void createClass() {
    
    	      // 创建的匿名类继承了 Polygon 类
    	      Test1 t1 = new Test1() {
    	         public void display() {
    	            System.out.println("在匿名类内部。");
    	         }
    	      };
    	      t1.display();
    	   }
    	}
    
    	class Main {
    	   public static void main(String[] args) {
    	     Demo demo = new Demo();
    	       demo.createClass();
    	   }
    	}
    
    

    执行以上代码,匿名类的对象 t1 会被创建,该对象会调用匿名类的 display() 方法,输出结果为:

    在匿名类内部。
    

    匿名类实现一个接口
    以下实例创建的匿名类实现了 Test1 接口:

    实例

    interface Test1 {
    	   public void display();
    	}
    
    	class Demo {
    	   public void createClass() {
    
    	      // 匿名类实现一个接口
    	      Test1 t1 = new Test1() {
    	         public void display() {
    	            System.out.println("在匿名类内部。");
    	         }
    	      };
    	      t1.display();
    	   }
    	}
    
    	class Main {
    	   public static void main(String[] args) {
    	      Demo an = new Demo();
    	      an.createClass();
    	   }
    	}
    

    输出结果为:

    在匿名类内部。
    
    展开全文
  • java匿名类_Java匿名类

    2020-07-15 05:54:52
    java匿名类Java anonymous class are like local class or inner class without a name. We can use java anonymous class to declare and instantiate a class at the same time. Java匿名类就像没有名称的本地类或...

    java匿名类

    Java anonymous class are like local class or inner class without a name. We can use java anonymous class to declare and instantiate a class at the same time.

    Java匿名类就像没有名称的本地类或内部类。 我们可以使用Java匿名类同时声明和实例化一个类。

    Java匿名类 (Java Anonymous Class)

    java anonymous class

    Java anonymous class is a nested or local class. You should use them only when you want to use local class only once. Let’s have a look at an example of anonymous class in java program.


    Java匿名类是嵌套或本地类。 仅当您只想使用本地类一次时,才应使用它们。 让我们看一下Java程序中的匿名类的示例。

    package com.journaldev.java.examples;
    
    public interface Hello {
    
    	public void sayHello();
    }

    Java匿名类示例 (Java Anonymous Class Example)

    Hello is an interface, let’s see how we can create an anonymous class implementation of Hello interface.

    Hello是一个接口,让我们看看如何创建Hello接口的匿名类实现。

    package com.journaldev.java.examples;
    
    public class AnonymousExample {
    
    	//nested anonymous class
    	public static Hello hello = new Hello() {
    
    		@Override
    		public void sayHello() {
    			System.out.println("Hello nested anonymous class");
    		}
    	};
    	
    	public static void main(String[] args) {
    		
    		//anonymous class inside method
    		Hello h = new Hello() {
    
    			@Override
    			public void sayHello() {
    				System.out.println("Hello anonymous class");
    			}
    		};
    		
    		h.sayHello();
    		
    		AnonymousExample.hello.sayHello();
    	}
    
    }

    Above Hello class can be an abstract class also, like below.

    Hello类上方也可以是抽象类,如下所示。

    package com.journaldev.java.examples;
    
    public abstract class Hello {
    
    	abstract void sayHello();
    }

    Not only that, Hello can be a normal top level class also, like below.

    不仅如此,Hello也可以是普通的顶级类,如下所示。

    package com.journaldev.java.examples;
    
    public class Hello {
    
    	public void sayHello(){};
    }

    Notice that anonymous classes are expressions and ends with semicolon.

    请注意,匿名类是表达式,并以分号结尾。

    Anonymous class is defined by calling class constructor followed by class definition code inside curly braces.

    匿名类是通过在大括号内调用类构造函数和类定义代码来定义的。

    Since anonymous class don’t have a name, we can’t define a constructor inside the class code body.

    由于匿名类没有名称,因此我们无法在类代码主体内定义构造函数。

    具有构造函数参数的Java匿名类示例 (Java Anonymous class example with constructor argument)

    What if our Hello class don’t have no-args constructor? Can we access class variables in the anonymous class? Do we need to override all the methods of class in anonymous class?

    如果我们的Hello类没有no-args构造函数怎么办? 我们可以访问匿名类中的类变量吗? 我们需要重写匿名类中的所有类方法吗?

    Let’s answer above questions with a simple code example.

    让我们用一个简单的代码示例来回答上述问题。

    package com.journaldev.java.examples;
    
    public class Hello {
    
    	protected String s;
    	
    	public Hello(String str){
    		this.s = str;
    	}
    	public void sayHello(){
    		System.out.println(s);
    	};
    	
    	void foo(){};
    }
    package com.journaldev.java.examples;
    
    public class AnonymousExample {
    	
    	public static void main(String[] args) {
    		
    		//anonymous class inside method
    		Hello h = new Hello("abc") {
    
    			@Override
    			public void sayHello() {
    				System.out.println("Hello anonymous class "+s);
    			}
    		};
    		
    		h.sayHello();
    		
    	}
    
    }

    Java匿名类要点 (Java Anonymous Class Important Points)

    1. We can use any constructor while creating anonymous class. Notice the constructor argument is being used too.

      创建匿名类时,我们可以使用任何构造函数。 注意,构造函数参数也被使用。
    2. Anonymous class extends the top-level class and implements the abstract class or interface. So access modifier rules apply as usual. We are able to access protected variable, if we change it to private then we won’t be able to access it.

      匿名类扩展顶级类并实现抽象类或接口。 因此,访问修饰符规则照常适用。 我们能够访问受保护的变量,如果将其更改为私有变量,则将无法访问它。
    3. Since we are extending the Hello class above, we are not required to override all the methods. However if it would have been an interface or abstract class then we have to provide implementation of all the unimplemented methods.

      由于我们在上面扩展了Hello类,因此不需要覆盖所有方法。 但是,如果它将是接口或抽象类,那么我们必须提供所有未实现方法的实现。
    4. You cannot declare static initializers or member interfaces in an anonymous class.

      您不能在匿名类中声明静态初始化器或成员接口。
    5. An anonymous class can have static members provided that they are constant variables.

      匿名类可以具有静态成员,前提是它们是常量变量。

    That’s all for anonymous class in java.

    Java的匿名类就这些了。

    翻译自: https://www.journaldev.com/12534/java-anonymous-class

    java匿名类

    展开全文
  • java 匿名类

    2018-07-03 13:13:21
    Java允许我们直接使用一个类的子类的类体创建一个子类对象,也就是说,创建子类对象时,除了使用父类的构造方法体外还有类体,此类体被认为是一个子类去掉类声明后的类名,称作匿名类匿名类就是一个子类,由于无名...

    匿名类

    和子类有关的匿名类

        假如没有显式地声明一个类的子类,而又想用子类创建一个对象,那么该如何实现这一目的呢?Java允许我们直接使用一个类的子类的类体创建一个子类对象,也就是说,创建子类对象时,除了使用父类的构造方法体外还有类体,此类体被认为是一个子类去掉类声明后的类名,称作匿名类。匿名类就是一个子类,由于无名可用,所以不可能用匿名类声明对象,却可以直接用匿名类创建个对象。

    假设Bank是类,那么下列代码就是用Bank的一个子类(匿名类) 创建对象。

    new Bank(){
          匿名类的类体
    };

     匿名类有如下特点。

        (1)匿名类可以继承父类的方法也可以重写父类的方法。

        (2)使用匿名类时,必然是在某个类中直接用匿名类创建对象,因此匿名类定是内部类。

      (3)匿名类可以访问外嵌类中的成员变量和方法,匿名类的类体中不可以声明static成员变量和static方法。

      (4)由于匿名类是一个子类,但没有类名,所以在用匿名类创建对象时,要直接使用父类的构造方法。

         尽管匿名类创建的对象没有经过类声明步骤,但匿名对象的引用可以传递给个匹配的参数。

      比如,用户程序中有如下方法:

    void f(A a){
    }

    该方法的参数类型是A类,用户希望向方法传递A的子类对象,但系统没有提供符合要求的子类,那么用户在编写代码时就可以考虑使用匿名类。

      下面的例子中,抽象类OuputAlphabet有output()方法,而且该类有一个OutputEnglish子类,这个子类重写的output()方法可以输出英文字母表。

    例子中的ShowBoard类的showMess(OutputAlphabet show)方法的参数是OutputAlphabet类型的对象,用户在编写程序时,希望使用ShowBoard类的对象调用showMess(OutputAlphabet show)输出英文字母表和希腊字母表,但系统没有提供输出希腊字母表的子类(只提供了输出英文字母表的子类),因此用户在主类的main方法中,向showMess方法的参数传递了一个匿名类的对象,该匿名类的对象负责输出希腊字母表。运行效果如图所示。

    abstract class OutputAlphabet {
    	public abstract void output();
    }
    class OutputEnglish extends OutputAlphabet{    //输出英文字母的子类
    	public void output() {
    		for(char c='a';c<='z';c++) {
    			System.out.printf("%3c",c);
    		}
    	}
    }
    class ShowBoard{
    	void showMess(OutputAlphabet show) {        //参数show是OutputAlphabet类型的对象
    		show.output();
    	}
    }
     public class Example5.2{
    	 public static void main(String args[]) {
    		 ShowBoard board=new ShowBoard();
    		 board.showMess(new OutputEnglish());  //向参数传递OutputAlphabet的子类OutputEnglish的对象
    		 System.out.println();
    		 board.showMess(new OutputAlphabet() {  //向参数传递OutputAlphabet的匿名子类的对象
    				 public void output() {
    					 for(char c='α';c<='ω';c++)   //输出希腊字母
    						 System.out.printf("%3c",c);
    				 }
    		 }
    		 );	    //请注意分号在这里
    	 }
     }

    展开全文
  • JAVA 匿名类

    2018-06-01 17:55:18
    Java允许我们直接使用一个类的子类的类体创建一个子类对象,也就是说,创建子类对象时,除了使用父类的构造方法体外还有类体,此类体被认为是一个子类去掉类声明后的类名,称作匿名类匿名类就是一个子类,由于无名...
  • Java匿名类

    2019-01-18 18:29:22
    我个人理解匿名类其实就是创建一个对象的行为,只不过这里没有类的声明只是通过类体来进行创建,创建的对象为该类体的子类的对象,也可以继承重写父类的方法。通过下面的代码来直观的展示一下: import java.text....
  • 本文实例讲述了Java匿名类,匿名内部类。分享给大家供大家参考,具体如下:本文内容:内部类匿名类首发日期 :2018-03-25内部类:在一个类中定义另一个类,这样定义的类称为内部类。【包含内部类的类可以称为内部类...
  • 主要介绍了Java匿名类,匿名内部类,结合实例形式分析了Java匿名类,匿名内部类相关原理、用法及操作注意事项,需要的朋友可以参考下
  • JAVA匿名类

    2012-09-24 09:48:52
    匿名类用的最多的地方就是在javaFrame中,给某一个窗体控件,比如说是一个按钮,添加一个Listener了。 添加Listener的代码如下: 匿名类和普通类的区别在于,匿名类在声明之处通过new来创建一个对象,然后该类就...
  • 本文实例讲述了Java匿名类,匿名内部类。分享给大家供大家参考,具体如下:本文内容:内部类匿名类首发日期 :2018-03-25内部类:在一个类中定义另一个类,这样定义的类称为内部类。【包含内部类的类可以称为内部类...
  • Java 匿名类在本教程中,您将借助示例学习Java中的匿名类。在Java中,一个类可以包含另一个称为嵌套类的类。可以在不提供任何名称的情况下创建嵌套类。没有任何名称的嵌套类称为匿名类。必须在另一个类中定义一个...
  • 匿名类是指没有类名的内部类,必须在创建时使用 new 语句来声明类。其语法形式如下:new () {// 类的主体};这种形式的 new 语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个给定的接口。使用匿名类...
  • Java匿名类(匿名内部类) 学习的参考博文:无恨之都 1. 初识 匿名类 标准说法: 内部类包括:成员类、局部类、匿名类(匿名内部类)。 匿名类概念: 匿名类可以使你的代码更加简洁 (JDK8之后Lambda更简洁)。 你可以...
  • 先上一段经典匿名类代码来个印象,实现接口的匿名类Runnable runnable=new Runnable() {@Overridepublic void run() {System.out.println("匿名类");}};1、定义匿名类主要是在有特殊需要的时候创建一个对象来执行...
  • Java匿名类真的非常罗嗦.除了需要定义它们的大量样板外,Java的一些设计决策意味着许多常见任务比其他语言更冗长.例如,将可变的upvalues导入到闭包中是Java中的一个难题.基本上,Java不支持upvalues;相反,他们通过将...
  • 匿名类,正如名字一样在java中没有名字标识的类,当然了编译后还是会安排一个名字的。下面是一个关于匿名类的简单例子:public static void main(String[] args) throws InterruptedException {Thread t=new Thread...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,982
精华内容 6,792
关键字:

java匿名类

java 订阅