JavaSE 基础 - 第12章 继承
1、什么是继承,有什么用?
继承:在现实世界当中也是存在的,例如:父亲很有钱,儿子不用努力也很有钱。
继承的作用:
基本作用:子类继承父类,代码可以得到复用。(这个不是重要的作用,是基本作用。)
主要(重要)作用:因为有了继承关系,才有了后期的方法覆盖和多态机制。
2、继承的相关特性(背)
1、B类继承A类,则称A类为超类(superclass)、父类、基类,
B类则称为子类(subclass)、派生类、扩展类。
class A{}
class B extends A{}
我们平时聊天说的比较多的是:父类和子类。
superclass 父类
subclass 子类
2、java 中的继承只支持单继承,不支持多继承,C++中支持多继承,
这也是 java 体现简单性的一点,换句话说,java 中不允许这样写代码:
class B extends A,C{ } 这是错误的。
3、虽然 java 中不支持多继承,但有的时候会产生间接继承的效果,
例如:class C extends B,class B extends A,也就是说,C 直接继承 B,
其实 C 还间接继承 A。
4、java 中规定,子类继承父类,除 构造方法 不能继承之外,剩下都可以继承。
但是私有的属性无法在子类中直接访问。(父类中private修饰的不能在子类中直接访问。
可以通过间接的手段来访问。)
5、java 中的类没有显示的继承任何类,则默认继承 Object类,
Object类是java 语言提供的根类(老祖宗类),
也就是说,一个对象与生俱来就有 Object类型中所有的特征。
6、继承也存在一些缺点,例如:CreditAccount 类继承 Account 类会导致它们之间
的耦合度非常高,Account 类发生改变之后会马上影响到 CreditAccount 类
【实例:】
// 使用继承机制来解决代码复用问题。
// 继承也是存在缺点的:耦合度高,父类修改,子类受牵连。
public class ExtendsTest02{
public static void main(String[] args){
// 创建普通账户
Account act = new Account();
act.setActno("1111111");
act.setBalance(10000);
System.out.println(act.getActno() + ",余额" + act.getBalance());
// 创建信用账户
CreditAccount ca = new CreditAccount();
ca.setActno("2222222");
ca.setBalance(-10000);
ca.setCredit(0.99);
System.out.println(ca.getActno() + ",余额" + ca.getBalance() + ",信誉度" + ca.getCredit());
}
}
// 银行账户类
// 账户的属性:账号、余额
class Account{ // 父类
// 属性
private String actno;
private double balance;
// 构造方法
public Account(){
}
public Account(String actno, double balance){
this.actno = actno;
this.balance = balance;
}
// setter and getter
public void setActno(String actno){
this.actno = actno;
}
public String getActno(){
return actno;
}
public void setBalance(double balance){
this.balance = balance;
}
public double getBalance(){
return balance;
}
}
// 其它类型的账户:信用卡账户
// 账号、余额、信誉度
class CreditAccount extends Account{ //子类
// 属性
private double credit;
// 构造方法
public CreditAccount(){
}
public void doSome(){
//错误: actno 在 Account 中是 private 访问控制
//System.out.println(actno);
// 间接访问
//System.out.println(this.getActno());
System.out.println(getActno());
}
// setter and getter方法
public void setCredit(double credit){
this.credit = credit;
}
public double getCredit(){
return credit;
}
}
3、测试:子类继承父类之后,能使用子类对象调用父类方法吗?
可以,因为子类继承了父类之后,这个方法就属于子类本身了。
当然可以使用子类对象来调用。
4、在实际开发中,满足什么条件的时候,我可以使用继承呢?
凡是采用“is a”能描述的,都可以继承。
例如:
Cat is a Animal:猫是一个动物
Dog is a Animal:狗是一个动物
CreditAccount is a Account:信用卡账户是一个银行账户
…
假设以后的开发中有一个A类,有一个B类,A类和B类确实也有重复的代码,那么他们两个之间就可以继承吗?
不一定,还是要看一看它们之间是否能够使用is a来描述。
class Customer{
String name; // 名字
// setter and getter
}
class Product{
String name; // 名字
// setter and getter
}
class Product extends Customer{
}
以上的继承就属于很失败的。因为:Product is a Customer,是有违伦理的。
5、Object类当中有哪些方法呢?
任何一个类,没有显示继承任何类,默认继承Object,那么Object类当中有哪些方法呢?老祖宗为我们提供了哪些方法?
以后慢慢的大家一定要适应看JDK的源代码(多看看牛人写的程序自己才会变成牛人。)
先模仿后超越。
java为什么比较好学呢?
是因为Java内置了一套庞大的类库,程序员不需要从0开始写代码,程序员可以
基于这套庞大的类库进行“二次”开发。
(开发速度较快,因为JDK内置的这套库实现了很多基础的功能。)
例如:String是SUN编写的字符串类、System是SUN编写的系统类。
这些类都可以拿来直接使用。
JDK源代码在什么位置?
C:\Program Files\Java\jdk-13.0.2\lib\src.zip
(可以解压到当前文件夹便于查找观看)
你现在能看懂以下代码了吗?
System.out.println("Hello World!");
System.out 中,out后面没有小括号,说明out是变量名。
另外System是一个类名,直接使用类名System.out,说明out是一个静态变量。
System.out 返回一个对象,然后采用“对象.”的方式访问println()方法。
我们研究了一下Object类(C:\Program Files\Java\jdk-13.0.2\lib\src\java.base\java\lang\Object.java)
当中有很多方法,大部分看不懂,其中有一个叫做toString()的,
//没有static,实例方法,要先new对象,再使用“引用.”方式调用
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
我们进行了测试,发现:
System.out.println(引用);
当直接输出一个“引用”的时候,println()方法会先自动调用“引用.toString()”,然后
输出toString()方法的执行结果。
【例1】
// 先new对象
ExtendsTest05 et = new ExtendsTest05();
String retValue = et.toString();
// 2f92e0f4 可以“等同”看做对象在堆内存当中的内存地址。
// 实际上是内存地址经过“哈希算法”得出的十六进制结果。
System.out.println(retValue); // ExtendsTest05@2f92e0f4
【例2】
// 创建对象
Product pro = new Product();
// 如果直接输出“引用”呢???????
System.out.println(pro); //Product@5305068a ,println方法会自动调用pro的toString()方法。
传送门
上一章:JavaSE 基础 - 第十一章 this和static
下一章:JavaSE 基础 - 第十三章 方法覆盖和多态