关于Java语言中的继承
-
继承是面向对象的三大特征之一,三大特征分别是:封装、继承和多态
-
继承“基本”的作用是代码复用,但是继承做最重要的作用是:有了继承才有了以后的方法覆盖和多态
-
继承语法格式:
[修饰符列表] class 类名 extends 父类名{
类体=属性+方法;
} -
java语言当中的继承只支持单继承,一个类不能同时继承多个父类,只能继承一个父类,在C++中支持多继承
-
关于继承的一些术语
B类继承A类,其中:A类称为:父类、基类、超类、superclass
B类称为:子类、派生类、subclass -
在Java语言中子类都继承了父类哪些数据呢?
C extends B{
}B extends A{
}A extends T{
}C类直接继承B类,但是C类间接继承A类、T类
-
Java语言中假设一个类并没有显示继承任何类,该类默认继承javase类库当中提供的java.lang.Object类。Java中任一个类都有Object类的特征。
public class ExtendsTest {
public static void main(String[] args) {
ExtendsTest et=new ExtendsTest();
String s=et.toString();//这里编译通过,说明确实继承Object类
System.out.println(s);//com.bjpowernode.javase.test012.ExtendsTest@1f32e575
CreditAccount act=new CreditAccount();
act.setActno("act-001");
act.setBalance(-1000.0);
act.setCredit(0.99);
System.out.println(act.getActno()+","+act.getBalance()+","+act.getCredit());
}
}
package com.bjpowernode.javase.test012;
public class Account {
private String actno;
private double balance;
public Account() {
super();
}
public Account(String actno, double balance) {
super();
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;
}
}
package com.bjpowernode.javase.test012;
public class CreditAccount extends Account {
private double credit;
public CreditAccount() {
super();
}
public double getCredit() {
return credit;
}
public void setCredit(double credit) {
this.credit = credit;
}
}
package com.bjpowernode.javase.test012;
public class ExtendsTest2 {
public static void main(String[] args) {
C c=new C();
c.doSome();//调用的是从B类里继承过来的doSome
}
}
class A{
public void doSome() {
System.out.println("do some!");
}
}
class B extends A{
}
class C extends B{
}
回顾Java语言中的方法重载
-
方法重载又被称为:overlord
-
方法重载什么时候使用?
当在同一个类当中,方法完成的功能时是相似的,建议方法名相同,这样方便程序员的编程,就像在调用一个方法一样,代码美观。 -
什么条件满足之后构成方法重载?
在同一类当中
方法名相同
形式参数列表不同【个数、类型、顺序】 -
方法重载和什么无关?
和修饰符列表无关
和返回值类型无关
关于java语言中的方法覆盖
-
方法覆盖又被称为方法重写,英语单词:override【官方名称】/overwrite
-
什么时候使用方法覆盖?
当父类中的方法已经无法满足子类中的业务需求
子类必须将从父类中继承过来的方法进行重新编写
这个重新编写的过程被称为方法的覆盖 -
什么条件满足时会发生方法覆盖【代码满足什么条件时,就构成方法覆盖】
方法覆盖发生在具有继承关系的父子类中
方法覆盖的时候:返回值类型相同,方法名相同,形参列表相同
方法覆盖的时候:访问权限不能更低,可以更高
方法覆盖的时候:抛出异常不能更多,可以更少 -
建议方法覆盖的时候,直接复制黏贴,防止出错,导致覆盖的不发生。
-
注意:
私有方法不能继承,当然也不会发生方法覆盖
构造方法不能继承,当然也不会发生方法覆盖
静态方法不存在继承,当然也不会发生方法覆盖【理解多态后就明白了】
覆盖只针对方法,不针对属性
public class OverrideTest01 {
public static void main(String[] args) {
//创建动物对象
Animal a=new Animal();
a.move();
//创建猫对象
Cat c=new Cat();
c.move();
//创建鸟对象
Bird b=new Bird();
b.move();
//创建鹦鹉对象
Yingwu y=new Yingwu();
y.move();
//鹦鹉类继承的是鸟类
//鸟类继承的是动物类,但存在方法覆盖,鸟儿在飞翔!
//所以鹦鹉类的方法覆盖只会对鸟类的方法发生覆盖,并不会对动物类发生覆盖
//去除方法覆盖,也只会输出 鸟儿在飞翔!
}
}
//动物类
public class Animal {
//动物都会移动
//实例方法
public void move() {
System.out.println("动物在移动");
}
}
//猫科动物类
public class Cat extends Animal {
public void move() {
System.out.println("猫咪在走猫步!");
}
}
//鸟类
public class Bird extends Animal {
public void move() {
System.out.println("鸟儿在飞翔!");
}
}
//鹦鹉类
public class Yingwu extends Bird {
public void move() {
System.out.println("鹦鹉飞不起来!");
}
下一篇:多态