关于继承,你掌握多少?来检测一下吧:
概念
继承是面向对象软件技术当中的一个概念,与多态、封装共为面向对象的三个基本特征。继承可以使得子类具有父类的属性和方法或者重新定义、追加属性和方法等。
这种技术使得复用以前的代码非常容易,能够大大缩短开发周期,降低开发费用。
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的属性和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
Java继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。
子类的创建可以增加新数据、新功能,可以继承父类全部的功能,但是不能选择性的继承父类的部分功能。继承是类与类之间的关系,不是对象与对象之间的关系。
例如:先定义一个类叫车,车有以下属性:车体大小、颜色、轮胎、方向盘、品牌、速度、排气量,由车这个类派生出轿车和卡车两个类,为轿车添加一个小后备箱,而为卡车添加一个大货箱。
如果某类B“继承”另某类A,就把这个B称为“A的子类或派生类(subclass)”,而把类A称为“B的父类”也可以称为“A是B的超类或基类(superclass)”。
如果一个类别A“继承自”另一个类别B,就把这个A称为“B的子类别”,而把B称为“A的父类别”也可以称“B是A的超类”。
继承可以使得子类别具有父类别的各种属性和方法,而不需要再次编写相同的代码。在令子类别继承父类别的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类别的原有属性和方法,使其获得与父类别不同的功能。另外,为子类别追加新的属性和方法也是常见的做法。一般静态的面向对象编程语言,继承属于静态的,意即子类别的行为在编译期就已经决定,无法在执行期扩充。
那么如何使用继承呢?用extends关键字来继承父类。
如上面A类与B类,当写继承语句时,class A类 extends B类{ } 其中A类是子类,B类是父类。
继承的语句格式:
class 子类名 extends 父类名{}
class 父类 { } class 子类 extends 父类 { }
继承关键字(keyword)
继承可以使用 extends 和 implements 这两个关键字来实现继承,而且所有的类都是继承于java.lang.Object,当一个类没有继承的两个关键字,
则默认继承object(这个类在 java.lang包中,所以不需要 import)祖先类。
1)extends关键字
在 Java 中,类的继承是单一继承,也就是说,一个子类只能拥有一个父类,所以 extends 只能继承一个类。
public class Animal {
private String name;
private int id;
public Animal(String Name, String id) {
this.name= name;
this.id= id;
}
public void eat(){
System.out.println(name+"正在吃");
}
public void sleep(){
System.out.println(name+"正在睡");
}
public void introduce() {
System.out.println("大家好!我是"+ id+ "号"+ name+ ".");
}
}
public class Mouse extends Animal {
public Mouse(String myName, intmyId) {
super(Name, Id);
}
}
2)implements关键字
implements 关键字可以变相的使Java具有多继承的特性,使用范围为类实现接口的情况,可以同时实现多个接口(接口之间采用逗号分隔)。
public interface A {
public void eat();
public void sleep();
}
public interface B {
public void run();
}
public class C implements A,B {
}
3)final关键字
final可以修饰类、变量、方法。实例变量也可以被final修饰,被 final 修饰的变量在Java中就是常量,
被 final 修饰的类的属性和方法自动地声明为 final,但是被final修饰实例属性和变量,并不能让所在类变成final类
final 关键字声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写:
声明类:finalclass类名 {//类体}
声明方法:修饰符(public/private/default/protected) final返回值类型 方法名(){//方法体}
4)static关键字
static修饰成员变量(属性)和方法、代码块(不能出现在方法内部),static修饰变量(属性)和方法,得到的是类变量和类方法,类变量和类方法用所在类的类名直接调用。static和abstract不能一起使用。
由static修饰的变量和方法,不能用this调用。静态方法可以调用静态的方法,普通方法也可以调用静态方法,静态方法不能调用普通方法。
5)this关键字
this 关键字在Java方法中只能用在实例变量和实例方法上,不能用在由static、final修饰的类变量和类方法上
如果在Java方法中,实例化的成员变量和某方法的参数变量同名时,根据内部屏蔽外部的原则,即实例化的成员变量在这个方法内暂时失效,
这时如果想在该方法中使用这被屏蔽的成员变量,用“this.成员变量名”的方式调用该成员变量,并且将参数变量赋值给this调用的成员变量,
格式如下:this.本类实例变量=参数变量;
public class Teacher {
private String name; // 教师名称
private double salary; // 工资
private int age; // 年龄
// 创建构造方法,为上面的3个成员变量的属性赋初始值
public Teacher(String name,int age,double salary) {
this.name = name; // 设置教师名称
this.age = age; // 设置教师年龄
this.salary = salary; // 设置教师工资
}
//在一个构造器中调用另一个构造器
public Teacher(){
This("杜威",98,10000.0)
}
//当需要返回当前对象的引用时,常常使用return this。
publicStudent AgeIncrement(){
age+=2;
return this;
}
}
publicclassThisDemo{
public static void main(String[] args) {
Teacher teacher = new Teacher("王刚",5000.0,45);
System.out.println("教师信息如下:");
System.out.println("教师名称:"+teacher.name+"\n教师年龄:"+teacher.age+"\n教师工资:"+teacher.salary);
}
}
用来访问本类的成员方法:this.本类实例方法名
6)super关键字:super是在子类中调用被屏蔽的成员变量和方法
public class SuperClass {
int sum, i = 50, j =3;
int operator(){
sum=i+j;
return sum;
}
}
public class SubClass extends SuperClass {
int i =100, j=6;
int operator(){
sum=i+j;
return sum;
}
public void showMessage() {
System.out.println("this.i="+this.i+ ",this.j="+this.j+ " ,this.operator() = "+ this.operator() );
System.out.println("super.i = "+ super.i +",super.j= "+super.j +",super.operator() = "+ super.operator());
}
}
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
SubClass subObject =new SubClass();
subObject.showMessage();
}
}
警告
1、子类拥有父类的特征,而父类没有,父类更通用,子类更具体(特征包括属性和方法,自身的特性,拥有父类没有的)
2、使用extends继承父类,语句格式:class 子类名 extends 父类名{}
3、父类中一般只定义一般属性和方法(这个一般可以理解为是子类共有的,这就是父类更通用,而子类拥有其他的,所以子类更具体)
4、子类中通过super关键字来调用父构造方法
5、在子类中可以继承父类的哪些东西,哪些不可以继承
父类中public、protected修饰的属性和方法可以继承,private修饰的属性和方法可以被继承,但子类无法调用
6、规则:创建子类对象的时候,首先调用的是父类的无参构造方法创建一个父类对象
7、可以在子类中显示调用父类的有参构造方法
8、如果父类的属性均为private修饰,则可以通过共有的getter、setter方法来调用
有些编程语言支持多重继承,即一个子类别可以同时有多个父类别,比如C++编程语言;而在有些编程语言中,一个子类别只能继承自一个父类别,比如Java编程语言,这时可以利用接口来实现与多重继承相似的效果。
现今面向对象程式设计技巧中,继承并非以继承类别的“行为”为主,而是继承类别的“型态”,使得元件的型态一致。另外在设计模式中提到一个守则,“多用合成,少用继承”,此守则也是用来处理继承无法在执行期动态扩充行为的遗憾。