1. 继承有什么作用?
- 基本作用:子类继承父类,代码得到复用
- 主要作用:继承是方法覆盖的重写和多态机制的前提(有了继承关系才有后来的方法覆盖重写和多态机制)
2. 继承的特点
- 若A继承B,我们称B为父类(基类、超类),称A为子类(派生类)。
- 在Java中只支持单继承,这也是体现java简单性的一点。
- 虽然Java不支持多继承,但可以实现间接继承(A–>B–>C)。
- 子类可以拥有父类“特征”,子类也可以拥有自己的“特征”。
- 如果一个类没有编写继承关系,那么这个类默认继承Object(是祖宗类,也就是说所有的类的实例都有Object类的特征)。
- 继承的缺点:在两个类实现继承关系后,会导致代码耦合度提高(若父类修改内容,会导致子类收到影响)
3. 什么条件下可以使用继承?
凡是能用“is a“(类与类之间的关系)能描述的类,都可以使用继承
Cat is Animal -----> class Cat extends Animal
Dog is Animal -----> class Dog extends Animal
Monkey is Animal -----> class Monkey extends Animal
4. 方法的覆盖(重写)
方法重写与方法重载区别
-
什么时候会考虑使用方法重载?
在一个类中,如果方法的功能相似,建议将取相同的名字,这样代码美观、便于编程
-
什么条件满足后会构成方法重载?
- 前提:在同一个类中
- 方法名相同
- 参数列表不同(参数的个数,参数的类型,参数类型的顺序)
- 方法重载于修饰符列表和返回值无关
方法重写:
- 什么时候会考虑使用方法重写?
当子类从父类继承过来的方法无法满足当前子类的业务需求时,子类有权利对这个方法进行重新编写
- 什么条件满足后会构成方法重写?
- 前提:在继承关系中
- 方法名和参数列表都相同
- 访问权限不能更低,可以更高
- 子类返回值类型必须小于等于父类返回值类型
- 子类不能比父类抛出更宽泛的异常
方法重写经典案例
public class Test2 {
public static void main(String[] args){
EnglishPerson enPer = new EnglishPerson();
ChinaPerson cPer = new ChinaPerson();
enPer.speak();
cPer.speak();
}
}
class Person {
String name; //姓名
String skinColor; //肤色
public void speak() {
System.out.println("人在讲话");
}
}
class EnglishPerson extends Person{
public void speak() {
System.out.println("英国人讲话说英语");
}
}
class ChinaPerson extends Person {
public void speak() {
System.out.print("中国人讲话说汉语");
}
}
上面的代码子类重写了父类的方法!
引子——println()输出对象为什么得到的是内存地址的哈希值
package com.jsoft.test;
public class UserTest {
public static void main(String[] args){
User user = new User("admin","123");
System.out.println(user);
}
}
class User {
String name; //用户名
String password; //密码
public User(){}
public User(String name, String password) {
this.name = name;
this.password = password;
}
}
对于上面的程序运行结果是这样的:完整类名@地址哈希值
5. this与super
this
- this是关键字,是一个引用保存了对象自身的地址,存储在对象内部,代表对象本身。
- this可以用在实例方法和构造方法中。
- this不能用在静态方法中
- this在大多数情况下是可以省略的——当局部变量和实例变量同名时不能省略
- 语法格式:this.属性名/方法名 | this()
super
- super是关键字,代表的是当前对象(this)的“父类型特征1”
- super可以用在实例方法和构造方法中(子类构造方法第的第一行有一个隐含的“super()”)
- super不能用在静态方法中
- super在大多数情况下是可以省略的——当子类对象的属性或实例方法和“父类型特征”相同时,需要使用super区分两者。
- 语法格式:super.属性名/方法名 | super() —> 初始化对象父类型特征
6. 构造方法中存在的隐含的操作
1.所有的构造方法的第一行都会有隐含的super(),用于调用父类缺省构造器,如果在子类中编写super(),那么第一行隐含的super()将不复存在。
2.对于任何构造方法都会有隐含的赋值操作(给实例变量赋默认值)。