Java面向对象编程——继承和多态

Java面向对象编程——继承和多态,第1张

一、继承 1 继承的定义

在已有类基础上生成新类的过程。通过继承,派生类拥有基类的属性和行为,还可以有自己新定义的属性和行为。
基类:Java中,被继承的类称为父类、基类或超类。
派生类:生成的新的类称为子类或派生类。

2 语法规则
class 子类 extends 父类{}
3 继承的本质

(1)父类的私有成员可以被子类继承,只能通过继承自父类的并且子类可以访问的方法【setter和getter】间接访问。
(2)类中公有成员可以被子类中的方法直接访问,在子类类体外可通过子类对象访问。
(3)父类与子类在同一个包中,父类中保护成员可以被子类中方法直接访问,在子类类体外的可通过子类对象访问。
(4)父类与子类不在同一个包中,父类中保护成员可以被子类中方法直接访问,在子类类体外不可以通过子类对象访问。

4 注意

(1)Java是单重继承,一个子类只能有一个父类。
(2)一个父类可以派生出多个子类。
(3)object类是所有类的直接或间接类。

5 父类子类初始化器的调用顺序

如果父类和子类中都定义了初始化器,则构造子类对象时,调用顺序为:
(1)父类的静态初始化器——(2)子类的静态初始化器——(3)父类的初始化器——(4)父类的构造方法——(5)子类的初始化器——(6)子类的构造方法

6 调用父类的构造方法的规则

只要实例化子类对象,系统就会先自动实例化一个父类对象与之对应
(1)在构造子类对象时,父类的构造方法一定会被调用,先被执行。
(2)子类的构造方法用super调用父类的构造方法,按给定的参数调用父类相应的构造方法,且写在构造器第一行。
(3)子类构造方法未用super调用父类的构造方法,父类中无参数的构造方法会被自动调用。
(4)子类构造方法未用super调用,父类中也无没有参数的构造方法,编译不能通过。

super相关知识

(1)super.成员变量;
(2)super.成员方法();
(3)super(参数列表); 【调用父类中的构造方法】

二、方法重写(override) 1 概念

子类中函数定义和父类相同,最后调用是调用子类中的方法,称为覆盖或重写(override).

2 注意

(1)子类中定义了一个名称和参数列表与父类相同的函数,但是返回类型不同,系统会报错。
(2)重写时,子类函数的访问权限不能比父类的更加严格。
(3)覆盖时,如果一定要在子类中调用父类成员函数,使用关键字super,调用方法是“super.函数名”。

3 方法重载(overload)和方法重写(override)区别

(1)方法重载,在同一个类中,多个方法名相同,通过参数不同(类型、个数)来区分。
(2)方法重写,在父类、子类中,有相同方法名、参数和返回类型的方法,子类方法是方法重写。

三、多态 1 上转型对象

使用多态:当用父类对象表示子类对象时,父类对象称为子类对象的上转型对象。
当一个父类对象表示的是子类对象时,可将该父类对象强制转换成子类对象。

A a=new B();//对象的**上**转型
B b=(B)a;//对象的**下**转型对象
2 上转型对象可以实现

(1)可以访问父类变量。
(2)可以调用子类继承自父类的方法或被子类重写的方法。
(3)不能访问子类特有的变量或方法。

3 instanceof *** 作

(1)格式

对象名 instanceof 类名

(2)可判断一个对象是否是某一个类的实例对象或是否是某一个类的子类的实例对象。

四、抽象类和接口 1 抽象方法

在父类中规定一个函数必须被重写,即在方法定义前加上abstract。
语法格式:

访问权限 abstract 数据类型 方法名(参数列表);
public abstract void show();//无方法体 抽象方法一定不能用Final修饰
2 抽象类

(1)含有抽象方法的类称为抽象类,必须用abstract修饰。
语法格式:

abstract class 类名{
实例方法(){}
抽象方法();
}

(2)注意
a 抽象方法必须被重写,除非子类也是抽象类。
b 抽象方法只需声明,不需实现(无方法体)。
c 在抽象类中可以含有普通成员方法。
d 抽象类不能被实例化,不能用new关键字去产生对象。

3 抽象类和抽象方法的联系

(1)如果类中有抽象方法加粗样式,此类必须是抽象类。
(2)是抽象类,可以有抽象方法,也可以没有抽象方法。
(3)抽象类不能创建对象
——必须有子类继承抽象类。
——继承抽象类的子类,必须重写父类中的抽象方法。

4 接口

(1)接口:一个抽象类中的所有方法都是抽象的,可定义为接口。
(2)接口语法格式:

修饰符 interface 接口名 extends 父接口列表{
public static final 数据类型 变量名=常量值;//常量
public abstract final 返回值类型 方法名 参数列表();
}
interface ISpeak{
     //常量 都是public abstract类型的
     void speakHello();
     }

其中,接口名可以用I开头
(3)说明
a 接口中,只能包含常量(大写)和抽象方法且抽象方法只有声明没有实现。
b 接口中的成员方法默认都是public abstract
接口中成员变量默认都是public static final
c 接口通过extends继承另一个接口,类通过关键字implements来实现一个接口。
d 一个类可以在继承一个父类的同时实现一个或多个接口(实现接口)
语法格式

class 子类 extends 父类 implements 接口1,接口2...{
类成员变量和成员方法;
重写接口中的所有方法;
}

(4)接口回调
接口多态,不同的类,在实现同一个接口时具有不同的实现过程,当接口变量进行回调接口方法时,就具有多种不同形态。
实现接口多态性——接口回调技术

接口名 对象名=new 实现类构造方法();
public class Test{
public static void main(String[] agrs){
//接口回调,性质上与上转型对象一致
ISpeak sp1=new Chinese();
ISpeak sp2=new English();
sp1.speakHello();
sp2.speakHello();
}
}
五、关键字final 1 最终变量

用final修饰一个成员变量,该成员变量的值****不允许被改变。

2 最终方法

用final修饰一个成员方法,方法不能被重写。

3 最终类

用final修饰一个类,该类不能被继承。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/756453.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-30
下一篇 2022-04-30

发表评论

登录后才能评论

评论列表(0条)

保存