==============================================================
继承 Extends
继承,extends
基础用法
class A{}
class B extends A{}
如上,B类继承A类
继承的特性如下:
① B类继承A类,则称A类为超类(superclass)、父类、基类,B类则称为子类(subclass)、派生类、扩展类。我们平时聊天说的比较多的是:父类和子类。
② java 中的继承只支持单继承,不支持多继承,C++中支持多继承,这也是 java 体现简单性的一点,换句话说,java 中不允许这样写代码:
class B extends A,C{}
这是错误的。
③ 虽然 java 中不支持多继承,但有的时候会产生间接继承的效果,例如:class C extends B,class B extends A,也就是说,C 直接继承 B,其实 C 还间接继承 A。
④ java 中规定,子类继承父类,除构造方法不能继承之外,剩下都可以继承。但是私有的属性无法在子类中直接访问。(父类中private修饰的不能在子类中直接访问。可以通过间接的手段来访问。)
⑤ java 中的类没有显示的继承任何类,则默认继承 Object类,Object类是 java 语言提供的根类(老祖宗类),也就是说,一个对象与生俱来就有 Object类型中所有的特征。
⑥ 继承也存在一些缺点,例如:CreditAccount 类继承 Account 类会导致它们之间的耦合度非常高,Account 类发生改变之后会马上影响到 CreditAccount 类。
具体继承的解释用法
首先建立一个 银行账户类,包含账户的账号和余额
// 银行账户类
// 账户的属性:账号、余额
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(){}
// setter and getter方法
public void setCredit(double credit){
this.credit = credit;
}
public double getCredit(){
return credit;
}
}
由继承可知,在CreditAccount中,同样包含了Account中的actno和balance,且包含了Account中的所有setter和getter。
所以可以在主类对他们操作时,这样写:
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());
}
可以看到,在上述代码中,明明在CreditAccount类中没有写setActno和setBalance等方法,但是由于继承,可以去调用写在父类的这类方法。
但是注意:构造方法不能继承,并且在子类中是无法直接访问父类中的private修饰的变量的。
例如,如下写法是错误的
System.out.println(actno);
错误: actno 在 Account 中是 private 访问控制
因为 引用 ca是CreditAccount类创建的,其中并没有actno,actno是在父类之中且属于private修饰的私有变量,所以这样使无法直接访问的。
那么要如何去访问呢?
答案是:通过继承的setter和getter方法去访问
System.out.println(getActno());
如此,便可以对父类中的私有变量进行访问和修改了。
==============================================================
在实际开发中,满足什么条件的时候,我可以使用继承呢?
凡是采用“is a”能描述的,都可以继承。
例如:
Cat is a Animal:猫是一个动物(Cat类继承Animal类)
Dog is a Animal:狗是一个动物(Dog类继承Animal类)
CreditAccount is a Account:信用卡账户是一个银行账户(CreditAccount 继承Account类)
注意:并不是两个类有相同的代码就要继承,一定要有"is a"的关系!
==============================================================
对System.out.println(“Hello World!”);的解读
System.out.println("Hello World!");
现在再来看这段代码,可以理解到:
System是一个类名
out是一个变量名
println是一个方法名
类名.变量名.方法名 说明这个变量是一个静态变量。
例如下串代码
public class Test{
static Student stu = new Student();
public static void main(String[] args){
Student s = Test.stu;
s.exam();
//上2行合并为1行
Test.stu.exam();
//类比于
System.out.println("Hello World!");
}
class Student{
public void exam(){
System.out.println("EXAM");
}
}
==============================================================