继承性
Posted 蔷薇的第七夜
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了继承性相关的知识,希望对你有一定的参考价值。
一、继承性
1.1, 继承性的概念:
是指一个类可以基于另一个已经存在的类,也就是子类基于父类。
从而实现父类代码的重用,子类可以调用父类的属性和方法,并能扩展新的能力。
形式:【访问权限修饰符】 【修饰符】子类名 extends 父类名{
子类体
}
1.2 作用
代码的复用
1.3继承在构造方法中的调用
1.子类构造方法总是先调用父类的构造方法
2.默认情况下,调用的是父类的无参的构造方法
3.可以在子类构造方法的第一行,使用super关键字调用父类的任意一个构造方法。
必须将调用父类构造方法的这条语句放在子类构造方法的第一条语句位置。如果第一条语句没有调用父类的构造方法,系统将会自动地在这个位置上插入一条调用父类默认构造方法的语句,即super();
1.4子类构造方法的执行详解
由于默认的构造方法不带参数,所以,如果在父类中定义了带参数的构造方法,而没有定义不带参数的构造方法将会出现编译错误。这也正是建议大家在定义带参数的构造方法时,一定要定义一个不带参数的构造方法的原因所在。
父类中那些带参数的构造方法,子类将不会自动地调用它们,必须人工地将调用它们的语句写入子类的构造方法中。
1.5 this用途
this关键字代表自身,在程序中主要的用途
使用this关键字在自身构造方法内部引用其它构造方法
使用this关键字代表自身类的对象
直接使用this
1使用this关键字引用成员变量
2使用this关键字引用成员方法
this关键字必须放在非静态方法里面
1.使用this关键字引用成员变量
在一个类的方法或构造方法内部,可以使用“this.成员变量名”这样的格式来引用成员变量名,常常用来区分同名的成员变量和局部变量。
public class ReferenceVariable {
private int a;
public ReferenceVariable(int a){
this.a = a;
}
public int getA(){
return a;
}
public void setA(int a){
this.a = a;
}
}
2.this引用构造方法
在一个类的构造方法内部,也可以使用this关键字引用其它的构造方法,这样可以降低代码的重复,也可以使所有的构造方法保持统一,这样方便以后的代码修改和维护,也方便代码的阅读。
public class ReferenceConstructor {
int a;
public ReferenceConstructor(){
this(0);
}
public ReferenceConstructor(int a){
this.a = a;
}
}
3.this引用成员方法
在一个类的内部,成员方法之间的互相调用时也可以使用“this.方法名(参数)”来进行引用。
public class ReferenceObject {
ReferenceObject instance;
public void hello(){ System.out.println("helloWorld");
}
public void sayHello(){
this.hello();
}
}
4.this代表自身对象
在一个类的内部,也可以使用this代表自身类的对象,或者换句话说,每个类内部都有一个隐含的成员变量,该成员变量的类型是该类的类型,该成员变量的名称是this
public class ReferenceObject {
ReferenceObject instance;
public ReferenceObject(){
instance = this;
}
public void test(){
System.out.println(this);
}
}
1.6 super
super关键字代表父类的引用,在程序中主要的用途
在子类构造方法中要调用父类的构造方法,需要注意:super语句只能出现在子类构造方法体的第一行。
当子类方法体中的局部变量或者子类的成员变量与父类成员变量同名时,即子类局部变量覆盖父类成员变量时,用“super.成员变量名”来引用父类成员变量
当子类的成员方法覆盖了父类的成员方法时,也就是子类和父类有完全相同的方法定义(方法体可以不同),此时,用“super.方法名(参数列表)”的方式访问父类的方法。
与this的区别,this通常指代当前对象,super通常指代父类。
1.子类构造方法中要调用父类构造方法
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();
}
}
2.super调用父类成员变量或方法
子类中的成员变量或方法与父类中的成员变量或方法同名。因为子类中的成员变量或方法名优先级高,所以子类中的同名成员变量或方法就隐藏了父类的成员变量或方法,但是我们如果想要使用父类中的这个成员变量或方法,就需要用到super。
class Country {
String name;
void value() {
name = "China";
}
}
******
class City extends Country {
String name;
void value() {
name = "Dalian";
super.value();//不调用此方法时,super.name返回的是父类的成员变量的值null
System.out.println(name);
System.out.println(super.name);
}
public static void main(String[] args) {
City c=new City();
c.value();
}
}
this通常指代当前对象,super通常指代父类对象
class Person {
public static void prt(String s) {
System.out.println(s);
}
Person() {
prt("A Person.");
}
Person(String name) {
prt("A person name is:" + name);
}
}
*****
public class Chinese extends Person {
Chinese() {
super(); // 调用父类无形参构造方法(1)
prt("A chinese.");// (4)
}
Chinese(String name) {
super(name);// 调用父类具有相同形参的构造方法(2)
prt("his name is:" + name);
}
Chinese(String name, int age) {
this(name);// 调用当前具有相同形参的构造方法(3)
prt("his age is:" + age);
}
public static void main(String[] args) {
Chinese cn = new Chinese();
cn = new Chinese("kevin");
cn = new Chinese("kevin", 22);
}
}
二、方法覆盖
方法覆盖的定义
子类可以重写父类中某一个方法,称为方法覆盖,也称方法重写,是继承中非常重要的知识点。如果子类需要修改从父类继承到的方法的方法体,就可以使用方法覆盖。
方法覆盖的原则
同名
同参
同返回值
访问权限不能缩小
三.Final
final修饰属性、局部变量,值不能被修改
final修饰类,不能被继承
final修饰方法,不能被子类覆盖
以上是关于继承性的主要内容,如果未能解决你的问题,请参考以下文章
JSJavaScript继承 - 原型链 - 盗用构造函数 - 组合继承 -原型式继承 - 寄生式继承 - 寄生式组合继承