上一篇主要是对于Java中继承的基础理解和简单实现,本篇主要是深入理解对于继承中子类和父类的一些性质的理解。通过实例来具体实现。
- 子类不能继承父类的构造方法(因为构造方法要与类名相同)
- 子类不能继承父类的私有方法(只能在本类内部使用),但私有成员变量可以被继承只是不能被直接访问
- 无论使用何种方法构造子类的对象都会自动调用父类的无参构造方法,来初始化继承中的成员变量。(相当于在构造方法的第一行增加代码super()的效果)
一定是先调用父类的构造方法,再调用子类的构造方法
父类person类
public class Person {
private int age;
private String name;
public Person(int age, String name) {
setAge(age);
setName(name);
}
public Person() {
}
public int getAge() {
return age;
}
public void setAge(int age) {
if(age>0&&age<150) {
this.age = age;
}else
System.out.println("年龄不合理!");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/**
* 自定义成员方法实现吃饭行为的模拟
*/
public void eat(String food){
System.out.println(food+"真好吃");
}
public void play(String game){
System.out.println(game+"真好玩");
}
public void show(){
System.out.println("我的年龄:"+age+" 我的名字:"+name);
}
}
子类worker类
public class Worker extends Person{
private int salary;
public Worker() {
super(); //表示调用父类的无参构造方法 super()必须放在第一行
}
public Worker(int age, String name, int salary) {
super(age, name); //表示调用父类的有参构造方法
setSalary(salary) ;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
if(salary>2200) {
this.salary = salary;
}else
System.out.println("薪资不合理");
}
//从父类继承下来的方法不满足子类的需求时,
// 就需要在子类中重写一个和父类一样的方法来覆盖从父类中继承下来的版本
// 该方式就叫做方法的重写。(override)
public void show(){ //show方法的重写
super.show(); //表示调用父类的show()方法
System.out.println("工人的薪水是:"+salary);
}
public void work(){
System.out.println("正在搬砖");
}
}
PersonWorker的测试类
分为几段。下面一段是最基本的继承的用法和实现过程
public class PersonWorkerTest {
public static void main(String[] args) {
Person person=new Person(18,"张飞");
Worker worker=new Worker(20,"关羽",2800);
worker.eat("香蕉");
worker.play("王者荣耀");
worker.work();
worker.show();
person.show();
}
}
代码测试截图
pw是父类类型的引用指向子类类型的对象,当用对象 . 的方式即pw . 的方式调用父子类都有的方法时,编译阶段(即敲代码阶段)调用父类的方法,运行阶段调用子类中重写的方法。由此可以知道,当调用的方法父类中不存在时,会报错。编译器不允许这么敲代码
Person pw=new Worker(89,"guanyu",2800); //披着羊皮的狼
pw.show(); //编译阶段寻找父类中的版本,运行阶段调用Worker类中重写版本
// pw.work(); work报错 Person类中找不到work方法
为了避免该类类型的对象调用不了该类的成员方法,便引申出来了类型转换。分为向上转型和向下转型(强制类型转换)
//强制类型转换 (向下转型)
((Worker)pw).work();
为了避免强转时候出错,即不是该类型硬转换为该类型,便引出了 instanceof来判断到底是不是该类型。
if(pw instanceof Worker) {
System.out.println("可以放心大胆转换");
}else{
System.out.println("强转有风险,操作需谨慎");
综合代码
public class PersonWorkerTest {
public static void main(String[] args) {
Person person=new Person(18,"张飞");
Worker worker=new Worker(20,"关羽",2800);
worker.eat("香蕉");
worker.play("王者荣耀");
worker.work();
worker.show();
person.show();
Person pw=new Worker(89,"guanyu",2800); //披着羊皮的狼
pw.show(); //编译阶段寻找父类中的版本,运行阶段调用Worker类中重写版本
// pw.work(); work报错 Person类中找不到work方法
//强制类型转换 (向下转型)
((Worker)pw).work();
if(pw instanceof Worker) {
System.out.println("可以放心大胆转换");
}else{
System.out.println("强转有风险,操作需谨慎");
}
}
}
综合测试截图