Java——继承、方法覆盖
继承
一、继承的作用
基本作用:子类继承父类,代码可以得到复用。
主要(重要)作用:因为有了继承关系,才有了后期的方法覆盖和多态机制。
二、继承的相关特性
B类继承A类,则称A类为超类(superclass)、父类、基类。
B类则称为子类(subclass)、派生类、扩展类。
class A{ }
class B extends A{ }
java中的继承只支持单继承,不支持多继承,C++中支持多继承,这也是java中体现简单性的一点,换句话说,java中不允许这样写代码:
class B extends A,C{ }这是错误的。
虽然java不支持多继承,但是有的时候会产生间接继承的效果,例如:
class C extends B,class B extends A,也就是说,C直接继承B,其实C 还间接继承A。
java中规定,子类继承父类,除构造方法不能继承之外,剩下都可以继承。但是私有的属性无法在子类中直接访问。
java中的类没有显示的继承任何类,则默认继承Object类,Object类是java语言提供的根类,也就是说,一个对象与生俱来就有Object类型中所有的特征。
继承也存在一些缺点,导致耦合度很高,父类改变直接影响到子类。
三、继承
子类继承父类后,使用子类对象调用父类方法。
在实际开发中,满足采用“ is a ”来描述的,都可以继承。
Cat is a Animal:猫是一个动物。
Dog is a Animal:狗是一个动物。
……
假设以后的开发中有一个A类,有一个B类,A类和B类确实也有重复的代码,那么他们两个之间不一定可以继承,一定还要看看他们两个之间是否能够使用is a来描述。
class Customer{String name;//名字 } class Product{String name;//名字 }//虽然都有相同属性,但是顾客不是产品,不满足 is a
现在尝试分析下面的代码:
System.out.println(“Hello World!”)
其中System是一个类名
out后面没有小括号,说明out是变量名
直接使用System.out 说明out是一个静态变量
System.out返回一个对象,然后采用“对象. ”的方式访问println()方法。
public class Test{//静态变量public static void main(String[] args){Test.stu.exam();//对应看看System.out.println("Hello World!")}
}
class Student{//实例方法public void exam(){System.out.println("在考试!")}
}
public class ExtendsTest01 {/*ExtendsTest01默认继承Object.ExtendsTest01类当中是有toString方法相当于有一个toString()方法在这public String toString(){return getClass().getName() +"@" + Integer.toHexString(hashcode());}不过toString()方法是一个实例方法,需要创建对象才能调用。*/public static void main(String[] args) {//分析这个代码可以运行嘛?//先new对象ExtendsTest01 et = new ExtendsTest01();String retValue = et.toString();System.out.println(retValue);//com.cooler.Extends.ExtendsTest01@4554617c输出结果中4554617c可以等同于对象在堆内存中的内存地址//实际上是内存地址经过“哈希算法”得出的十六进制结果。}
}
由此可得,Object类中有很多的方法,而我们测试的toString(),发现:当直接输出一个“引用.”的时候,println()方法会先自动调用“引用.toString()”,然后输出toString()方法的执行结果。
四、方法覆盖
请观察以下程序,思考以下程序存在的问题(设计上的问题)?
public class OverrideTest01 {public static void main(String[] args) {//创建鸟对象Bird b = new Bird();//让鸟儿移动b.move();}
}
//父类
class Animal{//移动public void move(){System.out.println("动物在移动!");}
}
//子类
class Bird extends Animal{}
以上程序运行没有问题,能正常输出动物在移动。
可是鸟儿在执行move()方法时,我们希望输出的结果是“鸟儿在飞翔”
很显然Bird子类从Animal父类中继承过来的move方法已经无法满足子类的业务需求。
因此我们引出方法覆盖。
1. 什么叫做方法覆盖?
方法覆盖又叫做方法重写,override、overwrite都可以
2.什么时候考虑使用方法覆盖?
子类继承父类之后,当继承过来的方法无法满足当前子类的业务需求时,子类有权利对这个方法进行重新编写,有必要进行“方法的覆盖”。
注意:
方法重载是在同一个类当中,如果功能相似的话,建议将方法名定义一样的。
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{public void move(){System.out.println("鸟儿在飞翔!");}
}
class Cat extends Animal{public void move(){System.out.println("猫儿在猫步!");}
}
结论:
当子类对父类继承过来的方法进行方法覆盖之后,子类对象调用该方法的时候,一定执行覆盖之后的方法。
当我们代码怎么编写的时候,在代码级别上构成了方法覆盖呢?
条件一:两个类必须要有继承关系。
条件二:重写之后的方法名必须和之前的方法具有:
相同的返回值类型、
相同的方法名、
相同的形式参数列表。
条件三:访问权限不能更低,可以更高。
条件四:重写之后的方法不能比之前的方法抛出更多的异常,可以更少。
这里还有几个注意事项:
注意1:方法覆盖只是针对方法,和属性无关。
注意2:私有方法无法覆盖。
注意3:构造方法不能被继承,所以构造方法也不能被覆盖。
注意4:方法覆盖只是针对于实例方法,静态方法覆盖没有意义。
Java——继承、方法覆盖相关推荐
- java继承方法规则或规律
方法的继承与属性的继承有很大的不同,属性任何继承方式均可,而方法则有各种限制,于是动力节点Java培训机构小编在这里做了一个简单的总结. 1.修饰符相同的方法覆盖,即只改内部,不改外部 2.访问 ...
- Thinking in Java系列:方法覆盖(Overriding)和方法重载(Overloading)
java中的方法重载发生在同一个类里面两个或者多个方法的方法名相同但是参数不同的情况.与此相对,方法覆盖是说子类重新定义了父类的方法.方法覆盖必须有相同的方法名,参数列表和返回类型. 覆盖者可能不会限 ...
- JAVA中方法覆盖,看这篇就够了
方法覆盖 1.方法覆盖又被称为方法重写 2.什么时候使用方法重写? 当父类中的方法已经无法满足当前子类的业务需求: 子类有必要将父类中继承过来的方法进行重新编写: 3.代码需要满足什么条件才能构成方法 ...
- Java中方法覆盖的基本使用
回顾一下方法重载: 1.什么时候考虑使用方法重载overload? 答:当在一个类中,如果功能相似的话,建议将名称定义成一样,只是参数列表(个数,顺序,类型)不同,这样代码美观,且方便编程. 2.什么 ...
- day12 java的方法覆盖(重写)
1.覆盖的定义及条件 2.方法覆盖的注意事项 3.其他(重载和覆盖的区别)
- java继承与覆盖_简单的继承,方法重载与方法覆盖
[java]代码库package com.jiarui; public class Demo1 { public static void main(String[] args) { Dog dog1= ...
- Java中方法的继承以及父类未被子类覆盖的方法调用的问题
在看java继承这一块的时候发现了一个问题,即父类未被子类覆盖的方法是如何调用的? 是子类拥有了父类的该方法只是没有显示表示,还是子类调用了父类的该方法. 为此做了一下验证 代码如下: public ...
- java多态 覆盖_Java ------ 继承、方法覆盖、多态
一.什么是继承 面向对象的三大特性: 封装. 继承.多态: 继承就是子类型将父类型的的属性继承到自己类中进行使用,通过继承的方式子类型可以使用父类型的属性和方法,并且,继承只能单重继承,无法多继承,但 ...
- java:方法覆盖与方法重载
方法签名 方法签名是指方法的参数类型,顺序和个数.不包含方法名称. 重载 重载必须满足以下条件 方法名 相同 方法的参数类型,个数和顺序至少一项不同 方法的返回类型可以不同 方法的访问权限修饰符可以不 ...
最新文章
- static关键字的作用?
- 解析IntelliJ IDEA内部设计
- 利用解构赋值获取后端特定字段数据
- Cloud一分钟 | 谷歌退出美国防部云计算竞标;网络黑灰产业已近千亿,个人信息泄露是源头...
- coap python3_node-coap入门(三)——Observe
- 学JAVA的为什么_为什么学习Java的人越来越多
- 基于php重庆旅游设计网站作品
- html插入循环图片,javascript – HTML5在带有for循环的画布上绘制图片?
- iostream.h和iostream 区别
- 全国计算机三级数据库技术
- vscode插件版本的选择与安装
- 读书|《赤裸裸的统计学》:统计数字很容易说谎
- [TJOI2019]唱、跳、rap和篮球
- IT服务外包的必要性
- iOS模拟器运行报错Unable to install /xxx/build/ios/iphonesimulator/Runner.app
- 采用jacob实现word转pdf
- 三菱fx3u编码器同步程序,伺服同步,一个编码器控制两个伺服同步运转
- 一摞python风格的纸牌(fluent python阅读)
- 一朵云开启智慧交通新未来
- 因子分析SPSS数学建模