首页 / JAVA / Java基础-类的继承与方法覆盖
Java基础-类的继承与方法覆盖
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java基础-类的继承与方法覆盖,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含8783字,纯文字阅读大概需要13分钟。
内容图文
目录
1.继承的作用和特性
什么是继承,继承有什么用
继承在现实生活中也是存在的,例如:父亲很有钱,儿子不用努力也很有钱。
//分析以下程序存在什么问题?代码臃肿,代码没有得到重复利用,属性和方法之间有许多重复
//银行账户类
//账户的属性:账号,余额
class Account{
private String actno;
private double balance;
public Account(){
}
public Account(String actno,double balance){
this.actno=actno;
this.balance=balance;
}
public String getActno() {
return actno;
}
public void setActno(String actno) {
this.actno = actno;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
}
//其他类型的账户,信用卡账户
//账号,余额,信誉度
class CreditAccount{
private String actno;
private double balance;
private double credit;
public CreditAccount(){
}
public String getActno() {
return actno;
}
public void setActno(String actno) {
this.actno = actno;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
public double getCredit() {
return credit;
}
public void setCredit(double credit) {
this.credit = credit;
}
}
使用继承来解决代码臃肿,使用extends关键字
class Account{
private String actno;
private double balance;
public Account(){
}
public Account(String actno,double balance){
this.actno=actno;
this.balance=balance;
}
public String getActno() {
return actno;
}
public void setActno(String actno) {
this.actno = actno;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
}
//其他类型的账户,信用卡账户
//账号,余额,信誉度
class CreditAccount extends Account{
private double credit;
public CreditAccount(){
}
public double getCredit() {
return credit;
}
public void setCredit(double credit) {
this.credit = credit;
}
}
继承的作用:
基本作用:子类继承父类,代码可以得到复用。(这个不是重要的作用,是基本作用)
主要:因为有了继承,才有了后面的方法覆盖和多态。
继承的相关特性
- 1.B类继承A类,则A类称之为超类(superclass),父类,基类。B类则称之为子类(subclass),派生类,扩展类。
class A{} class B extends A{} - 2.java中的继承只支持单继承,不支持多重继承,C++中支持多继承。(语法错误)
- 3.虽然java中不支持多继承,但是有的时候会产生间接继承的结果
(C继承B,B继承A,也就是说,C直接继承B,间接继承A) - 4.java中规定,子类继承父类,除构造方法不能继承之外,剩余都可以继承,但是私有的属性无法再子类中直接访问。(父类中的private修饰符的属性不能在子类中直接访问。通过get方法)
- 5.java中的类没有显示的继承任何类,则默认继承object类。(老祖宗)。Object类是所有类的超类,类体系结构中的根。也就是说,一个对象与生俱来就有Object类型的所有的特征。
- 6.继承也有一些缺点,例如CreditAccount类继承Account类会导致他们之间的耦合度非常高。Account类发生改变马上会影响CreditAccount。
2.通过子类对象调用继承过来的方法
测试子类继承之后,能使用子类对象调用父类方法吗?
当然可以
实际上这个问题问的有点蹊跷。因为它属于了自己的属性。
本质上子类继承父类之后,是将父类继承过来的方法归为已有。实际上调用的也不是父类的方法,是它子类自己的方法。
public class ExtendsTest04 {
public static void main(String[] args) {
Cat c=new Cat();
c.move();
System.out.println(c.name);
}
}
//父类
class Animal{
//名字,先不封装
String name="xiaohua"; //默认值不是null,给一个xiaohua
//提供一个动物移动的方法
public void move(){
System.out.println(name+"正在移动");
}
}
//cat子类
//cat继承Animal,会将Animal中所有的全部继承过来
class Cat extends Animal{
}
在实际开发中,满足什么条件的时候,我可以使用继承呢
凡是采用is a能描述的,都可以继承
例如
Cat is a Animal 猫是一个动物
Dog is a Animal 狗是一个动物
CreditAccount is a Account 信用卡账户时一个银行账户
如果以后开发中两个类有很多公共的代码,如果没有is a的关系,不建议使用继承。
假设以后的开发中有一个A类,有一个B类,AB类确实有重复的方法,那么他们两个之间就能机场吗,不一定,还是要看一看他们之间能否使用is a来描述。
任何一个类,没有显示继承任何类,默认继承Object,那么Object类有哪些方法呢?老祖宗为我们提供了哪些方法。
注意:当原码当中一个方法以“;”结尾,并且修饰符列表中有native关键字,表示底层调用c++写的dll程序,(dll动态链接库文件。)
3.方法覆盖
3.1.方法覆盖初次体验
当前程序存在的问题,(设计上的问题)
鸟儿在执行move()方法的时候输出的结果是:鸟儿在飞翔,但是当前的程序在执行move()方法的时候输出的结果是:动物在移动,很显然Bird子类从
Animal父类中继承过来的move()方法已经无法满足子类的业务。
public class OverrideTest01 {
public static void main(String[] args) {
Bird b=new Bird();
b.move();
Cat c=new Cat();
c.move();
}
}
class Animal{
//移动
public void move(){
System.out.println("动物在移动!");
}
}
class Bird extends Animal{
//子类继承父类之后,有一些行为可能不需要改进,有一些行为可能面临着必须改进
//因为父类中继承过来的无法满足子类的业务需求
//鸟儿在移动的时候,希望输出鸟儿在飞翔
}
class Cat extends Animal{
//猫在移动的时候我们希望输出,猫在走猫步
}
3.2.满足什么条件构成方法覆盖
什么时候我们会考虑使用方法覆盖呢
子类继承父类之后,当继承过来的方法无法满足当前子类的业务需求时,子类有权利对这个方法进行重新编写,有必要进行方法的覆盖
方法覆盖又叫做方法重写(重新编写),英语单词叫做override,overwrite
重要结论:当子类对父类继承过来的方法进行方法覆盖之后,子类对象调用父类该方法的时候,
一定要执行覆盖之后的方法
回顾一下方法重载
什么时候考虑使用方法重载overload
当在一个类当中,如果功能相似的话,建议将名字定义的一样,这样代码美观,并且方便编程。
什么条件满足之后能够构成方法重载
条件一:在同一个类当中
条件二:方法名不同
条件三:参数列表不同(个数、顺序、类型)
当我们代码怎么编写的时候,在代码级别上构成方法覆盖呢?
条件一:两个类必须要有继承关系
条件二:重写之后的方法和之前的方法具有相同的返回值类型、相同的参数列表、相同的方法名
条件三:访问权限不能更低,可以更高。(这个先记住)
会报错,正在尝试分配更低的访问权限,以前为public
条件四:重写之后的方法不能比之前的方法抛出更多的异常。可以更少。(错误,被覆盖的方法没有抛出Exception)
public class OverrideTest02 {
public static void main(String[] args) {
Bird b=new Bird();
b.move();
b.sing();
Cat c=new Cat();
c.move();
}
}
class Animal{
protected void move(){
System.out.println("动物在移动!");
}
public void sing(){
System.out.println("动物在叫");
}
}
class Bird extends Animal{
//对move方法进行方法覆盖,方法重写,override
//最好将父类中的方法原封不动的复制过来(不建议手动编写)
//方法覆盖,就是将继承过来的方法覆盖掉了,父类的方法没了
public void move(){
System.out.println("鸟儿在飞翔!");
}
//没有,原因是,这两个方法根本就是两个完全不同的方法
//可以说这两个方法构成了方法重载吗?可以
public void sing(int i){
System.out.println("鸟在唱歌");
}
}
class Cat extends Animal{
protected void move(){
System.out.println("猫在走猫步");
}
}
3.3.方法覆盖的注意事项
注意1:方法覆盖只是针对于方法,和属性无关
注意2:私有方法无法覆盖
注意3:构造方法不能被继承,所以构造方法也不能被覆盖
注意4:方法覆盖只是针对于实例方法,静态方法覆盖没有意义。
## 3.4.经典案例
public class OverrideTest03 {
public static void main(String[] args) {
ChinesePeople p1=new ChinesePeople();
//ChinesePeople p1=new ChinesePeople("zhangsan");错误,没有构造方法
p1.setName("张三");
p1.speakHi();
AmericanPeople p2=new AmericanPeople();
p2.setName("Jack");
p2.speakHi();
}
}
class People
{
private String name;
public People(){}
public People(String name){
this.name=name;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public void speakHi(){
System.out.println(name+"正在说话....");
}
}
class ChinesePeople extends People{
public void speakHi(){
System.out.println(this.getName()+"正在说汉语....");
}
}
class AmericanPeople extends People{
public void speakHi(){
System.out.println(this.getName()+"正在说英语....");
}
}
3.5.toString()方法
关于Object类中的toString()方法
- 1.toString()方法存在的作用就是:将java对象转换成字符串形式。
- 2.Object类中toString方法的默认实现
public String toString() {
return getClass().getName() + “@” + Integer.toHexString(hashCode());
}
含义:调用一个java对象的toString方法就可以将java对象转换成字符串的表示形式
大多数的java类toString()方法都是需要覆盖的。因为Object类中提供的toString()方法输出的是一个java对象的内存地址。
至于toString()方法具体怎么进行覆盖?
格式可以自己定义,或者听需求的。(听项目要求的。)
什么时候考虑使用方法覆盖?
- 父类中的方法无法满足子类的业务需求,子类有必要对继承过来的方法进行覆盖。
什么条件满足的时候构成方法覆盖?
- 第一:有继承关系的两个类
- 第二:具有相同方法名、返回值类型、形式参数列表
- 第三:访问权限不能更低。
- 第四:抛出异常不能更多。
关于Object类中toString()方法的覆盖?
- toString()方法存在的作用就是:将java对象转换成字符串形式。
大多数的java类toString()方法都是需要覆盖的。因为Object类中提供的toString()
方法输出的是一个java对象的内存地址。
至于toString()方法具体怎么进行覆盖?
格式可以自己定义,或者听需求的。(听项目要求的。)
方法重载和方法覆盖有什么区别?
- 方法重载发生在同一个类当中。
- 方法覆盖是发生在具有继承关系的父子类之间。
- 方法重载是一个类中,方法名相同,参数列表不同。
- 方法覆盖是具有继承关系的父子类,并且重写之后的方法必须和之前的方法一致:
- 方法名一致、参数列表一致、返回值类型一致。
内容总结
以上是互联网集市为您收集整理的Java基础-类的继承与方法覆盖全部内容,希望文章能够帮你解决Java基础-类的继承与方法覆盖所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。