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 修饰方法不允许被子类重写,但是可以被 ...
随机推荐
- 实验楼之Linux快捷、用户及文件权限、文件查看
实验二 知识点1:通常不是直接与系统打交道,而是通过一个叫做Shell的中间程序. shell即是用户交互的界面,又是控制系统的脚本语言.常用的有bash. zsh, ksh, csh, 命令行模式: ...
- shader之顶点着色器
Vertex Shader 是渲染管道中一个可编程的模块,用于处理独立的顶点.Vertex Shader接收Vertex Attribute Data,由定点数组对象通过渲染指令来生成. Vertex ...
- Python 如何连接并操作 Aws 上 PB 级云数据仓库 Redshift
Python 如何连接并操作 Aws 上 PB 级云数据仓库 Redshift 一.简介 Amazon Redshift 是一个快速.可扩展的数据仓库,可以简单.经济高效地分析数据仓库和数据湖中的所有 ...
- Ubuntu 14.04中修复默认启用HDMI后没有声音的问题
声音问题在Ubuntu中是老生常谈了.先前我已经在修复Ubuntu中的“无声”问题一文中写到了多种方法,但是我在此正要谈及的声音问题跟在另外一篇文章中提到的有所不同. 因此,我安装了Ubuntu 14 ...
- http verbs--Method Definitions
http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html part of Hypertext Transfer Protocol -- HTTP/1. ...
- 关于从request对象中获取路径的问题
从request对象中获取路径的问题:例如: 项目名为:tmall_web 请求的servlet名为:loginServlet 示例代码如下: @Override protected void ...
- 数据库路由中间件MyCat - 源代码篇(8)
此文已由作者张镐薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 3. 连接模块 3.5 后端连接 对于后端连接,我们只关心MySQL的. 从后端连接工厂开始MySQLCon ...
- 数据库路由中间件MyCat - 使用篇(2)
此文已由作者张镐薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 基本概念 3. 分片 3.1 分片节点(dataNode) 表被水平切分后,每个分片表所在的数据库就是一个分 ...
- 字节码操作-Javaassist
下面就是一个具体的demo来介绍利用Javaassist库来创建类,不过要先在工程里面导入Javaassist的架包, package JavaAasist; import java.lang.ref ...
- java接口中成员变量和方法的默认修饰符(转)
Java的interface中,成员变量的默认修饰符为:public static final 所以我们在interface中定义成员变量的时候,可以 1:public static final St ...