目录
4、在Java中,子类和父类是一个相对的概念,即一个类可以是某一个类的父类,也可以是另一个类的子类
一、继承的概念
父类:现有类
子类:基于现有类构建出的一个新的类,子类会自动拥有父类的所有可继承的属性和方法
二、继承的格式
extends关键字
格式:
class 子类 extends 父类 { }
案例:
/*
* 定义员工类Employee
*/
class Employee {
String name; // 定义name属性
// 定义员工的工作方法
public void work() {
System.out.println("尽心尽力地工作");
}
}
/*
* 定义研发部员工类Developer 继承 员工类Employee
*/
class Developer extends Employee {
// 定义一个打印name的方法
public void printName() {
System.out.println("name=" + name);
}
}
/*
* 定义测试类
*/
public class Demo {
public static void main(String[] args) {
Developer d = new Developer(); // 创建一个研发部员工
类对象
d.name = "小明"; // 为该员工类的name属性进行赋值
d.printName(); // 调用该员工的printName()方法
d.work(); // 调用Developer类继承来的work()方法
}
}
总结:通过子类对象既可以调用自身的非private修饰的成员,也可以调用父类的非private 修饰的成员。
三、继承的好处
- 提高代码的复用性,提高开发效率
- 让类与类之间产生了关系,为多态提供了前提
四、继承的注意事项:
1、在java中,类只支持单继承,不允许多继承
class A {}
class B extends A {}
class c extends A,B {} // 不可以同时继承A类B类
2、多个类可以同时继承一个父类
class A {}
class B extends A {}
class c extends A {}
3、在Java中,可以多层继承
class A {}
class B extends A {} //B是A的子类
class c extends B {} // C是B的子类,也是A的子类
4、在Java中,子类和父类是一个相对的概念,即一个类可以是某一个类的父类,也可以是另一个类的子类
五、继承中,子类父类中成员变量的特点
成员变量:如果子类父类中出现不同名的成员变量,这时的访问是没有任何问题。 看如下代码:
class Fu
{
//Fu中的成员变量。
int num = 5;
}
class Zi extends Fu
{
//Zi中的成员变量
int num2 = 6;
//Zi中的成员方法
public void show()
{
//访问父类中的num
System.out.println("Fu num="+num);
//访问子类中的num2
System.out.println("Zi num2="+num2);
}
}
class Demo
{
public static void main(String[] args)
{
Zi z = new Zi(); //创建子类对象
z.show(); //调用子类中的show方法
}
}
代码说明:Fu类中的成员变量是非私有的,子类中可以直接访问,若Fu类中的成 员变量私有了,子类是不能直接访问的。
- 当子类和父类中出现了同名的成员变量时,在子类中要访问父类的成员变量,需要使用关键字super来完成。
// 在子类中,访问父类中的成员变量格式:
super.父类中的成员变量
class Fu
{
//Fu中的成员变量。
int num = 5;
}
class Zi extends Fu
{
//Zi中的成员变量
int num = 6;
void show()
{
//子父类中出现了同名的成员变量时
//在子类中需要访问父类中非私有成员变量时,需要使用super关键
字
//访问父类中的num
System.out.println("Fu num="+super.num);
//访问子类中的num2
System.out.println("Zi num2="+this.num);
}
}
class Demo
{
public static void main(String[] args)
{
Zi z = new Zi(); //创建子类对象
z.show(); //调用子类中的show方法
}
}
六、子类父类中成员方法的特点
- 当程序通过调用方法时,会先在子类中查找有没有对应的方法,若子类中有,则先执行子类中的方法;若子类中不存在,则不执行父类中相应的方法。
public class Parent{
int num = 5;
}
public class Children extends Parent{
int num2 = 10;
public void show(){
System.out.println("子类中的show方法执行");
}
public void show2(){
System.out.println("子类中的show2方法执行");
}
}
public class Test {
public static void main(String[] args) {
Children children = new Children();
children.show();
children.show2();
}
}
- 当子类中和父类中的方法一摸一样时,会出现覆盖情况(即重写)
public class Parent{
int num = 5;
public void show(){
System.out.println("父类中的show方法执行");
}
}
public class Children extends Parent{
int num = 10;
public void show(){
System.out.println("子类中的show方法执行");
}
}
public class Test {
public static void main(String[] args) {
Children children = new Children();
children.show();
}
}
- 方法重写的应用
当子类需要父类的功能,而功能主体子类有自己特有的内容时,可以重写父类方法。这样既延续了父类的功能,又定义了子类特有的内容。
比如:手机,当描述一个手机时,它具有打电话、发短信、显示来电的功能; 后来的手机,显示来电时需要增加头像、姓名,这是就可以使用重写来完成
public class Phone {
public void sendMessage(){
System.out.println("发短信");
}
public void call(){
System.out.println("打电话");
}
public void showcall(){
System.out.println("显示来电");
}
}
public class NewPhone extends Phone{
public void showcall(){
super.showcall();
System.out.println("显示头像");
System.out.println("显示姓名");
}
}
七、方法重写的注意事项
-
子类覆盖父类方法,必须保证权限大于等于父类权限
class Fu{ void show(){} public void method(){} } class Zi extends Fu{ public void show(){} // 可以执行 void method(){} // 编译错误 }
- 必须一摸一样:方法的返回类型 ,方法名,参数列表 都必须一样
总结:当一个类是另一个类中的一种时,可以通过继承,来继承属性和功能,当子类中需要特殊定义父类中的功能内容时,可以进行方法重写
总结:
- 继承中成员变量(或方法)关系:
- 不同命的变量(或方法):子类直接继承使用
- 同名的变量(或方法):默认访问的子类自己的成员变量(或方法),如果要访问父类 中的同名变量(或方法),要使用super.成员变量名 (或方法)
- super:表示的是当前对象中包含的父类对象空间的引用
- 方法重写的注意事项:
- 子类的方法声明要与父类相同
- 子类中重写的方法,访问权限不能低于父类
- 父类的私有方法不能被子类重写
- 方法重载: 在同一个类中,多个方法名相同,他们的参数列表不同(个数、数据类型不同)