精华内容
下载资源
问答
  • Java 匿名类
    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匿名类,匿名内部类,结合实例形式分析了Java匿名类,匿名内部类相关原理、用法及操作注意事项,需要的朋友可以参考下
  • Java 匿名类(匿名内部类)

    千次阅读 多人点赞 2020-12-25 23:41:48
    Java匿名类(匿名内部类) 学习的参考博文:无恨之都 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接口的地方

    局部类的格式是:

    1. 创建局部类并且实现接口:class EnglishGreeting implements HelloWorld {...}
    2. 创建局部类的实例化对象并用接口类型接收:HelloWorld englishGreeting = new EnglishGreeting();
    3. 调用实例化对象的方法

    匿名类的格式是:

    1. 创建匿名类实现接口同时对其进行实例化:HelloWorld frenchGreeting = new HelloWorld() {...}
    2. 调用实例化对象的方法

    【区别】

    1. 局部类EnglishGreeting实现HelloWorld接口,有自己的类名:EnglishGreeting,定义完成后需要再对其实例化对象:englishGreeting才能可以使用方法
    2. 匿名类在定义时就已经实例化成对象:frenchGreeting,定义完了就可以直接使用方法
    3. 匿名类是一个表达式,因此在定义的最后用分号结束

    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();
    }
    

    【结果】

    杰瑞
    

    【分析】

    1. main方法创建匿名类实现TomInterface接口并实例化:new TomInterface{...}
    2. 调用匿名类对象的setName方法,将杰瑞赋值给匿名类的成员变量name,并返回当前实例this给接口变量tif
    3. 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方法=张三
    匿名类 - 李四
    

    【分析】

    1. 创建父类对象并调用getName方法,这个不用细说
    2. 创建匿名类继承父类并实例化对象:pc,本次匿名类调用的是父类的带参构造,将参数赋值给了父类的name
    3. 调用匿名类重写的getName方法,得到新的name

    3.3 区别

    Demo demo = new Demo(xxx){...}
    
    1. 操作符:new
    2. 一个要实现的接口或要继承的类,示例3.1 是实现接口,示例3.2 是继承类
    3. 一对括号,如果是匿名子类,那么父类有构造参数就填,不带参就空着;如果匿名类是实现接口,那么括号里需要空着
    4. {...},括号里括着的是匿名类的声明主体
    5. 末尾的;号,因为匿名类的声明是一个表达式,是语句的一部分,所以需要分号结尾
    6. 表面上看匿名类没有类名,没有构造参数。但其实在编译的时候,编译器会给匿名类分配类名和构造器,只是我们无法操作也不能复用。如需验证,可以看编译后的class文件,多出一个命名格式:匿名类定义类$?.class的文件。例如示例3.2,匿名类的class文件就是:ExtendTest$1.class
    展开全文
  • 本文主要介绍了Java匿名类的两种实现方式。具有很好的参考价值,下面跟着小编一起来看下吧
  • 主要介绍了Java通过匿名类来实现回调函数的例子,回调函数就是一种函数签名(若干个输入参数、一个输出参数)的规范,java虽不存在函数声明,但是java可以用接口来强制规范。具体操作步骤大家可查看下文的详细讲解,...
  • 主要简单给我们介绍了java匿名内部构造函数,并附上了简单的示例,有需要的小伙伴可以参考下。
  • 1】可以定义在另一个的内部 2】也可以定义为内部静态,使用 static 关键字 3】还可以定义为局部内部,定义在方法中 一、什么是Lambda表达式? lambda表达式是为了简写代码的写法 二、什么是函数式...

    前言:
    Lambda流式操作是Java8中重要的特性,lambda表达式核心概念为 函数式接口、::、-> 等基本语法,可以大大减少代码量的编写,使代码更加优雅
    1、只有一个抽象函数的接口,就是函数式接口
    2、:: 可以称之为域运算符,主要是用来获取方法
    3、-> 的语法为 (变量或参数)->{代码体},是匿名函数的写法。也叫变量和代码的分隔符
    4、当只获取一个方法属性的时候 :: 和 -> 可以通用

    介绍:

    1. 接口:
      1】接口可以定义在另一个类的内部
      2】接口中的方法都是抽象方法
      3】接口中的常量都是静态常量


    2. 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 类名{...

    浅析匿名类的使用方法

    匿名类是某种已定义的类的继承,该父类必须真实存在。匿名类属于内部类无法构造静态代码块。
    构造匿名类对象主要有以下几种方式:

    1. new 类名{类体}
      这种方式的例子是注册事件监听器
    2. 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类型。所以你在匿名类中新定义的方法无法使用。但是对父类方法的重写仍然有效。

    展开全文
  • JAVA匿名类创建对象.doc
  • 主要给大家介绍了关于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 = ...
  • Java在嵌套类型这里提供的特性比较多,假设:Java的字节码只支持静态嵌套,内部、局部内部匿名局部内部都是编译器提供的语法糖,这个假设目前没法验证(看不懂字节码),本文先来看一下C#是如何为我们提供...
  • 理解匿名类与外部类以及方法中final参数的关系,分析Android应用程序中存在的内存泄漏
  • java匿名类序列化问题

    千次阅读 2017-10-18 12:23:43
    java不同语法的应用在duboo服务中产生诡异的序列化错误,两种语法表达,一个无法序列化而另外一个正常
  • 主要介绍了java 中使用匿名类直接new接口详解及实例代码的相关资料,需要的朋友可以参考下
  • java匿名类对象的使用

    千次阅读 2018-10-10 23:38:31
    java匿名类对象的的使用 要点 1.创建的类对象是匿名的 1. 当我们只需要一次调用类的对象的时候,我们就可以考虑使用匿名类的创建方式创建匿名类对象。 2. 创建的匿名类对象只能够调用一次! 2.匿名类只能够...
  • java 成员内部类使用 内部匿名类 方法参数匿名类 方法匿名类
  • Java匿名内部使用与示例

    千次阅读 2021-02-25 19:47:42
    首先说为什么有匿名类(产生的使命)两个原因1.简化代码编写某种情况下,类只需要扩展一个方法,没必要为了一个方法单独去写一个子类,然后然后调用子类,此时需要匿名类2.在不同的包内的类内调用类的protected方法...
  • 主要介绍了Java局部内部匿名内部,结合实例形式分析了java局部内部匿名内部相关定义、原理与用法,需要的朋友可以参考下
  • 以下是对java中的匿名内部进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助
  • java匿名内部笔试题
  • 匿名内部也就是没有名字的内部正因为没有名字,所以匿名内部只能使用一次,它通常用来简化代码编写但使用匿名内部还有个前提条件:必须继承一个父类或实现一个接口实例1:不使用匿名内部来实现抽象方法...
  • java匿名类的定义

    2018-03-30 11:51:00
    2.** 匿名类定义在 匿名类对象创建对象的表达式中(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:41
    Java内部匿名内部的用法 【尊重原创,转载请注明出处】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 语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 244,501
精华内容 97,800
关键字:

java匿名类

java 订阅