您的位置:首页 > 编程语言 > Java开发

JAVA第九弹(继承与多态<一>)

2013-08-23 10:43 471 查看
----------------------android培训java培训期待与您交流! ----------------------

JAVA第九弹(继承与多态<一>)

——————(个人见解,有错误的地方欢迎批评指正)—————

(如有雷同纯属巧合)

自然界通过继承才得以发展,假如没有继承,现在的世界可能就只存在单细胞生物了。

在写程序中,通过继承,可以让我们的代码变得更简洁,更具灵活性。毕竟,需求是无止境的。现在要设计一款游戏,里面有战士,魔法师和牧师三大职业。可以这么设计这三种职业:

先定义一个战士类:

class Warrior{

private String name;
private int level;
private int blood;
public void fight()
{
System.out.println("战士用剑攻击");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
public int getBlood() {
return blood;
}
public void setBlood(int blood) {
this.blood = blood;
}
}


定义完战士类,接着定义法师类

class Mages{
private String name;
private int level;
private int blood;
public void fight()
{
System.out.println("魔法师施放魔法");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
public int getBlood() {
return blood;
}
public void setBlood(int blood) {
this.blood = blood;
}
}


最后再定义牧师类:

class Priest {
private String name;
private int level;
private int blood;
public void fight()
{
System.out.println("牧师施放治疗");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
public int getBlood() {
return blood;
}
public void setBlood(int blood) {
this.blood = blood;
}
}


通过上面3个类的定义,发现每种职业都有些相同的特征:名字,角色等级和血量。这时候就可以用继承的概念来设计:

class GameRole{
private String name;
private int level;
private int blood;

public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
public int getBlood() {
return blood;
}
public void setBlood(int blood) {
this.blood = blood;
}
}
class Warrior extends GameRole{
public void fight()
{
System.out.println("战士用剑攻击");
}
}
class Mages extends GameRole{
public void fight()
{
System.out.println("魔法师施放魔法");
}
}
class Priest extends GameRole {
public void fight()
{
System.out.println("牧师施放治疗");
}
}


现在建立个测试类,看看能不能实现需求:

public class GameRoleDemo {

public static void main(String[] args) {
Mages mage = new Mages();
mage.setName("mage");
mage.setLevel(2);
mage.setBlood(100);
System.out.println("法师:"+mage.getName()+","
     				 +mage.getLevel()+","+mage.getBlood());
Warrior warrior = new Warrior();
warrior.setName("mage");
warrior.setLevel(2);
warrior.setBlood(150);
System.out.println("战士:"+warrior.getName()+","
    				 +warrior.getLevel()+","+warrior.getBlood());
}
}


程序输出结果为:

法师:mage,2,100

战士:mage,2,150

通过改进后的代码明显比之前每个职业定义一个类要来的简洁多了。假如,现在客户需要给每个职业增加魔法值,那么就可以在GameRole类中添加代码就可以了,而不用改其它职业中的代码,很大程度上提高了程序的灵活性。

上述代码定义了一个父类GameRole和3个GameRole的派生类(子类),JAVA中继承用extends关键字,并且JAVA中只支持单继承,也就是说一个类最多只能有一个父类。JAVA中不允许一个类没有父类,当一个类没有显式的继承一个类的时候,JVM就会隐式的继承一个超类Object,Object类是所有类的根类。

再来看看父类和子类的构造函数调用情况:

class SuperClass{

SuperClass(){
System.out.println("父类无参数构造方法被调用");
}
SuperClass(int num){
System.out.println("父类有参数构造函数被调用");
}
}
class SubClass extends SuperClass
{
SubClass()
{
System.out.println("子类无参数构造方法被调用");
}
SubClass(int num)
{
System.out.println("子类有参数构造方法被调用");
}
}
public class ConstructedText {

public static void main(String[] args) {
SubClass subclass = new SubClass(3);
}
}


程序输出结果为:

父类无参数构造方法被调用

子类有参数构造方法被调用

在JAVA中,每个类都有一个构造函数,当一个类中没显式的声明构造函数时,JVM会自动为该类添加一个隐式的构造函数,当子类的构造函数被加载时,会先加载父类的无参数的构造函数因为在子类的构造函数的函数体第一行会有一条隐式的语句:super();当子类构造函数初始化时想同时初始化父类的构造函数,可以通过super()进行初始化。

----------------------android培训java培训期待与您交流! ----------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: