Java 继承与重写
1.类的继承
1)继承
父类:所有子类所共有的属性和行为
子类:子类所特有的属性和行为
- 通过extends关键字来实现类的继承
- 子类(Sub class)可以继承父类(Super class)的成员变量及成员方法,同时也可以定义自己的成员变量和成员方法
- Java语言不支持多重继承,一个类只能继承一个父类(单一继承),但一个父类可以有多个子类
- 继承具有传递性,子类的子类可以继承父类的父类的成员变量及成员方法
2)继承中构造方法(super关键字)
- Java规定:构造子类之前必须先构造父类
- 子类的构造方法中必须通过super关键字调用父类的构造方法,这样可以妥善的初始化继承自父类的成员变量
- 如果子类的构造方法中没有调用父类的构造方法,Java编译器会自动的加入对父类无参构造方法的调用(如果该父类没有无参的构造方法,则会出现编译错误)
- super()调父类构造必须位于子类构造的第一句
- super指代当前对象的父类对象
super的用法:
- super.成员变量名:访问父类的成员变量
- super.方法名():调用父类的方法
- super():调用父类的构造方法
案例1:调用父类无参构造
public class Person {
String name;
char gender;
}
public class Student extends Person {
// super (); //编译错误,必须位于子类构造方法的第一句
double score;
Student(double score){
super(); //编译器默认会自动加上
this.score = score;
super.name = "Tom";
}
}
案例2:调用父类有参构造
public class Person {
String name;
char gender;
Person(String name,char gender){
this.name = name;
this.gender = gender;
}
}
public class Student extends Person {
// super (); //编译错误,必须位于子类构造方法的第一句
double score;
Student(String name,char gender,double score){
// super(); //编译错误,父类中没有无参构造
super(name,gender); //调用父类有参构造
this.score = score;
super.name = "Tom";
}
}
3)向上造型
- 一个子类的对象可以向上造型为父类的类型。即定义父类型的引用可以指向子类的对象
- 父类的引用可以指向子类的对象,但通过父类的引用只能访问父类所定义的成员,不能访问子类扩展的部分(能点出什么看引用)
案例3:向上造型
public class Person {
String name;
char gender;
Person(String name,char gender){
this.name = name;
this.gender = gender;
}
}
public class Student extends Person {
double score;
Student(String name,char gender,double score){
super(name,gender); //调用父类有参构造
this.score = score;
super.name = "Tom";
}
public static void main(String[] args) {
Person p = new Student("Tom",'男',80); //向上造型
p.score = 100; //编译错误,Java编译器会根据引用的类型(Person),而不是对象的类型(Student)来检查调用的方法是否匹配。
}
}
2.方法的重写(Override)
- 发生在父子类中,方法签名相同,方法体不同:子类可以重写(覆盖)继承自父类的方法,即方法名和参数列表与父类的方法相同,但方法的实现不同(方法体不同)
- 重写方法被调用时,看对象的类型:当子类对象的重写方法被调用时(无论是通过子类的引用调用还是通过父类的引用调用),运行的是子类的重写后的版本
- 子类在重写父类的方法时,可以通过super关键字调用父类的版本,这样的语法通常用于子类的重写方法在父类方法的基础之上进行功能扩展。
1).重写原则
重写遵循“两同两小一大”原则:
1)两同:
1.1)方法名相同
1.2)参数列表相同
2)两小:
2.1)子类方法的返回值类型要小于或等于父类
2.1.1)void时,必须相同
2.1.2)基本数据类型时,必须相同
2.1.3)引用类型时,小于或等于
2.2)子类方法抛出的异常要小于或等于父类的----异常之后
3)一大:
3.1)子类方法的访问权限要大于或等于父类的----访问控制修饰符之后
class Aoo{
void show(){}
double test(){return 0.0;}
Boo sayHi(){return null;}
public Aoo say(){return null;}
}
class Boo extends Aoo{
//int show(){return 1;} //编译错误,void时必须相同
//int test(){return 0;} //编译错误,基本类型时必须相同
//Aoo sayHi(){return null;} //编译错误,引用类型必须小于或等于
public Boo say(){return null;}
}
案例4:方法重写
public class Student {
public static void main(String[] args) {
Goo o = new Goo();
o.f();
Foo oo = new Goo();
oo.f();
}
}
class Foo{
public void f(){
System.out.println("Foo.f()");
}
}
class Goo extends Foo{
public void f(){
System.out.println("Goo.f()");
}
}
//当子类对象的重写方法被调用时(无论通过子类的引用还是通过父类的引用),运行的都是子类重写后的方法。
/*
运行结果:
Goo.f()
Goo.f()
*/
案例5:方法重写,super调用父类版本
public class Student {
public static void main(String[] args) {
Goo o = new Goo();
o.f();
Foo oo = new Goo();
oo.f();
}
}
class Foo{
public void f(){
System.out.println("Foo.f()");
}
}
class Goo extends Foo{
public void f(){
super.f(); //调用父类的方法
System.out.println("Goo.f()");
}
}
//子类重写方法中的super.f(); 调用了父类的版本,这样的语法通常用于子类的重写方法再父类方法的基础之上进行功能扩展。
/*
运行结果:
Foo.f()
Goo.f()
Foo.f()
Goo.f()
*/
2)重写和重载的区别
- 重写(Override):1.发生在父子类中,(方法签名相同)方法名称相同,参数列表相同,方法体不同 2.遵循“运行期”绑定,重写方法被调用时,看对象的类型
- 重载(Overload):1.发生在同一类中,方法名称相同,参数列表不同,方法体不同 2.遵循“编译期”绑定,看引用的类型绑定方法
案例6:重写与重载区别
public class OverrideAndOverload {
public static void main(String[] args){
Super obj = new Sub(); //向上造型
Goo goo = new Goo();
goo.g(obj);
}
}
class Super{
public void f(){
System.out.println("super.f()");
}
}
class Sub extends Super{
public void f(){ //方法重写
System.out.println("sub.f()");
}
}
class Goo{
public void g(Super obj){
System.out.println("g(Super)");
obj.f();
}
public void g(Sub obj){ //方法重载
System.out.println("g(Sub)");
obj.f();
}
}
以上代码运行结果:
g(Super)
sub.f()
Java 继承与重写的更多相关文章
- 乐字节Java继承|方法重写、super和final关键字
大家好,乐字节的小乐又来了,上一篇是:乐字节Java|JavaBean.继承与权限修饰,也是属于Java继承的,今天继续Java继承. 一. 方法的重写 父类不满足子类的要求,按需改写.注意 方法签名 ...
- Java继承、重写与重载
1.java继承 1.1概念 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为. 继承可以使用extends和implem ...
- Java继承,重写方法时改变方法的访问权限
java中的方法天生具有继承多态特性,这点与C++有很大不同(需要在父类方发上加virtual关键字),但用起来确实方便了许多. 最简单的继承多态 声明一个接口BaseIF,只包含一个方法声明 pub ...
- java继承 子类重写父类方法
package com.addd; //多态 public class Sld { private String name = "zhangsan"; public Sld() { ...
- java 继承、重载、重写与多态
首先是java 继承.重载和重写的概念 继承: 继承的作用在于代码的复用.由于继承意味着父类的所有方法亦可在子类中使用,所以发给父类的消息亦可发给衍生类.如果Person类中有一个eat方法,那么St ...
- C#和Java的类、继承、重写与多态
面向对象的三大特性是封装.继承.多态,C#和Java都是面向对象的语言所以他们的类.继承.重写与多态有很多共同点,但是实现上也存在一定的区别.其中Java中其实没有虚函数的概念,也可以认为Java的函 ...
- Java多态机制和继承中重写重载
关于Java中多态机制 http://www.cnblogs.com/chenssy/p/3372798.html 这篇博文讲的很透彻 大体意思是 多态定义: 多态就是指程序中定义的引用变量所指向的具 ...
- Java继承之方法重写
目录 Java继承之方法重写 代码体现 概念 注意事项 "两同两小一大" 其他注意点 重写与重载 @Override注解 Java继承之方法重写 在Java继承中,子类可以获得父类 ...
- 浅析 Java 中的继承和重写
浅析 Java 中的继承和重写 Java 中的构造方法不能被继承. Java 中 static 修饰的方法可以被继承,但不能被子类重写. Java 中 final 修饰方法不允许被子类重写,但是可以被 ...
随机推荐
- 反射获取窗体所有控件的Text
可以直接通过反射获取当前窗体的所有控件的Text(具有Text属性),具体代码如下: foreach (var field in form.GetType().GetFields(System.Ref ...
- Ubuntu如何锁定分辨率
终于把Ubuntu的虚拟机装好了,但是分辨率没有1920*1080是什么鬼啊? 下面详细讲一下如何设置1920*1080的分辨率并设置,主要都是照着前辈的博客自己在操作一遍熟悉一下,嘿嘿. 1.安装v ...
- Git 时光穿梭鸡 管理修改
Git跟踪并管理的是修改,而非文件. 什么是修改? 比如你新增了一行,这就是一个修改, 删除了一行,也是一个修改, 更改了某些字符,也是一个修改, 删了一些又加了一些,也是一个修改, 甚至创建一个新文 ...
- php 连接 memcached 并调用
话不多说,上代码,自己看注释 <?php header("Content-type: text/html; charset=utf-8"); $mem = new Memca ...
- PJzhang:搜索引擎高级语法与渗透测试
猫宁!!! 参考链接: https://www.freebuf.com/articles/network/169601.html https://www.jianshu.com/p/f8062e2cc ...
- CF438D The Child and Sequence 线段树
给定数列,区间查询和,区间取模,单点修改. n,m小于10^5 ...当区间最值小于模数时,就直接返回就好啦~ #include<cstdio> #include<iostream& ...
- E. Selling Souvenirs 不会做
http://codeforces.com/contest/808/problem/E 不理解为什么dp = {cost, cnt1, cnt2}可以 而dp = {cost, cnt1, cnt2, ...
- 牛客网Java刷题知识点之什么是异常、异常处理的原理是什么、为什么要使用异常、异常体系、运行时异常、普通异常、自定义异常、异常链
不多说,直接上干货! 在这个世界不可能存在完美的东西,不管完美的思维有多么缜密,细心,我们都不可能考虑所有的因素,这就是所谓的智者千虑必有一失.同样的道理,计算机的世界也是不完美的,异常情况随时都会发 ...
- PM2自动发布本地项目到服务器
(一)开发环境 本地服务器 Ubunt14.04 远程服务器Ubuntu16.04 发布软件PM 2 (二)发布介绍 本地和我们的远程服务器,必须都安装有git,pm2,以及nodejs环境.实际上配 ...
- mysql主给备赋予权限时报错,MySQL [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause
https://www.cnblogs.com/skymyyang/p/7551646.html 在my.cnf 里面设置sql_mode='STRICT_TRANS_TABLES,NO_ZERO_I ...