精华内容
下载资源
问答
  • 什么是匿名类,有什么好处? 不用定义、没有名字的类,使用一次便可丢弃。好处是简单、随意、临时的。

    什么是匿名类,有什么好处?

    不用定义、没有名字的类,使用一次便可丢弃。好处是简单、随意、临时的。

    展开全文
  • java匿名内部类什么是匿名内部?匿名内部的使用场景?匿名内部如何创建?匿名内部的实现和使用例1(实现接口)例2(继承) 什么是匿名内部? 匿名内部,顾名思义,就是不知道这个到底是什么名字,也...

    什么是匿名内部类?

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

    匿名内部类的使用场景?

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

    匿名内部类如何创建?

    new 类名(参数) | 实现接口()
    {
    // 匿名内部类的类体部分
    }
    从上面的定义可以看出,匿名内部类必须继承一个父类,或实现一个接口,但最多只能继承一个父类,或者实现一个接口。
    两个规则:
    	匿名内部类不能是抽象类。
    	匿名内部类不能定义构造器。由于匿名内部类没有类名,所以无法定义构造器,但匿名内部类可以初始化块,可以通过初始化块来完成构造器需要完成的工作。
    

    匿名内部类的实现和使用

    例1(实现接口)

    首先,定义一个匿名类要实现的接口,代码如下

    public interface Product{
     double getPrice();
     double 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 Device{
    	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对类的定义方式之一。

    为什么要使用匿名内部类

    在实际开发中,我们常常遇到这样的情况:一个接口/类的方法的某个实现方式在程序中只会执行一次,但为了使用它,我们需要创建它的实现类/子类去实现/重写。此时可以使用匿名内部类的方式,可以无需创建新的类,减少代码冗余

    下面详细说明一下

    假设当前有一个接口,接口中只有一个方法

    public interface Interface01 {
        void show();
    }
    

    为了使用该接口的show方法,我们需要去创建一个实现类,同时书写show方法的具体实现方式

    public class Interface01Impl implements Interface01{
        @Override
        public void show() {
            System.out.println("I'm a impl class...");
        }
    }
    

    如果实现类Interface01Impl全程只使用一次,那么为了这一次的使用去创建一个类,未免太过麻烦。我们需要一个方式来帮助我们摆脱这个困境。匿名内部类则可以很好的解决这个问题。

    我们使用匿名内部类

    public static void main(String[] args) {
        Interface01 interface01 = new Interface01() {
            @Override
            public void show() {
                System.out.println("这里使用了匿名内部类");
            }
        };
        //调用接口方法
        interface01.show();
    }
    

    成功运行结果

    这里使用了匿名内部类

    如何使用匿名内部类

    基本格式

    new 接口/类名(参数1, 参数2...){
        实现方法1(){
            
        }
        实现方法2(){
            
        }
        ......
    };
    

    在上文的使用中,我们没有创建实现类就实现了具体的show方法。同时定义了接口的对象变量interface01。我们发现,这个变量和平常使用多态后的使用方式没有区别。

    通常,我们也习惯用这样的方式创建并启动线程

    new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("我是一个线程");
        }
    }).start();
    

    常见问题

    1. 匿名内部类是怎么实现的

      在上文代码编译后,我们查看一下class文件的路径

    BxrQZd.png

    再反编译一下看看

    BxsW1f.png

    至此,我们可以得知,匿名内部类在编译期间,会生成一个名称以$编号结尾的class文件,即它被识别为一个真实的类,仅在编译前(java文件)为匿名的形态。

    1. 匿名内部类只可以使用在接口上吗

      不是的。匿名内部类可以用在具体类、抽象类、接口上,且对方法个数没有要求。

      举例说明:设存在具体类Class01,抽象类AbstractClass01,接口Interface01

      //具体类
      public class Class01 {
          public void show(String s){
              System.out.println("啦啦啦");
          }
      }
      
      //抽象类
      public abstract class AbstractClass01 {
          abstract void show(String s);
      }
      
      //接口
      public interface Interface01 {
          void show(String s);
      }
      

      测试类TestInner

      public class TestInner {
          public static void main(String[] args) {
              
              //重写具体类的方法
              new Class01(){
                  @Override
                  public void show(String s) {
                      System.out.println("我是一个" + s);
                  }
              }.show("具体类");
      
              //重写抽象类的抽象方法
              new AbstractClass01(){
                  @Override
                  void show(String s) {
                      System.out.println("我是一个" + s);
                  }
              }.show("抽象类");
      
              //实现接口的抽象方法
              new Interface01(){
                  @Override
                  public void show(String s) {
                      System.out.println("我是一个" + s);
                  }
              }.show("接口");
      
      
          }
      }
      

      运行结果

      我是一个具体类
      我是一个抽象类
      我是一个接口

    展开全文
  • 什么是匿名内部

    2021-06-03 08:35:57
    匿名内部 :是内部的简化写法。它的本质是一个 带具体实现的 父类或者父接口的 匿名的 子类对象。 如果接口的实现(或者是父类的子类)只需要使用...{…}这才是匿名内部的内容 另外还要注意几点问题: 匿名内部

    匿名内部类 :是内部类的简化写法。它的本质是一个 带具体实现的 父类或者父接口的 匿名的 子类对象。

    如果接口的实现类(或者是父类的子类)只需要使用唯一的一次,
    那么这种情况下就可以省略掉该类的定义,而改为使用【匿名内部类】。

    匿名内部类的定义格式:
    接口名称 对象名 = new 接口名称() {
    // 覆盖重写所有抽象方法
    };

    对格式“new 接口名称() {…}”进行解析:

    new代表创建对象的动作
    接口名称就是匿名内部类需要实现哪个接口
    {…}这才是匿名内部类的内容
    另外还要注意几点问题:

    匿名内部类,在【创建对象】的时候,只能使用唯一一次。
    如果希望多次创建对象,而且类的内容一样的话,那么就需要使用单独定义的实现类了。
    匿名对象,在【调用方法】的时候,只能调用唯一一次。
    如果希望同一个对象,调用多次方法,那么必须给对象起个名字。
    匿名内部类是省略了【实现类/子类名称】,但是匿名对象是省略了【对象名称】
    强调:匿名内部类和匿名对象不是一回事!!!

    展开全文
  • 1.什么是匿名内部? 匿名内部,即没有名字的内部,因为此类只需要使用一次,所以没有起名字的必要 创建匿名内部时,必须作为new语句的一部分来声明, 用法: 接口名/ 对象名 = new 接口名/(){ // 匿名...
  • 什么是匿名内部? 顾名思义 匿名 就是没有名字,一个没有名字的内部,称为匿名内部。 下面先看一个例子,比如说你想和你的女朋友去看春节档的《唐人街探案三》 这个时候我们要先定义一个接口,去看唐探3的接口...
  • 是什么匿名内部

    2021-03-05 16:00:53
    匿名内部原理
  • 什么是Java匿名内部

    2017-11-20 14:58:41
    Q:上面的一段代码中,Thread类是匿名内部吗? A:是匿名内部(其实还不准确)。Thread本身并不是抽象或接口,但此处重写了run方法,只有子类可以重写父类方法,所以new出的并不是Thread,而是Thread的...
  • 什么是匿名内部? 说白了就是没有名字的接口 1、匿名内部中,没有构造函数,但是可以用构造代码块; 2、局部变量 必须定义成final的才能使用 内部访问外部属性为什么必须用final? 因为内部中的属性的...
  • 目录 匿名类型 匿名类型说明 匿名类示例 ...匿名类型没有名称的类,这一种方便的方法,可用...也就是,匿名类实际上就是没有类型名称,其他地方与类一样使用的。 匿名类示例 先看一个普通的类,具有三个...
  • 有时如此简单,都没有必要清清楚楚明确出类名,用一下就完,就用匿名内部。注意: 下面的new FigureMark_to_win(){。。。。};的语法形式。它和以往的new FigureMark_to_win()不同,现在的这个new的FigureMark_to...
  • Inter i = new Inter(){ @Override public void method(){ } }

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,061
精华内容 1,224
关键字:

什么是匿名类