用超类对象接收new出来的子类对象时,数据会不会丢失

news/2024/7/3 12:25:00 标签: 多态, 继承

我么会常常遇到用超类的对象来接收new的子类对象,这样会不会出现数据丢失呢?我们先来看这段代码:

public class Car {

	private String name = "汽车";
	private double price = 10000;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public double getPrice() {
		return price;
	}
	public void setPrice(double price) {
		this.price = price;
	}	
		
}
public class BWMCar extends Car {
	private String color;

	public String getColor() {
		return color;
	}

	public void setColor(String color) {
		this.color = color;
	}	
}
public class CarManage {
	public static void main(String[] args) {
		Car car = new BWMCar();
		car.getColor();        //这里会报错
		
	}

}

由此可见上述情况是会出现数据丢失的,超类无法全部接收子类的属性和方法,他只能接收到自己有的那一部分,当它执行相应的方法时,调用的还是子类传给他的属性和方法,也就是说只有部分的数据会丢失。

这个看起来不安全,其实后面的工厂模式是运用了这种方法,也成为多态

 


http://www.niftyadmin.cn/n/898650.html

相关文章

对象调用方法的解析过程

弄清楚如何在对象上应用方法调用非常重要。下面假设要调用x.f(args),隐式参数x声明为类C的一个对象。 下面是调用过程的详细描述: (1)编译器查看对象的声明类型和方法名。假设调用x.f(param),且隐式参数x声明为C类的对象。 需要注意的是:有可…

阻止继承:final类和方法

有时候,可能希望阻止人们利用某个类定义子类。不允许扩展的类被称为final类。如果在定义类的时候使用了final 修饰符就表明这个类是final类。例如,假设希望阻止人们定义Executive类的子类,就可以在定义这个类的时候,使用final修饰…

对象的强制类型转换

我们以前说过,将一个类型强制转换成另外一个类型的过程被称为类型转换。Java程序设计语言提供了一种专门用于进行类型转换的表示法。例如: double X 3.405;int nx (int) x; 将表达式x的值转换成整数类型,舍弃了小数部分。 正像有时候需要将浮点型数…

抽象类abstract

我们先来看一下Person类和子类的继承图,我们可以声明一个Person的父类,然后让它的子类派生,因为它的子类各有不同的属性和参数,所以为Person类实例方法显得有些浪费内存,这样,我们可以使用abstract关键字进…

equlas方法

Object类中的equals方法用于检测一个对象是否等于另外一个对象。在Object类中,这个方法将判断两个对象是否具有相同的引用。如果两个对象具有相同的引用,它们一定是相等的。从这点上看,将其作为默认操作也是合乎情理的。然而,对于…

Java类HashCode说明以及派生类一些HashCode重写

散列码(hash code)是由对象导出的一个整形值。散列码是没有规律的。如果x和y是两个不同的对象,x.hashCode()与y,hashCode()基本上不回相同 String类使用下列算法计算散列码:这样会是散列码更加均匀 int hash 0;for …

Java从上往下, 从右向左斜着打印二维数组

我们随便定义一个二维数组: int[][] arr {{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4}}; 用图来解释一下: 也就是说,像上图一样,打印数组 0 1 0 2 1 0 3 2 1 0 4 3 2 1 0 4 …

A + B 问题(给定两个数,求两个数的和,不能使用+号)

要实现不能用加号求两个数的和&#xff0c;我们可以用位运算符。 我们先来代码&#xff1a; static int add(int a, int b){//思路&#xff1a; aba^b (a&b)<<1;其中a^b是不考虑进位的加.//只有位相同才有进位所以(a&b)<<1则是进位的值&#xff0c;//每…