【Java之旅】8.面向对象三大特征 之 继承
面向对象有三大特征:封装、继承、多态
今天就来写一写这个“继承”。
8.1 子类与父类
继承是用于类与类之间的,它可以体现出类与类之间的关系
比如说界、门、纲、目、科、属、种
他们就是一个大类 “界” 分化出多个小类。
我们称大类为父类,而在父类基础上衍生出来的小类称为子类。
那我们应该如何来让 一个类去继承另一个类呢?代码如下👇
class Players
{
private String name;
private int speed;
private int armour;
}
class Attackers extends Players
{
}
class Defenders extends Players
{
}
我们定义了Players类、Attackers类、Defenders类。
其中Players是父类,而Attackers和Defender是它的子类
我们使用extends来建立起类与类之间的继承关系。
extends意为延申。
既然是继承关系,那么子类一定可以在父类上继承一些东西
我们先完善一下Players类的方法(setter、getter、toString)
public class Inheritance
{
public static void main(String[] args)
{
Attackers kupurk = new Attackers();
kupurk.setName("ash");
kupurk.setSpeed(5);
kupurk.setArmour(1);
System.out.println(kupurk);
}
}
class Players
{
private String name;
private int speed;
private int armour;
public void setName(String name)
{
this.name=name;
}
public String getName()
{
return this.name;
}
public void setSpeed(int speed)
{
this.speed = speed;
}
public int getSpeed()
{
return speed;
}
public void setArmour(int armour)
{
this.armour=armour;
}
public String toString()
{
return "[" + name + ",Speed:" + speed +",Armour:"+ armour +"]";
}
}
class Attackers extends Players
{
}
class Defenders extends Players
{
}
通过这一串代码,我们发现,子类Attacker继承了父类Players中的所有属性和方法
但是子类无法继承父类Private修饰的方法,这里就不展示了。
众所周知,构造器也属于一种特殊的方法即构造方法,那我们也试一试子类能否继承父类的构造方法。
public class Inheritance
{
public static void main(String[] args)
{
Attackers kupurk = new Attackers();
Attackers mo = new Players();
mo.setName("buck");
mo.setSpeed(2);
mo.setArmour(2);
System.out.println(mo);
//kupurk.setName("ash");
//kupurk.setSpeed(5);
//kupurk.setArmour(1);
//System.out.println(kupurk);
}
}
程序报错:
E:\工具\Markdown\输出\EditPlus_out\Inheritance>javac Inheritance.java
Inheritance.java:6: 错误: 不兼容的类型: Player无法转换为Attackers
Attackers mo = new Player();
^
1 个错误
子类无法继承父类的构造方法,那么父类能否构造出子类呢?
public class Inheritance
{
public static void main(String[] args)
{
Attackers kupurk = new Attackers();
Player mo = new Defenders();
mo.setName("buck");
mo.setSpeed(2);
mo.setArmour(2);
System.out.println(mo);
//kupurk.setName("ash");
//kupurk.setSpeed(5);
//kupurk.setArmour(1);
//System.out.println(kupurk);
}
}
运行后成功得到结果:[buck,Speed:2,Armour:2]
②结论
通过上述试验,所以我们可以得出以下结论:
①子类可以继承父类的成员属性和成员方法(非Private类、非构造方法),
也继承了父类的静态方法
父类中private类修饰的方法是父类独有的,不会被继承
②子类无法构造父类,但父类可以构造子类
Player mo = new Defenders();
Player mo 叫做父类型的引用
Defenders是Player的子类,在堆内存中有一个Defenders类型的对象,叫做子类型的对象
父类型的引用指向子类型的对象
就是Player mo = new Defenders();的解读
子类也可以拥有父类没有的特性
我们只需要在子类里面进行编写即可
class Attackers extends Players
{
public void defuse
{
System.out.println("Planting the bomb!!!");
}
}
我们就添加了一个这个子类特有的方法defuse
而父类无法去调用这个子类的方法
所以我们也可以把父类理解为子类共性的集合