this()不同于super()
super()是调用父类结构方法的关键词,必须是子类结构的第一行。this()指向本对象的指针,用于调用当前类别的其他结构方法。
public class Animal { private String name; public Animal(String name) { this.name = name; System.out.println("Animal constructor called."); }}public class Dog extends Animal { private int age; public Dog(String name, int age) { super(name); // 调用父类结构函数 this.age = age; System.out.println("Dog constructor called."); } public Dog(String name) { this(name, 0); // 调用另一个结构函数 System.out.println("Another Dog constructor called."); }}
a=a+b与a+=b的区别
+=隐式将添加操作结果的类型转换为赋值接收的类型。如果加入两个整数,则在执行+操作之前将byte转换为int(如果小范围接收大范围值,则报告编译错误)。
byte a = 127;byte b = 127;b = a + b; // error : cannot convert from int to byteb += a; // ok
3*0.1 == 0.3 为false
这是由于计算机在计算二进制浮点数时可能存在精度误差造成的。在二进制中,0.1不能准确地表示为有限的小数字。因此,当计算3时0.1时,0.1将在计算机内部转换为最接近它的二进制浮点,然后乘法操作。由于转换过程中可能存在一些小误差,结果可能略微偏离预期值。例如,在某些情况下,计算机内部可能使用比0.1略大的近似值,导致结果与预期值不同。这就是为什么30.1==0.3是false的原因。
泛型的作用- 提供代码重用性:通过泛型,我们可以编写不同类型的代码,以提高代码的可重用性。
- 类型检查:通过泛型,编译器可以在编译过程中发现类型错误,从而避免类型转换错误造成的操作错误。
- 减少类型转换:使用泛型时,无需强制转换类型,代码更加简洁清晰。
- 支持集合框架:Java集合框架采用泛型,使程序员能够创建和操作各种类型的集合对象。
简单泛型类
多元泛型
定义泛型接口 如何定义泛型方法的使用?泛型法是在调用方法时指出泛型的具体类型。
定义泛型方法语法格式
调用泛型方法语法格式
解释一下,在定义泛型方法时,必须在返回值之前添加一个,以声明这是一种持有泛型T的泛型方法,然后使用泛型T作为方法的返回值。Class的功能是指示泛型的具体类型,而Class类型的变量C可以用来创建泛型的对象。
为什么要用变量c来创建对象?既然是泛型方法,就意味着我们不知道具体的类型是什么,也不知道结构方法是什么,所以没有办法去new一个对象,但是可以用变量c的newinstance方法来创建对象,也就是用反射来创建对象。
Class类型需要泛型方法的参数,而Classs则需要Class类型.forName()方法的返回值也是Class,所以可以使用Classs.forName()作为参数。其中,forName()方法中的参数是什么类型,返回的Class是什么类型。在本例中,forName()方法中介绍了User类的完整路径,因此返回了Class类型的对象。因此,在调用泛型方法时,变量c的类型是Class,因此泛型方法中的泛型T被指示为User,因此变量obj的类型是User。
当然,泛型方法不仅可以有参数Class,还可以根据需要添加其他参数。
为什么要用泛型法?因为一般类型在实例化时应该指出类型,如果你想改变一种类型,你必须重新new-次,这可能不够灵活;一般方法在调用时可以指出类型,更灵活。
泛型的上限和下限在使用普通类型时,我们可以限制引入的普通类型实参的上下边界。例如,类型实参只允许引入某种类型的父类或子类。
上限
通过extends关键字指定泛型的上限,表示只能将某一类及其子类引入泛型参数。例如:
下限
下限由super关键字指定,表示只能将某一类及其父类作为泛参数传入。例如:
Java中泛型时伪泛型擦除Ja的泛型中类型Va泛型的特点是从JDK1.5开始添加的。因此,为了与之前的版本兼容,Java泛型的实现采用了“伪泛型”的策略,即Java在语法上支持泛型,但在编译阶段将进行所谓的“类型擦除”(Type Erasure),将所有泛型表示(尖括号中的内容)替换为特定类型(其对应的原始生态类型),就像完全没有泛型一样。