精华内容
下载资源
问答
  • java匿名内部什么是匿名内部匿名内部的使用场景?匿名内部如何创建?匿名内部的实现和使用例1(实现接口)例2(继承) 什么是匿名内部匿名内部,顾名思义,就是不知道这个到底是什么名字,也...

    什么是匿名内部类?

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

    匿名内部类的使用场景?

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

    匿名内部类如何创建?

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

    匿名内部类的实现和使用

    例1(实现接口)

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

    public interface Product{
     double getPrice();
     String 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 Anony {
    
        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 匿名类 protect构造方法 Gson

    千次阅读 2013-03-01 10:34:34
    Type mapType = new TypeToken>(){}.getType();...该方法是获取从json转为要转为java对象的对象类型。 Type mapType = new TypeToken>() {}.getType();  String data= ((String[])parameters.get("data"))[0];

    Type mapType = new TypeToken<Map<String,Object>>(){}.getType();

    该方法是获取从json转为要转为java对象的对象类型。

    Type mapType = new TypeToken<Map<String,Object>>() {}.getType();
                    String data= ((String[])parameters.get("data"))[0];
                    Map<String,Object> params = gson.fromJson(data, mapType);

     

    刚开始看这段代码的时候,大概知道是干什么用的。但是对这里的语法很是不理解。

    为什么这样就可以new一个不能访问的类对象呢。按照理解,不再同一个包下(Gson下的类),时不能直接new的。但是神奇的是只要加一个{}

    就可以了。

    其实是这样的这里new的并不是TypeToken对象,而是在此处定义了一个匿名类。该匿名类继承自TypeToken。并对该匿名类进行定义{} 里面什么都没有写。因为我们只需要用到父类的一个public方法而已。

    展开全文
  • 构造方法 定义java中的一般包含3个部分 属性构造方法普通方法 构造方法: 构造方法名称与类名相同,无返回值;每个中至少有1个构造方法;...如果定义的过程中没有定义构造方法,则会在实例化时系统自动生

    构造方法

    定义java中的类一般包含3个部分

    • 属性
    • 构造方法
    • 普通方法
    构造方法:
    • 构造方法名称与类名相同,无返回值;
    • 每个类中至少有1个构造方法;
    • 构造方法允许重载,重载时只需考虑改变参数类型或个数

    在实例化对象格式
    类名称  对象名称 = new  类名称()
    其中  类名称()  就是构造方法。
    如果定义类的过程中没有定义构造方法,则会在实例化时系统自动生成默认的无参数构造方法。
    如果重载了带参数构造方法,则系统将不会自动生成默认的构造方法,也就是在实例化时,需要带上参数,否则会报错。
    class Person{
       	 Person(){	//系统默认的无参数构造方法
    	
    	}
    
    	Person(String name,int age){	// 重载的带参数的构造方法
    		name=name;
    		age=age;
    	}
    	public void info(){
    		System.out.println(name,age);
    	}
    }
    
    public class testDemo(){
    	public static void main(String args[]){
    		Person per=new Person("张三",20); //重载了带参数的构造方法,在实例化时需要带参数,否则会报错
    		per.info();
    	}
    }

    疑问:构造方法没有返回值,为什么不用void声明?
    public Person() //构造方法
    public void Person()    //普通方法
    从结构上来看,区分出普通方法与构造方法

    构造方法的作用
    • 利用构造方法对属性初始化处理
    • 如果有很多个属性参数,可以避免重复的调用setter方法。(可以一次性传递多个参数,不用多次setter方法赋值)
    • setter方法除了赋值之外,也可以对属性进行修改,也就是重新赋值。

    匿名对象

    new Person("张三",20).info();
    不用对象名  Person per ,只使用后边的new Person("张三",20) ,这个就是匿名对象。
    匿名对象不会有栈内存空间,所以使用一次后就会成为垃圾。
    一般使用有名对象,使用的多了或者对象太多了,可直接使用匿名对象。



    展开全文
  • 攻击者利用节点度信息,通过识别目标节点的方法对局部社会网络进行攻击过程,分析了利用k匿名方法对该攻击进行隐私保护时存在的信息损失问题,针对该问题,提出了一种基于信息损失量估计的k匿名图流构造方法,通过...
  • Java 匿名函数、构造方法、构造代码块、方法重载与方法重写

    匿名函数

    Java Lambda 表达式(又名闭包(Closure)/匿名函数)

    构造方法

    构造方法的作用:给对象进行初始化,对象创建时初始化属性值

    创建构造方法

    • 构造方法没有返回类型,方法名和类名保持一致
    • 构造方法不是我们手动调用的,是对象被创建的时候jvm(java虚拟机)调用的
    • 如果一个类我们没有给它定义构造方法,jvm(java虚拟机)在编译的时候 会给这个类默认添加一个无参构造方法
    • 如果自己定义了构造方法,那么jvm不会再创建无参构造方法
    • 创建对象的时候,有几个参数,就要有相应的构造方法,也是对应的要有几个参数

    格式

    • 修饰符 类名(参数列表){}
    • 直接类名 (参数列表){}

    方法重载

    方法是可以重名的,我们把这种重名的方法叫 方法的重载

    注意

    • 方法名一样才叫方法重载
    • 任何方法(普通方法,构造方法)都可以实现方法重载
    • 参数列表要保证顺序 或者 个数是不一样的
      例如:
      • Person (String a , int b);
      • Person ( int b, String a);//顺序不一样
      • Person (String a , int b,String c);//个数不一样

    方法重写

    Java程序中,类的继承关系可以产生一个子类,子类继承父类,它具备了父类所有的特征,继承了父类所有的方法和变量。子类可以定义新的特征,当子类需要修改父类的一些方法进行扩展,增大功能,程序设计者常常把这样的一种操作方法称为重写,也叫称为覆写覆盖

    在重写方法时,需要遵循以下的规则:

    • 父类方法的参数列表必须完全与被子类重写的方法的参数列表相同,否则不能称其为重写而是重载
    • 父类的返回类型必须与被子类重写的方法返回类型相同,否则不能称其为重写而是重载
    • Java中规定,被子类重写的方法不能拥有比父类方法更加严格的访问权限
    • 由于父类的访问权限修饰符的限制一定要大于被子类重写方法的访问权限修饰符,而private权限最小。所以如果某一个方法在父类中的访问权限是private,那么就不能在子类中对其进行重写
    • 在继承过程中如果父类当中的方法抛出异常,那么在子类中重写父类的该方法时,也要抛出异常,而且抛出的异常不能多于父类中抛出的异常(可以等于父类中抛出的异常)
      例如:父类的一个方法申明了一个检查异常IOException,在重写这个方法时就不能抛出Exception,只能抛出IOException的子类异常,可以抛出非检查异常

    方法重写与方法重载的区别

    区别点方法重载方法重写(覆盖)
    英文OverloadingOveriding
    定义方法名称相同,参数的类型或个数不同方法名称、参数类型、返回值类型全部相同
    定义对权限没有要求被重写的方法不能拥有更严格的权限
    范围发生在一个类中发生在继承类中

    构造代码块

    构造代码块作用:给对象统一初始化。(对象创建之前都会走这个方法)

    注意

    • 构造代码块必须写在成员变量(属性)的位置
    • 对象创建之前都会走这个方法
    • java中编译器编译java源文件的时候,会把成员变量的声明放到最前面
    • 成员变量的初始化都是在构造方法中执行的,一旦经过java编译器编译,构造代码块的方法会移到构造函数中执行,放在构造函数的最前面执行
    • 如果没有构造方法,只有成员变量初始化和构造代码块,按照当前代码的顺序来执行

    代码块分为三类:

    • 构造代码块 : {…}
    • 局部代码块:写在方法中,也是以大括号来表示
    • 静态代码块:static{…}

    参考代码:

    User.java

    package com.DesignPattern.test;
    
    /**
     * Created by shun_c on 2017/7/3.
     */
    public class User {
    
        public String name;
        public static int age;
    
        {
            age = 21;
            System.out.println("user in 构造代码块 前 " + age);
        }
    
        static {
            age = 111;
            System.out.println("user in 静态代码块 " + age);
        }
    
        public User(){
            age = 31;
            System.out.println("user in 构造方法 " + age);
        }
    
        public void use(){
            age = 41;
            System.out.println("user in use 方法 " + age);
        }
    
        public static void main(String [] args){
    
            User user = new User();
            user.age = 51;
            System.out.println("user in main " + user.age);
            user.use();
        }
    
        {
            age = 61;
            System.out.println("user in 构造代码块 后 " + age);
        }
    }

    Student.java

    package com.DesignPattern.test;
    
    /**
     * Created by shun_c on 2017/7/3.
     */
    public class Student extends User {
    
        {
            age = 71;
            System.out.println("student in 构造代码块 前 " + age);
        }
    
        static {
            age = 121;
            System.out.println("student in 静态代码块 " + age);
        }
    
        public Student(){
            age = 81;
            System.out.println("student in 构造方法 " + age);
        }
    
        public void use(){
            age = 91;
            System.out.println("student in use 方法 " + age);
        }
    
        {
            age = 101;
            System.out.println("student in 构造代码块 后 " + age);
        }
    
        public static void main(String [] args){
            Student student = new Student();
            System.out.println("student in main " + student.age);
            student.use();
        }
    }

    run : User.java

    运行User.jpg

    run : Student.java

    运行Student.jpg

    展开全文
  • 主要简单给我们介绍了java中匿名内部类构造函数,并附上了简单的示例,有需要的小伙伴可以参考下。
  • 2、构造方法定义时没有返回值类型的声明 3、不能在构造方法中使用return 返回一个内容 4、如果一个中没有明确的声明一个构造,则会自动生成一个无参的什么都不做的构造方法 5、构造方法允许重载
  • 工程师培训资料;本章学习目标;构造方法;定义构造方法;利用构造方法为属性赋值;构造方法重载;构造方法重载;匿名对象;谢谢大家的时间
  • java匿名类定义

    2018-03-30 11:51:00
    匿名类不能有自定定义构造方法,编译系统自动根据(<参数列表>)列表调用超类中相应的构造方法 父类或者接口名 只是一个标识。表名匿名类需要实现的或者接口。new 后面不是构造器 注意括号后面的分号不可...
  • 1、什么是面向对象:万物皆对象,面向对象是一种更加优秀的程序设计方法,它的基本思想是使用、对象、继承、封装、消息等概念来进行程序的设计。是从世界客观存在的事物(即对象)出发,并根据这些事物的本质特点,...
  • 什么是构造方法?   只要有一个对象实例化则就会调用构造方法。 在构造方法中要注意以下几点: —构造方法的名称必须与类名一致 —构造方法的声明处不能有任何返回值类型的声明 —不能在构造方法中使用...
  •  如何new一个不在同个包中只有protected构造方法的对象呢?在讲解如何实现之前,来讲一下事情的缘由。下面将说明如何实现(这里主要讲的是如何使用匿名内部实现)。后续描述的内容如有问题请广大读者能够耐心...
  • 构造方法定义语法与调用时机

    千次阅读 2018-11-18 11:29:48
    为了使程序可以被安全地初始化,C++引入了构造器(也可以成为构造方法)的概念,这是一个在创建对象时被自动调用的特殊方法。Java中也采用了构造器,并且提供了“垃圾回收器”。对于不在使用的内存资源,垃圾回收器...
  • 匿名内部中的构造器问题

    千次阅读 2018-12-19 08:50:13
    今天遇到了一个题,涉及到匿名内部构造器问题,起初想当然地认为,匿名内部连名字都没有,怎么可能有构造器,但是一经过测试,傻眼了。原来在匿名内部中的构造代码块充当了构造器的作用。光说无益,上代码。...
  •   Java中与对象的定义与使用 ...  通过以上分析可以得知,所谓的构造方法就是使用关键字new实例化新对象时来进行调用的操作方法。对于构造方法定义,也要遵循以下原则: 方法名必须与...
  • 使用匿名内部构造函数

    千次阅读 2013-10-08 16:33:15
    建议39: 使用匿名类构造函数 阅读如下代码,看看是否可以编译: public static void main(String[] args) { List l1 = new ArrayList(); List l2 = new ArrayList(){}; List l3 = new ...
  • 使用匿名类构造函数

    千次阅读 2014-02-11 10:24:46
    使用匿名类构造函数 阅读如下代码,看看是否可以编译: public static void main(String[] args) { List l1 = new ArrayList(); List l2 = new ArrayList(){}; List l3 = new ArrayList(){{}}; ...
  • 匿名类构造函数很特殊

    千次阅读 2015-10-28 23:10:59
    在上一个建议中我们讲到匿名类虽然没有名字,但可以有一个初始化块来充当构造函数,那这个构造函数是否就和普通的构造函数完全一样呢?我们来看一个例子,设计一个计算器,进行加减乘除运算,代码如下: //定义一个...
  • 1.创建一个带默认构造方法(即无参构造)的,在构造方法中打印一条消息”Hello Constructor” 2.再为这个添加一个重载构造方法,令其接收一个字符串参数 3.并在这个有参构造方法中把“Hello Constructor”和...
  • Java的内部匿名类 , 您了解过吗?

    千次阅读 多人点赞 2020-07-23 08:35:30
    内部是指在一个外部的内部再定义一个,内部作为外部的一个成员,是依附于外部存在的。 内部类可以是静态的,通常用 protected 或者 private 关键字修饰,外部只能使用public或者系统默认权限。 如果...
  • Java 匿名类(匿名内部)

    千次阅读 2020-12-25 23:41:48
    可以定义一个的同时对其实例化。 它与局部很相似,不同的是它没有类名,如果某个局部你只需要使用一次,就可以使用匿名类匿名类是表达式,而非常规的 匿名类的使用场景:   一个局部只需要使用一...
  • public class TestClass { private InterfaceA a = new InterfaceA() { @Override public void testA() { ...//成员匿名类,例如在Android开发中常用的Handler。 public static void main(St...
  • 匿名内部、lambda和方法引用其实是相通的,从匿名内部到lambda到方法引用是一个进化的过程,是一个简化的过程,更加是一个从抽象的过程。 作用都是实现接口方法,换句话说就是实现接口;只是这个接口只有一个...
  • Java内部匿名内部的用法

    万次阅读 多人点赞 2016-07-21 15:46:41
    Java内部匿名内部的用法 【尊重原创,转载请注明出处】http://blog.csdn.net/guyuealian/article/details/51981163一、内部: (1)内部的同名方法 内部类可以调用外部方法,如果内部有同名方法...
  • java匿名内部和lambda(匿名方法)

    千次阅读 2019-07-28 13:05:21
    如果没有名字,就只能在定义类的时候直接实例化,否则这个永远得不到使用,也就没有意义。但这样也就代表这个不能重复使用,不能在其它地方继续实例化了。 如果没有名字,那怎么创建这个对象的引用呢...
  • 内部定义在A中的B就是内部,B在A中的地位和其他成员相同,意思就是说可以相互调用  优点:通过内部类可以...外部对象.new 内部类构造方法 Outer.Inner in = out.new Inner(); in.play(); 方...
  • Java的所有都有构造方法(2019.8.15修改,匿名内部也没有构造方法,因为没有类名) 构造方法的作用就是进行对象的初始化 构造方法相对于其他普通方法来讲,有以下一些原则: 1.方法名称必须与类名相同 2....
  • 匿名内部 ( 明白了匿名类就理解了函数回调,(此处与线程无关))有位老兄说:(匿名一是为了简化代码,而是告诉GC我这个对象只用一次,用完给我回收了) 关于JAVA内部:一个内部定义定义在另一个内部...
  • 构造方法,接口有无构造方法

    千次阅读 2008-01-08 11:38:00
    构造方法: 实例化对象时确定要调用... 构造方法的工作是创建某个所指定的对象,并将它置于有 效状态. 在构造方法运行前,对象只是无法区分的内存,在构造方法完成后,内存就存放了某个类型的一个有效实例. 定义结构方法时

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 119,295
精华内容 47,718
关键字:

匿名类可以定义构造方法吗