概念
继承是面向对象最显著的一个特征继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并扩展新的能力.
Java继承是会用已存在的类的定义作为基础建立新类的技术
新类的定义可以增加新的数据或者新的功能,也可以使用父类的功能,但不能选择性的继承父类(超类/基类)
这种继承使得复用以前的代码非常容易,能够大大的缩短开发的周期,降低开发费用.
特点
- 使用extends关键字来表示继承关系
- 相当于子类把父类的功能复制了一份
- Java只支持单继承
- 继承可以传递(爷爷/儿子/孙子这样的关系)
- 不能继承父类的私有成员
- 继承多用于功能的修改,子类可以在拥有父类功能的同时,进行功能拓展
- 像是is a的关系
示例
```java package cn.tedu.oopextends;
/**
- 用于练习继承的入门案例 */
public class TestExtendsDemo { public static void main(String[] args) { Grandpa g = new Grandpa(); Father f = new Father(); Son s = new Son(); g.eat(); s.eat(); f.eat(); s.show(); / 子类继承父类方法后,可以使用父类的功能 继承可以传递,爷爷的功能传递给父亲,父亲的功能传递给儿子 子类的特有功能,父类无法使用 / } } //爷爷类 class Grandpa{ public void eat(){ System.out.println(“吃火锅”); } } //父亲类 class Father extends Grandpa{ String name = “伏羲”; //访问控制符—只能控制可不可见,私有资源只能在本类中使用 private int age = 5000; } //儿子类 / java只支持单继承,一个子类只能有一个父类,但一个父类可以有多个子类 继承是一种is a的关系 要求子类必须是父类所下属的一种类型,依赖性非常强,耦合性也非常强 依赖性强 / class Son extends Father{ //子类可以拥有自己的特有功能 public void show(){ System.out.println(name); //子类不可以使用父类的私有资源,单继承就相当于把父类的资源复制了一份,也包含私有资源 //System.out.println(age); System.out.println(“不想吃火锅”); } }
<a name="LRwl2"></a>
# super关键字
<a name="gcIwz"></a>
## 概念
_关键字super代表父类 相当于--Father super = new Father();<br />所以想指定同名的父类成员变量是使用super来指定_
<a name="RE2Mw"></a>
## 示例
```java
package cn.tedu.oopextends;
/**
* 用于测试继承的用法
*/
public class TestExtends1 {
public static void main(String[] args) {
new Son1().eat();
}
}
class Father1{
int sum = 10;
}
class Son1 extends Father1{
int sum = 100;
public void eat(){
int sum = 1000;
System.out.println(sum);
System.out.println(this.sum);
/*
关键字super代表父类 相当于--Father super = new Father();
所以想指定同名的父类成员变量是使用super来指定
*/
System.out.println(super.sum);
super.sum = 10000;
System.out.println(super.sum);
}
}
继承中构造方法的使用
- 子类构造方法的第一行默认存在 superO;-表示调用父类的无参构造
- 继承中每当创建子类对象时会先调用父类的构造方法
- 当父类没有无参构造时可以通过 super(参数)调用其他的父类的构造方法
注意事项
子类创建对象时会默认调用父类的构造方法
子类构造方法的第一行默认存在super();—调用父类的无参构造
至于调用的是那种父类构造方法,并不关心,只有需要有父类构造被调用就可以。
构造方法不可以被继承,因为构造方法名要求与本类类名相同
构造方法不能被继承,因为子类中不能出现父类名字的构造方法示例
```java package cn.tedu.oopextends;
/**
- 用于测试继承中的构造方法的使用 */
public class TestCons { public static void main(String[] args) { //因为默认存在无参构造,所以可以在不提供构造的情况下直接创建对象 Father f = new Father(); Son s = new Son(); Son s2 = new Son(“埼玉”); Father f2 = new Father(“杰诺斯”); } }
class Father{ public Father(){ System.out.println(“父类的无参构造”); }
public Father(String name){
System.out.println("父类的有参构造" + name);
}
}
/ 子类创建对象时会默认调用父类的构造方法 子类构造方法的第一行默认存在super();—调用父类的无参构造 至于调用的是那种父类构造方法,并不关心,只有需要有父类构造被调用就可以。 构造方法不可以被继承,因为构造方法名要求与本类类名相同 / class Son extends Father{ public Son() { super(“音速索尼克”); System.out.println(“子类的无参构造”); }
public Son(String s){
System.out.println("子类的含参构造。" + s);
}
}
<a name="Zb0zO"></a>
### 成员方法的使用
_子类创建对象时会默认调用父类的构造方法<br />子类构造方法的第一行默认存在super();--调用父类的无参构造<br />至于调用的是那种父类构造方法,并不关心,只有需要有父类构造被调用就可以。<br />构造方法不可以被继承,因为构造方法名要求与本类类名相同_
<a name="oUEFC"></a>
#### 示例
```java
package cn.tedu.oopextends;
/**
* 用于测试继承中的构造方法的使用
*/
public class TestExtends {
public static void main(String[] args) {
Son1 s = new Son1();
s.Play();
new Father1().Play();
new Father1().Study();
s.Study();
}
}
/**
* OCP原则
* 面向功能修改关闭,面向功能拓展开放
* 例如重写可以在不更改父类方法的前提下完成功能更新
*/
class Father1{
public void Play(){
System.out.println("塞尔达传说");
}
public void Study(){
System.out.println("正在学习Java第一阶段");
}
}
class Son1 extends Father1{
/*
方法的重写
继承后,子类对父类方法有不同需求时可以重写
规则:----两同两小一大原则
两同:方法名与参数列表(方法签名)保持一致
两小:子类返回值类型 <= 父类返回值类型
子类方法抛出的异常类型 <= 父类抛出的异常类型
一大:子类方法的修饰符 >= 父类方法的修饰符
*/
@Override //注解、标签、标记------用于标记这个方法是被重写的方法
public void Play(){
System.out.println("马里奥赛车");
}
public void Work(){
System.out.println("我们都是程序猿");
}
public void Study(){
System.out.println("不想学Java");
}
}
构造方法的使用
- 子类构造方法第一行默认存在super();—表示调用父类的无参构造
- 继承中,每当创建子类对象时会先调用父类的构造方法
- 当父类没有无参构造时,可以使用super(参数);调用父类的其他构造方法
- 注意事项:子类必须要调用父类的构造方法,不关心构造方法的参数,但必须要调用
- 构造方法不能被继承,因为构造方法是与类同名的方法,所以子类无法继承父类的构造方法。
示例
```java package cn.tedu.oopextends;
/**
- 用于测试继承中的构造方法的使用 */
public class TestCons { public static void main(String[] args) { //因为默认存在无参构造,所以可以在不提供构造的情况下直接创建对象 Father f = new Father(); Son s = new Son(); Son s2 = new Son(“埼玉”); Father f2 = new Father(“杰诺斯”); } }
class Father{ public Father(){ System.out.println(“父类的无参构造”); }
public Father(String name){
System.out.println("父类的有参构造" + name);
}
}
/ 子类创建对象时会默认调用父类的构造方法 子类构造方法的第一行默认存在super();—调用父类的无参构造 至于调用的是那种父类构造方法,并不关心,只有需要有父类构造被调用就可以。 构造方法不可以被继承,因为构造方法名要求与本类类名相同 / class Son extends Father{ public Son() { super(“音速索尼克”); System.out.println(“子类的无参构造”); }
public Son(String s){
System.out.println("子类的含参构造。" + s);
}
} ```