Java类的继承

目录

1.类的继承概念       

2.类的继承格式

3.作用

4.方法重写

5.自动转型(向上转型)

1.类的继承概念       

        类的继承就是子类继承父类的属性和方法,使得子类具有与父类相同的属性和方法。

        举一个生活中的例子就是:汽车属于一个类,汽车品牌奥迪、奔驰就属于其子类,其具有汽车的一般特性,但二者在性能上也有一定的差别。所以子类会具有父类的一般特性,也会具有其自身的特性。

2.类的继承格式

        在Java中通过extends关键字可以生命一个类是从另一个类继承而来的,形式如下:

class 父类{

}
class 子类 extends 父类{

}

3.作用

        为什么需要继承类呢?接下来我们举一个例子来说明:

         比如说,有一个电脑类,其中有两种品牌联想和惠普,要求如下:

                                联想 属性:品牌名  方法:游戏

                                惠普 属性:品牌名 方法:游戏

代码示例如下:

 联想类:

public class Legend {
	private String name;
    
    public void setName(String name) {
    	this.name = name;
    }
    public String getName() {
    	return name;
    }
    public void game() {
    	System.out.println(name+"可以游戏");
    }
}

惠普类:

public class Hp {
	private String name;
    
    public void setName(String name) {
    	this.name = name;
    }
    public String getName() {
    	return name;
    }
    public void game() {
    	System.out.println(name+"可以游戏");
    }
}

        从这两段代码可以看出来,代码重复了,这样会导致代码量大且繁琐,后期对代码的维护不方便,要解决这个问题就需要用到继承,就是将两端代码中相同的部分提取出来组成一个父类。

公共父类代码:

public class Computer {
	private String name;
    
    public void setName(String name) {
    	this.name = name;
    }
    public String getName() {
    	return name;
    }
    public void game() {
    	System.out.println(name+"可以游戏");
    }
}

        这样Computer就可以作为一个父类,用联想类和惠普类继承这个类之后,就具有父类当中的属性和方法,代码更加简洁。继承之后的代码:

联想类:

public class Legend extends Computer{

}

惠普类:

public class Hp extends Computer{

}

        此时两段代码中没有内容,但在主函数中使用Legend的类创建对象,发现其拥有父类中的属性和方法。注:(同包下)子类会继承父类中的所有属性和方法,但私有属性和方法不能直接使用。

public class Manage {
    public static void main(String[] args) {
    	Legend le = new Legend();
    	le.setName("联想");
    	le.game();
    }
}

运行结果如下:

 

        注:Java不支持多继承,即一个子类不可以同时继承两个父类,但支持多层次继承,简单来说,子类可以拥有父类,其父类也可以拥有父类。

4.方法重写

        由于子类在拥有父类共性的同时也拥有部分独有的属性和方法,因此有时需要对父类中的方法进行改造,这就叫做方法重写。

        方法重写的条件:1.必须是两个有继承关系类之间才能进行方法重写 2.返回值类型,方法名,参数类型(个数、顺序)完全一样。

例如:在Legend类里重写其父类(Computer类)的 public void game 方法:

public class Legend extends Computer{
	public void game() {
		System.out.println("子类重写父类方法");
	}
}

 重写后,执行结果如下:

        注:子类方法重写时,访问修饰符访问权限要大于或等于父类。

    (访问修饰符共有四种,分别为:public(公用的)private(私有的)protected(受保护的) 缺省的:返回类型前什么都不写就是缺省的返回修饰符。根据测试访问修饰符权限大小分别为:public>protected>缺省的>private)

        方法重写时,如果需要保留父类的功能,在父类原有功能的基础上再增加新的功能,此时需要在重写的方法中调用父类的方法。调用父类方法的关键字super ,其表示当前类的父类对象。

示例代码如下:

public class Legend extends Computer{
	protected void game() {
		super.game();
		System.out.println("子类重写父类方法");
	}
}

执行结果为: 

5.自动转型(向上转型)

        自动转型的形式:在 B extends A 的情况西 可以使用 A a = new B();的方法创建对象。

        例:Comeputer le = new Legend();当创建子类对象时,你创建的对象被保存在父类中,就是你创建的对象向上转型,转为父类了。示例代码如下:

public class Manage {
    public static void main(String[] args) {
    	Computer le = new Legend();
    	le.setName("联想");
    	le.game();
    }
}

        但当你调用e.game()时,你会发现,其运行时调用的方法仍然为子类中的方法,这是因为它运行时会从父类开始检索是否定义过该方法,如果定义过,会接着在子类中检索是否重写过该方法,如果发现其已经重写,则优先调用子类中的方法。 

        自动转型带来的问题:自动转型后的对象只能调用子类中重写的方法。在下面的示例中由于work方法是子类Legend中独有的方法,因此le对象在其转型为Computer类之后调用该方法时会报错。

 

 

        解决这个问题的方法就是强制转型(向下转型)

示例代码如下:

public class Manage {
    public static void main(String[] args) {
    	Computer le = new Legend();
    	le.setName("联想");
    	le.game();
    	Legend leg = (Legend)le;//强制转型
    	leg.work();//调用work()方法
    }
}

        进行强制转型后就可以调用work方法,但记住:强制转型的前提是该对象自动转型过。

        到这里解释完自动转型的概念,接下来介绍一下其在java中的实际应用场景:比如说有一个学生,他游戏使用的电脑既可以联想也可以是惠普。我们现在创建一个学生类,此时在Student类中,就需要创建两个方法,代码示例如下:当他使用的电脑类型越多,随之创建的方法也越多,但由于其功能相同,代码段也会不断重复。

public class Student {
	public void use(Legend name) {
		name.game();
	}
	public void use(Hp name) {
		name.game();
	}
}

        为使代码简化,可以应用自动转型的功能,传入参数的类型使用其父类的类型,当你创建子类对象调用该方法时,该对象会自动转型成为其父类类型,这样当多个子类对象需要调用同一方法时,就可以只写一个方法,而不是多个,从而达到简化代码的目的。

public class Student {
	public void use(Computer name) {//传入参数类型使用父类类型
		name.game();
	}
}
public class Manage {
    public static void main(String[] args) {
    	Legend le = new Legend();
    	le.setName("联想");
    	
    	Hp hp = new Hp();
    	hp.setName("惠普");
    	
    	Student st = new Student();
    	st.use(le);//调用该方法时原来为Legend类型的le转型成为Computer类
    	st.use(hp);//同样的,原Hp类的参数hp转型成为Computer类
    }
}

        最后补充一个知识:任何一个类,都可以调用一些方法,这是因为java中每个类都会默认继承Object类 。

 

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值