继承...

一、什么是继承?

▪ 1. 继承的概念

子类继承父类的方法成员变量

▪ 2. 继承的优点

  1. 继承可以实现代码重用(属性、方法);
  2. 通过继承使得代码更易维护(便于修改)

▪ 3. 如何使用继承

定义父类,如:Pet
定义子类,并让子类继承父类:

 class Dog extends Pet{...}

注:一个类只能有一个父类,即:Java 仅支持单根继承

▪ 4. 继承中构造方法的调用

//思考父类对象的创建规则是什么?
//什么时候使用父类的无参构造/带参构造?
//1.子类没有调用父类构造方法系统默认调用父类无参
//2.子类调用了父类的构造方法调的是什么构造方法系统就执行什么构造方法

  1. 构造子类对象时,必须首先构造一份父类对象;
  2. 必须通过调用父类构造方法来构造父类对象,因此在子类构造方法中必须调用一个
    且只能调用一个父类构造方法;如果我们没有显示调用,那么 Java 会隐式加入
    super() 调用父类的默认构造方法(如果父类没有无参构造方法,则报错);
  3. 通过 super() 关键字调用父类的构造方法,可调用有参或无参的构造方
    法; super() 必须是子类构造方法中的第一句非空代码;
  4. 通过 super.属性名 , super.方法名() 也可以访问父类的属性和方法。

继承之后 子类能使用父类的属性和方法 分为两种情况

  1. 子类内部使用父类成员 super
  2. 子类外部使用父类成员 通过子类对象
// 人类
public class Person {
String name; // 姓名
int age; // 年龄
public Person() {
System.out.println("Person()");
}
public Person(String name, int age) {
this.name = name;
this.age = age;
System.out.println("Person(name, age)");
}
public void show() {
System.out.println(name + " : " + age);
}
}
// 学生类
public class Student extends Person {
String id; // 学号
public Student() {
// super(); // 隐式调用
System.out.println("Student()");
}
public Student(String id) {
// super(); // 隐式调用
this.id = id;
System.out.println("Student(id)");
}
public Student(String name, int age, String id) {
super(name, age); // 显式调用
this.id = id;
System.out.println("Student(name, age, id)");
}
}
// 测试代码
public class Test {
public static void main(String[] args) {
Student s1 = new Student();
Student s2 = new Student("1001");
Student s3 = new Student("张三", 18, "1002");
}
}

▪ 5. 属性、方法的可见性

访问修饰符 本类 同包 子类 其他
private √ - - -
package √ √ - -
protected √ √ √ -
public √ √ √ √

  1. 子类只能继承:父类中的 protected 和
  2. public 成员;
  3. 如果父类和子类位于同一包中,子类还可继承父类的 package(默认) 成员;
  4. 由于构造方法必须和类同名,所以子类也不能继承父类的构造方法

二、方法重写

▪ 1. 什么是方法重写(override)?

子类中定义与父类方法签名完全一致的方法,覆盖父类的行为,当调用子类的方法时,将不再执
行父类的方法,而是执行子类的方法。

▪ 2. 方法重写的原则

1.子类方法名必须和父类方法名存在如下关系:
2.方法名相同
3.参数列表相同
4.返回值类型相同或者是其子类
5.访问权限不能严于父类
6.父类的静态方法不能被子类覆盖为非静态方法,父类的非静态方法不能被子类覆盖为静态方法
8.子类可以定义与父类同名的静态方法,以便在子类中隐藏父类的静态方法(注:静态方法中无法使用super)
9.父类的私有方法不能被子类覆盖
10.不能抛出比父类方法更多的异常

▪ 3. 方法重载与方法重写比较

比较项 位置 方法名 参数表 返回值 访问修饰符
方法重写 子类 相同 相同 相同或是其子类 不能比父类更严格
方法重载 同类 相同 不相同 无关 无关

▪ 4. Object 类

  1. Object 类是所有类的父类
  2. Object 类经常被重写的方法
    方法 说明
    toString() 返回当前对象本身的有关信息,按字符串对象返回
    equals() 比较两个对象是否是同一个对象,是则返回true
    hashCode() 返回该对象的哈希代码值
    getClass() 获取当前对象所属的类信息,返回Class对象
  3. Object.equals() ,源码如下:
public boolean equals(Object obj) {
return (this == obj);
}
  1. 对于自定义类型,我们可自定义比较方法,但是要记住一条原则:要重写
    equals(),必须重写 hashCode()

三、抽象类与抽象方法

▪ 1. 抽象方法

抽象方法: 只有方法签名(访问修饰符、返回值类型、方法名、参数列表)没有方法体的方法;抽
象方法只能写在抽象类中;使用 abstract 修饰。
语法如下

public abstract class Pet {
// 属性略
// 构造方法略
// setter/getter 方法略
// 方法 eat(),负责宠物吃饭功能。
abstract public void eat();
}

抽象方法的特点:

• 由 abstract 修饰的方法。
• 抽象方法没有方法体
• 抽象方法必须在抽象类里
• 抽象方法必须在子类中被实现,除非子类是抽象类

抽象方法的优点:

• 为子类提供公共的行为,但是不必实现;
• 强制子类必须实现该方法,除非子类也是抽象类

▪ 2. 抽象类

抽象类: 不能被实例化的类,抽象类通常是用做父类,可定义抽象类的引用变量;可包含抽象
方法;使用 abstract 修饰。
抽象类是指在类中定义方法,但是并不去实现它,而在它的子类中去具体的实现。定义的抽象方
法不过是一个方法占位符。继承抽象类的子类必须实现父类的抽象方法,除非子类也被定义成一
个抽象类。

抽象类不能实例化对象但是有构造方法
原因 抽象类就是用来当父类的所以保留构造方法
因为再创建子类对象的时候会默认调用父类的构造方法

语法如下

public abstract class Pet {
// 略
}
public class Test{
public static void main(String[] args){
Pet pet; // 可定义引用变量
pet = new Pet(); // 错误!抽象类不能被实例化
}
}

抽象类的优点: 从语法角度杜绝了某些类能够创建对象的可能性,使程序世界和现实世界的行
为相统一。

▪ 3. 抽象类与抽象方法

  1. 抽象类中可以没有抽象方法,但抽象方法一定要放在抽象类中;
  2. 如果子类没有实现父类的所有抽象方法,子类必须是抽象类;
  3. 构造方法不能被继承,因此,没有抽象的构造方法;
  4. 静态方法不能被继承,因此,没有抽象的静态方法;
  5. 抽象类中可以包含构造方法,创建子类实例时可能调用。

▪ 4. 抽象方法和普通方法的比较?

  1. 抽象方法没有方法体;普通方法有方法体
  2. 抽象方法只能写在抽象类(接口)中;普通方法既可以写在普通类中,又可以写在抽象
    类中。

▪ 5. 抽象类与普通类的比较?

抽象类不能被实例化,只能定义引用变量;普通类可以被实例化。
类成员 :两者都可以定义属性
两者都可以定义带方法体的方法
普通类不能写抽象方法抽象类可以写抽象方法

四、final 关键字

▪ 1. 常量

常量: 程序中不变的量。比如:生活中的 π。
用 final 修饰成员变量,语法如下:

public class Penguin {
final String home ="南极";// 居住地
}

分析:所有企鹅的居住地都是南极,所以,就不必要修改了,设置成常量可防止误操作。

▪ 2. 最终方法

最终方法: 不能被重写的方法。语法如下:

ppublic final void print () {
//…
}

▪ 3. 最终类

最终类: 不能被继承的类。语法如下:

public final class Penguin extends Pet {
//…
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值