继承的由来:
通过代码演示描述多个事物。多个事物之间发现有共同的属性和行为。这样代码的复用性很差,我们可以将相同的代码进行抽取,抽取出来后放在单独的类中,为了让类与类之间能有关系,我们就可以使用java中提供的继承机制。
class Person{
//将下面两个类中共有的变量或方法抽取出来 成为下面的父类
String name;
int age;
}
class Student extends Person{
//Student通过extends继承父类的成员变量,可以直接调用
public void show(){
name="小明";
age=10;
System.out.print("学生名:"+name+"年龄:"+age);
}
}
class Teacher extends Person{
//Teacher通过extends继承父类的成员变量,可以直接调用
public void show(){
name="李老师";
age=20;
System.out.print("老师名:"+name+"年龄:"+age);
}
}
继承的好处:
1、继承的出阿信提高了代码的复用性,提高了软件开发的效率。
2、继承的出现让类与类之间产生了关系,提供了多态 的前提。
注意
使用继承必须保证类与类之间有所属关系。
java只支持单继承不支持多继承,即一个类只能有一个父类不能有多个父类。但一个类可被多个类继承。
不要仅为了获取其他类中的某个功能而去继承该类。
子类成员与父类成员的特点
当子类继承后子类成员变量或方法中存在与父类相同的变量名,这时我们调用该方法名到底是调用子类中的方法还是父类中的方法呢?其实调用成员遵循就近原则,即子类中有的之间调用子类中的,子类中找不到的去父类找。
public class 继承 {
public static void main(String[] args) {
zi z=new zi();
z.show(); //结果为:zi 20
}
}
class fu{
int num=10;
void show(){
System.out.println("fu "+num);
}
}
class zi extends fu{
int num=20;
void show(){
System.out.println("zi "+num);
}
}
若子类中存在和父类相同的变量名时,我们又想调用父类的变量该怎么办呢?
其实我们可以用super关键字。super和this的用法相似,this:代表本类的对象引用。super:代表的父类内存 空间,而不是父类的引用。
成员方法特殊情况——覆盖
子类中出现与父类一模一样的方法时,会出现覆盖操作,也称为override重写、复写或 者覆盖 。
当子类需要父类的功能,而功能主体子类有自己特有内容时,可以复写父类中的方法, 这样,即沿袭了父类的功能,又定义了子类特有的内容。
重写需要注意的细节问题
1. 子类方法覆盖父类方法,必须要保证权限大于等于父类权限
2. 静态只能覆盖静态,或者被静态覆盖,意思就是 静态函数不存在重写!
3. 写法上稍微注意:必须一模一样:函数的返回值类型 函数名 参数列表都要一样
总结: 当一个类是另一个类中的一种时,可以通过继承,来扩展功能 如果父类具备的功能内容需要子类特殊定义时,使用重写
子父类中构造函数的特点
在创建子类对象时,父类的构造函数会先执行,因为子类中所有构造函数的第一行有默 认的隐式super();语句,调用本类中的构造函数用this(实参列表)语句,调用父类中的构造函 数用super(实参列表)。
注意: 类中的构造函数默认第一行都有隐式的super()语句,在访问父类中的构造函数。所以 父类的构造函数既可以给自己的对象初始化,也可以给自己的子类对象初始化。如果默认的 隐式super语句没有对应的构造函数,必须在构造函数中通过this或者super的形式明确调用 的构造函数
public class 继承 {
public static void main(String[] args) {
zi z=new zi();
z.show();
}
}
class fu{
fu(){
System.out.println("父类构造方法");
}
int num=10;
void show(){
System.out.println("fu"+num);
}
}
class zi extends fu{
zi(){
System.out.println("子类构造方法");
}
void show(){
System.out.println(num);
}
}
输出结果为:
父类构造方法
子类构造方法
10