1.在Java中什么是上转型对象?
假设,A类是B类的父类,当用子类创建一个对象,并把这个对象的引用放到父类的对象中时,称对象a是对象b的上转型对象。假设A是B的子类,例子如下:此刻A类对象a便是B类对象b的上转型对象.
A a;
a = new B();
2.上转型对象的性质:
1、对象的上转型对象的实质是子类负责创建的,但上转型对象会失去原对象的一些属性和功能。
2、上转型对象不能操作子类声明定义的成员变量,也不能使用子类声明定义的方法。
3上转型对象可以操作子类继承的成员变量和隐藏的成员变量,也可以使用子类继承的或重写的方法。
4、上转型对象不能操作子类新增的方法和成员变量。
5、将对象的上转型对象再强制转换到一个子类对象,这时,该子类对象又具备了子类的所有属性和功能。
代码如下:
class A{
int m;
int getM(){
return m;
}
int seeM(){
return m;
}
}
class B extends A{
int m;
int getM(){
return m+10;
}
}
public class C{
public static void main(String args[]){
B b = new B();
b.m = 10;
System.out.println(b.getM());
A a = b;
a.m = -10; //上转型对象访问的是被隐藏的m
System.out.println(a.getM());//上转型对象调用的一定是子类重写的getM()方法
System.out.println(b.seeM());//子类继承的seeM()方法操作的m是被子类隐藏的m
}
}
运行结果:
20
20
-10
下面就出现了一个问题:
上转型对象究竟有什么作用呢?我们从上转型对象的性质中看到的只是它的缺点,接下来我将用一段代码演示上转型对象的好处:
class People {
public void say() {
System.out.println("Java这门课真奇妙!");
}
public void grade() {
System.out.println("考90分以上!");
}
}
class XMH extends People {
public void say() {
System.out.println("Java这门课真奇妙!");
}
public void grade() {
System.out.println("熊铭辉要考100分!");
}
}
public class XLT extends People {
public void say() {
System.out.println("Java这门课真奇妙!");
}
public void grade() {
System.out.println("不要挂科!");
}
public void eat() {
System.out.println("我要吃8碗饭!");
}
public static void main(String[] args) {
show(new XLT());
show(new XMH());
}
public static void show(People people) {
people.say();
people.grade();
}
}
其中代码:
public static void main(String[] args) {
show(new XLT());
show(new XMH());
}
public static void show(People people) {
people.say();
people.grade();
}
就体现了向上转型的优点,这也体现了Java抽象编程的思想。如果此处没有向上转型,要实现show每个子类的功能,那么有几个子类就要写多少函数。代码如下:
public static void main(String[] args) {
show(new XLT());
show(new XMH());
}
public static void show(XLT xlt) {
XLT.say();
XLT.grade();
}
public static void show(XMH xmh) {
XMH.say();
XMH.grade();
}
所以我们不难发现,假设一个类有很多子类,我们在编程时,代码量将急剧增加,这是我们不想看到的结果。通过使用上转型对象,我们极大的提高了代码的简洁性。当然向上转型还有其它的作用,多态的条件之一便是上转型,而面向对象编程的三大法宝便有:封装、继承、多态。