继承概念、特点、作用
继承的基本概念:继承指一个对象直接使用另一对象的属性和方法
继承的作用:继承是面向对象语言的重要机制。借助继承,可以扩展原有的代码,应用到其他程序中,而不必重新编写这些代码。
在java语言中,继承是通过扩展原有的类,声明新类来实现的。扩展声明的新类称为子类,原有的类称为父类。
继承机制规定,子类可以拥有父类的所有属性和方法,也可以扩展定义自己特有的属性,增加新方法和重新定义父类的方法。在软件开发中继承就是子类可以使用从父类继承的属性和方法。子类能吸收已有类的数据属性和行为,并能扩展新的能力。
代码复用
子类对象可以直接调用父类的属性和方法
//【代码一】 :子类对象可以直接调用父类的方法,强调复用性
Circle circle=new Circle(); // 创建子类的对象开始调用
circle.draw(); //子类调用父类的方法
继承的特点:继承的优缺点 因为大部分是继承而来的
很容易修改和扩展已有的实现
尽管子类可以集成父类所有的成员和方法,但是不能集成构造方法。
继承的形式:【访问权限修饰符】【修饰符】子类名 extends 父类名{子类体}
【代码一】 public class Shape { //创建父类Shape
public void draw(){} //父类的方法
}
public class Circle extends Shape{ //创建父类Shape的子类Circle
public double getDiameter(){ //创建Circle的方法
return 0;
}
}
继承中构造方法的调用:
l 子类构造方法总是先调用父类构造方法
l 默认情况下,调用父类无参构造方法
l 可以在子类构造方法的第一行,使用super关键字调用父类任意一个构造方法
1、子类的构造的过程中必须调用其父类的构造方法。
2、子类可以在自己的构造方法中使用super()调用父类的构造方法。
1)使用this.调用本类的另外的构造方法;
2)如果调用super,必须写在子类构造方法的第一行。
3、如果子类的构造方法中没有显示地调用父类的构造方法,则系统默认调用基类中无参数的构造方法。
4、如果子类构造方法中既没有显示调用父类构造方法,而基类中又没有无参数的构造方法,则编译出错。
this关键字用途
this关键字代表自身类的对象,在程序中主要的用途
使用this关键字在自身构造方法内部引用其它构造方法
使用this关键字代表自身类的对象
直接使用this
使用this关键字引用成员变量
public void eat() { //定义了方法吃:吃的是炸酱面
this.type = "炸酱面"; //引用成员变量
System.out.println("喜欢吃的主食是:"+this.type);
}
在一个类的方法或构造方法内部,可以使用“this.成员变量名”这样的格式来引用成员变量名,常常用来区分同名的成员变量和局部变量。
使用this关键字引用成员方法
在一个类的内部,成员方法之间的互相调用时也可以使用“this.方法名(参数)”来进行引用。
public class ReferenceObject {
ReferenceObject instance;
public void hello(){
System.out.println("helloWorld");
}
public void sayHello(){
this.hello();
}
}
注意:this关键字必须放在非静态方法里面
super关键字用途
super关键字代表父类的引用,在程序中主要的用途
在子类构造方法中要调用父类的构造方法,需要注意:super语句只能出现在子类构造方法体的第一行。
当子类方法体中的局部变量或者子类的成员变量与父类成员变量同名时,即子类局部变量覆盖父类成员变量时,用“super.成员变量名”来引用父类成员变量
当子类的成员方法覆盖了父类的成员方法时,也就是子类和父类有完全相同的方法定义(方法体可以不同),此时,用“super.方法名(参数列表)”的方式访问父类的方法。
与this的区别,this通常指代当前对象,super通常指代父类。
class Base {
Base() {
System.out.println("Base");
}
}
public class Checket extends Base {
Checket() {
super(); //调用父类的构造方法,一定要放在方法的首个语句
System.out.println("Checket");
}
public static void main(String argv[]) {
Checket c = new Checket();
}
}
super调用父类成员变量或方法
class Country {
String name;
void value() {
name = "China";
}
}
当子类的方法名或变量和父类相同时,子类中的方法名或变量名会隐藏了父类的方法名或者变量名。
如果想要使用父类中的这个成员变量或方法,就需要用到super。
方法覆盖的定义
子类可以重写父类中某一个方法,称为方法覆盖,也称方法重写,是继承中非常重要的知识点。如果子类需要修改从父类继承到的方法的方法体,就可以使用方法覆盖。
方法覆盖的原则
1、同名 // 父类和子类的自变量名字相同
2、同参 //父类和子类的自变量下的参数相同
3、同返回值
4、访问权限不能缩小 //类似显性转换
final修饰符
1. final修饰属性、局部变量,值不能被修改
2. final修饰类,不能被继承
3. final修饰方法,不能被子类覆盖