子类继承父类后,无需定义也可使用父类定义好的 public/protected 方法和属性。也可以进行扩展和方法的重写。
final public class Trunk extends Car{
// 重定义属性(未公开无法继承)
String brand;
String description = "this is a trunk";
// 扩展属性
int goods;
// 扩展方法
public void load(int num){
this.goods += num;
}
// 子类构造方法
public Trunk(String brand){
super(brand);
this.goods = 0;
}
// 重写方法
@Override
public void go(String loc){
super.go(loc);
System.out.print(" with" + goods + "goods");
this.goods = 0;
}
}Copy to clipboardErrorCopied
Object 类是一切 java 类的父类。对于普通的 java 类,即便不声明也默认继承了 Object 类。
和类的继承类似。但 Java 类只能单继承,而 Java 接口可以多继承。
interface Charge extends Move, Fight{
public abstract void kill(int num);
}Copy to clipboardErrorCopied
重写是多态的前提,其允许父类引用指向子类对象(引用类型为父类,指向的实际对象类型为子类)。
Car mycar = new Trunk("Benz");
但不允许子类引用指向父类对象。
Trunk mycar = new Car("Benz");
如果两个类之间存在继承关系,可以进行强制类型转换。强制类型转换只能改变引用类型,实际指向对象类型不会发生变化。
Trunk newCar = (Trunk)mycar;
Car myCar = new Trunk("Benz");
myCar.go("London"); // (trunk) go to London with 0 goods
myCar.showNum(); // (car) 1
System.out.print(myCar.description); // (car) this is a car
Trunk newCar = (Trunk)mycar; // 强制类型转换
System.out.print(newCar.description); // (trunk) this is a trunkCopy to clipboardErrorCopied
JAVA 是动态编译语言(运行时才确定类型),支持反射机制。在运行状态中
通过反射机制能更好地支持多态,降低模块耦合,提高代码灵活度(根据传入类名不同,就能实例化出不同的对象)。
但是在性能上会有较大的损耗。
尽管在应用层面很少使用反射机制,但在设计基础框架的时候反射机制非常有用。
类的相关信息保存在以下类中,通过特定方法获取其对象能够知道这个类的信息。
public class Reflection {
public static void main(String[] args) {
/************************** 获取 Class 对象 **************************/
// 第一种方式 返回对象的类 【已有对象,获取类无意义】
Student stu = new Student();
Class stuClass = stu.getClass();
// 第二种方式 获取数据类型的静态 class 属性 【需要导入类包】
Class stuClass = Student.class;
// 第三种方式 返回路径下的类 【常用】
Class stuClass = Class.forName("Reflection.Student");
/************************** 获取 Class 信息 **************************/
// 获取类名
String name = stuClass.getName());
// 获取类的公有构造方法
Constructor[] conArray = stuClass.getConstructors();
// 获取类的全部构造方法
Constructor[] conArray = stuClass.getDeclaredConstructors();
// 获取类的指定构造方法(参数)
Constructor con = stuClass.getConstructor(null);
Constructor con = stuClass.getDeclaredConstructor(char.class);
// 获取类的公有属性
Field[] fieldArray = stuClass.getFields();
// 获取类的全部属性
Field[] fieldArray = stuClass.getDeclaredFields();
// 获取类的指定属性(属性名)
Field f = stuClass.getField("name");
// 获取类的公有方法
Method[] methodArray = stuClass.getMethods();
// 获取类的全部方法
Method[] methodArray = stuClass.getDeclaredMethods();
// 获取类的指定方法(方法名+形参类型)
Method m = stuClass.getMethod("main", String.class);
/************************** 在对象中使用 **************************/
Object obj = con.newInstance(); // 调用公有无参构造方法创建对象
f.set(obj, "X-man"); // 为对象的公有属性赋值
m.invoke(obj, "X-man"); // 调用对象的公有方法
}Copy to clipboardErrorCopied
泛型在编译时检查类型安全,编译过后泛型被擦除、实际类型才确定。反射是在编译期模拟 java 运行时的环境读取和调用程序,因此不能获得泛型的实际类型。但可以通过反射越过泛型检查:
在 String 泛型的集合中,你甚至可以添加一个 Integer 类型的值。
public class Demo {
public static void main(String[] args) throws Exception{
ArrayList<String> strList = new ArrayList<>();
Class listClass = strList.getClass();
Method m = listClass.getMethod("add", Object.class);
m.invoke(strList, 100);
}
}
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。