一键搞定内网穿透 联行号查询|开户行查询 在线工具箱 藏经阁
当前位置:首页 / 杂记 / 正文
声明对象时它前面类型的作用
class A{
 void f(Object a){System.out.println("a");};
}
class B extends A{
 void f(int a) {System.out.println("b");};
}

A obj1 = new B();
obj1.f(1);
B obj2 = new B();
obj2.f(1);
输出
a
b

对象obj1的类型是A,实际指的向内存中的对象是B类型。
实际对象是B的实例化,所以obj1里包含了两个方法f(Object)和f(int),这两个方法都能执行。
因为对象类型是A,所以决定了当执行f方法时,要执行参数类型为Object的f方法,所以第一次会输出a。

class A{
 void f(int a){System.out.println("a");};
}
class B extends A{
 void f(int a) {System.out.println("b");};
}

A obj1 = new B();
obj1.f(1);
B obj2 = new B();
obj2.f(1);
输出
b
b

对象obj1的类型是A,实际指的向内存中的对象是B类型。
实际对象是B的实例化,因为B把A中的f方法重写了,所以obj1里只有一个f(int)方法,那就是B中的f(int a方法)。
因为对象类型是A,所以决定了当执行f方法时,要执行参数类型为int的f方法,所以第一次输出b。

上面示例中A更适合定义成抽象类。

A obj1 = new B();,A类型决定了obj1可以执行的方法名及参数类型,A可能是B的父类,也可能是B继承的其一个接口,也可能就是B类。