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 继承与重写的更多相关文章

  1. 乐字节Java继承|方法重写、super和final关键字

    大家好,乐字节的小乐又来了,上一篇是:乐字节Java|JavaBean.继承与权限修饰,也是属于Java继承的,今天继续Java继承. 一. 方法的重写 父类不满足子类的要求,按需改写.注意 方法签名 ...

  2. Java继承、重写与重载

    1.java继承 1.1概念 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为. 继承可以使用extends和implem ...

  3. Java继承,重写方法时改变方法的访问权限

    java中的方法天生具有继承多态特性,这点与C++有很大不同(需要在父类方发上加virtual关键字),但用起来确实方便了许多. 最简单的继承多态 声明一个接口BaseIF,只包含一个方法声明 pub ...

  4. java继承 子类重写父类方法

    package com.addd; //多态 public class Sld { private String name = "zhangsan"; public Sld() { ...

  5. java 继承、重载、重写与多态

    首先是java 继承.重载和重写的概念 继承: 继承的作用在于代码的复用.由于继承意味着父类的所有方法亦可在子类中使用,所以发给父类的消息亦可发给衍生类.如果Person类中有一个eat方法,那么St ...

  6. C#和Java的类、继承、重写与多态

    面向对象的三大特性是封装.继承.多态,C#和Java都是面向对象的语言所以他们的类.继承.重写与多态有很多共同点,但是实现上也存在一定的区别.其中Java中其实没有虚函数的概念,也可以认为Java的函 ...

  7. Java多态机制和继承中重写重载

    关于Java中多态机制 http://www.cnblogs.com/chenssy/p/3372798.html 这篇博文讲的很透彻 大体意思是 多态定义: 多态就是指程序中定义的引用变量所指向的具 ...

  8. Java继承之方法重写

    目录 Java继承之方法重写 代码体现 概念 注意事项 "两同两小一大" 其他注意点 重写与重载 @Override注解 Java继承之方法重写 在Java继承中,子类可以获得父类 ...

  9. 浅析 Java 中的继承和重写

    浅析 Java 中的继承和重写 Java 中的构造方法不能被继承. Java 中 static 修饰的方法可以被继承,但不能被子类重写. Java 中 final 修饰方法不允许被子类重写,但是可以被 ...

随机推荐

  1. Android如何解析json数组对象

    import org.json.JSONArray; import org.json.JSONObject; //jsonData的数据格式:[{ "id": "27Jp ...

  2. win form treeview添加节点

    //实例代码: /// <summary> /// 添加节点事件 /// </summary> /// <param name="tnodes"> ...

  3. Unity 5.6中的混合光照(上)

    https://mp.weixin.qq.com/s/AbWM21sihHw5pFdMzENDPg 在Unity 5中,光照得到了很大的改进.现在,创建高度逼真的游戏已成为可能.但是,出于对性能的考虑 ...

  4. untiy AnimationEvent添加返回参数

    using UnityEngine; using System.Collections; public class Try : MonoBehaviour { public class Action ...

  5. 洛谷P4318 完全平方数(容斥,莫比乌斯反演)

    传送门 求第$k$个没有完全平方数因数的数 一开始是想筛一波莫比乌斯函数,然后发现时间复杂度要炸 于是老老实实看了题解 一个数的排名$k=x-\sum_{i=1}^{x}{(1-|\mu(i)|)}$ ...

  6. 阿里云服务器新手安装nginx

    1.域名购买之后 备案. 2.购买服务器. 3.这两个条件具备之后进行下一步. 本人使用Mac ,实践流程按照Mac本的流程操作. 作为初学者,简配的服务器, 实例类型: I/O优化,操作系统: Ce ...

  7. 整理的各种模板 (随时弃坑emmmmm)

    线段树: #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> ...

  8. 洛谷P2194 HXY烧情侣

    题目描述 众所周知,\(HXY\)已经加入了\(FFF\)团.现在她要开始喜\((sang)\)闻\((xin)\)乐\((bing)\)见\((kuang)\)地烧情侣了.这里有\(n\)座电影院, ...

  9. PAT甲级——1114 Family Property (并查集)

    此文章同步发布在我的CSDN上https://blog.csdn.net/weixin_44385565/article/details/89930332 1114 Family Property ( ...

  10. Python-10-条件和条件语句

    num = int(input('Enter a number: ')) if num > 0:     print('The number is positive') elif num < ...