类的继承总结

以汽车生产线为例。
小轿车,卡车,大客车为汽车的一种,即汽车为父类,小轿车,卡车,大客车为子类。生产汽车要有方法,但若每生产一辆车就要再写一遍方法就会造成代码冗余,因生产线大致流程一致,如车品牌名,车颜色,型号,etc,故可将该部分代码在父类写好,如下:
/**
* 定义一个汽车生产线类
*
*/

public class CarProduction {
//设置车私有属性品牌名,颜色
private String name;
private String color;

//设置品牌名
public void setName(String name){
this.name = name;
}
//获取品牌名
public String getName(){
return name;
}

//设置颜色
public void setColor(String color){
this.color = color;
}
//获取颜色
public String getColor(){
return color;
}
//设置生产方法
public void produce(){
System.out.println(name+"已生产完毕,颜色是"+color);
}

}
设置好后,就可以让子类小轿车类继承父类汽车类,故而可以提高代码的重用性和程序的扩展性;继承关键字为extends,格式为public class SedancarProduction(子类或者超类) extends CarProduction(父类或者基类) { }

Java中类的继承只能是单继承,即只能有一个父类;对于没有设置父类的类Java会给其自动添加一个父类就是Object


子类继承父类后,子类就继承到了父类所有的属性和方法,但是注意,这并不代表子类可以调用父类所有的属性和方法!!!
子类调用父类时分两种情况,1.子类和父类在同一个包下:
在子类中和子类的对象,可以调用默认的,受保护的,公有的属性以及方法。

2.子类和父类在不同的包下:
子类的对象,可以调用公有的属性以及方法。(第三方类中,例如后面代码里的Produce类中实例化子类SedancarProduction的对象sed,可调用父类中setName,setColor方法)
在子类中可以调用受保护的,公有的属性以及方法。
但是呢,由于汽车类型是不一样的,即子类小轿车的生产方法会与父类生产方法不同,此时便需要方法重写,
方法重写的条件是:1.必须要存在继承关系;2.方法的返回值类型,方法名,参数个数,参数类型,参数顺序必须要完全一致;3.子类重写方法时的访问修饰符可以大于或者等于父类方法的访问修饰符。
重写时,只需在子类中对父类方法的方法体作需要的修改即可,如下:
/**
* 定义小轿车生产线类,该类是汽车生产线类的子类
*
*/

public class SedancarProduction extends CarProduction {
public void produce(){
System.out.println(getName()+"较昂贵,配件不同,其颜色是"+getColor());
}
}
注意,方法重写后调用时,会优先调用子类的方法,如果子类中没有这个方法,才会调用父类的方法。

在生产类中调用父类汽车类生产函数produce,如下:
public class Produce {
/**
* 定义一个生产类
* @param sla
*/
public void produce(CarProduction car){
car.produce();
}
}
而在生产线类Test中(赋值,真正实施生产)
public class Test {

/**
* @param args
*/
public static void main(String[] args) {
//创建一个小轿车类的对象
SedancarProduction sed = new SedancarProduction();
sed.setName("宾利");
sed.setColor("黑色");

//创建一个车类对象
CarProduction car = new CarProduction();
car.setName("轿车");
car.setColor("白色");

//调用生产
Produce pro = new Produce();
pro.produce(sed);
pro.produce(car);
}
代码pro.produce(sed)实现了自动转型,将 SedancarProduction的对象sed转换为CarProduction类的对象。此时减少了设置仅关于小轿车Produce的代码,使生产其余车种时 ,也能通过pro.produce(对象名)进行调用
易见,自动转型减少冗余代码;在方法设置参数时,扩大访问范围
自动转型的两种格式:1.
父类名 对象名 = new 子类名(实参,...);

2.(常用)
public void method(父类名 对象名){
对象名.方法名();
}

父类名 对象名A = new 子类名(实参,...);
子类名 对象名B = new 子类名(实参,...);

method(对象名A);
method(对象名B);
另外,在使用自动转型后,子类自己定义的方法是不能在自动转型后执行(重写的可以);原因是因为Java的编译机制,它会优先判断父类中是否存在该方法,如果存在则通过编译,如果不存在则报错。
附:强制转型例子
byte b= 10;
b = (byte)i;//把int i转换成byte 存储到b中
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值