一:概念
继承是面向对象的显著特征。继承是从现有的类中派生新的类,新的类能吸收已有的类的属性和行为,并且能扩展新的功能。Java继承是使用已存在的类的定义作为基础建立新类的技术,新的定义可以增加新的技术或者新的功能,也可以用父类的功能,但不能选择性的继承父类,超类,基类。这种使复用以前的代码非常容易,能够大大缩短开发周期,降低费用。提高复用性,只要继承父类,就有一样的功能。
特点:
1、 使用extends关键字
2、 相当于子类把父类的功能复制了一份
3、 java只支持单继承
4、 继承可以传递(爷爷,儿子,孙子的关系)
5、 不能继承父类的私有成员
6、 继承多用于功能的修改,子类可以拥有父类的功能的同时,进行功能拓展
7、 像是is a 的关系(强制依赖关系)
练习一:继承的特点
package cn.tedu.oop;
public class Test5_Extends {
public static void main(String[] args) {
// 调用了父类的eat功能
Dog d=new Dog();
d.eat();
//在父类中 private修饰的不能被子类继承
// System.out.println(d.ani);
System.out.println(d.coin);
//继承可以传递
System.out.println(d.country);
}
}
class Yete{
String country="中国";
}
class Animal extends Yete{
private String money;
public String coin;
public void eat() {
System.out.println("动物吃");
}
}
//继承用extend
class Dog extends Animal{
}
class Cat extends Animal{
}
结果:
二:super关键字
代表的是父类对象的一个引用,用来在子类中使用父类的功能,如果在构造方法中,super必须是第一条语句。
public class Test6_UseExtends {
public static void main(String[] args) {
Son s=new Son();
System.out.println(s.skin);//1.使用了父类的
s.sing();//2.2使用了子类扩展的功能
}
}
class Fa{
public String skin="yellow";
int num=30;
//当父类的变量名和子类的同名时
}
class Son extends Fa{
//2.1子类自己扩展的功能
int num=10;
public void sing() {
int num=2;
System.out.println("子类爱唱歌");
System.out.println(this.num);//3、使用了成员变量
System.out.println(skin);//使用了父类中的属性
System.out.println(super.num);//4、使用了父类的同名变量
}
}
结果:
三:方法的重写
继承后,子类就拥有了父类的功能,那么子类就可以使用或者修改父类的方法。 子类中方法名与父类完全一样(包括方法的返回值,方法名和参数列表,完全一致)时,会发生覆盖/复写操作,相当于修改功能。
重写要求:继承关系+子类方法的声明(方法返回值 方法名 参数列表)必须和父类一样。
package cn.tedu.oop;
public class Test7_UseExtends2 {
public static void main(String[] args) {
Erzi er=new Erzi();
//使用父类的方法
er.like();
//使用自己的方法
er.eat();
//重写后使用子类的方法
er.like();
}
}
class Baba{
//1子类可以使用父类的方法
public void like() {
System.out.println("爸爸喜欢集邮");
}
}
class Erzi extends Baba{
//2子类可以由自己的特有的方法
public void eat() {
System.out.println("儿子喜欢吃西红柿");
}
//3子类可以修改父类的方法---重写
public void like() {
System.out.println("儿子喜欢唱歌");
}
}
结果:
四:构造方法的使用
子类继承父类 当子类创建对象时 子类的默认构造方法中隐藏着父类的构造方法:1执行父类构造super() 2执行子类构造
如果父类没有无参构造,super();会报错。可以修改成有参的super("张大海");不过为了自己方便或者子类方便,在写父类时,记得写上无参构造。
练习:构造函数的使用
//继承中的构造方法
public class Test8_UseExtends {
public static void main(String[] args) {
Son2 son=new Son2();
}
}
class Fa2{
public Fa2() {
System.out.println("父类");
}
}
class Son2 extends Fa2{
//当子类继承父类时 子类的默认构造方法中隐藏着父类的构造方法 1执行父类构造super() 2执行子类构造
public Son2() {
super();
System.out.println("子类");
}
}
结果:
this和super的区别:
1、 this代表本类对象的引用,super代表父类对象的引用。
2、 this用于区分局部变量和成员变量
3、 super用于区分本类变量和父类变量
4、 this.成员变量 this.成员方法() this(【参数】)代表调用本类内容
5、 super.成员变量 super.成员方法() super(【参数】),代表调用父类内容
6、 this和super不可以同时出现在同一个构造方法里,他们两个只要出现都得放在第一行,同时出现的话,会报错。
重写与重载的区别:
1、重载:是指同一个类中的多个方法具有相同的名字,但这些方法具有不同的参数列表,即参数的数量或参数类型不能完全相同
2、重写:是存在子父类之间的,子类定义的方法与父类中的方法具有相同的方法名字,相同的参数表和相同的返回类型
3、重写是父类与子类之间多态性的一种表现
4、重载是一类中多态性的一种表现