1.简介
面向对象语言中的三大特性:继承、封装、多态。继承作为三大特性之一,可以降低代码编写的冗余度,提高编程的效率。通过继承,子类获得了父类的成员变量和方法。然而一个子类如何继承父类的变量和方法,如何修改从父类继承过来的子类方法呢?
为什么要使用继承? 我理解的是不同的类之间可能会存在重复相似的属性或是方法,如果编写完一个类中的属性或是方法,而另一个类中也需要这些属性和方法难免需要重新写一遍,一个是太过于麻烦,而且代码的冗余率会很高,而继承就是解决这个问题的。不需要重新编写,只需加上继承的关系,就可以调用父类中的方法。实现代码的重用,提高程序的可维护性,节省大量创建新类的时间,提高开发效率和开发质量。
2.结构
class father{
//父类的变量和方法
}
class son extends father{
//子类的方法和变量
}
子类调用父类的方法时:
class Parent{//父类
int ret = 0;
public int testRet(int n){
System.out.println(n);
return n;
}
}
class Son extends Parent{//子类
}
public class Main1 {
public static void main(String[] args){
Son son = new Son();
son.testRet(son.ret);//子类调用父类的方法和参数
}
}
最后输出的结果就是 0。
3. 使用继承注意的点
a.Java 不支持多重继承,子类只能继承一个父类,但是一个父类可以有多个子类。
b.父类中的构造方法不能被子类继承,但是可以被子类调用,在子类创建的时候,父类的构造函数就会被调用。
c.可以在子类中编写一个父类当中具有相同名的新实例方法,这称为“方法重写”。
d.子类中可以创建父类中没有的方法和变量。
4.方法的重写
当一个子类中的一个方法具有与其父类中的一个实例方法相同的名称、参数个数和类型和返回值时,称子类中的方法“重写”了父类的方法。例如:
public class Main1 {
public static void main(String[] args) {
Son son = new Son();
son.testExt2();//调用父类的方法
son.testExt1();//调用的是自己重写的方法
}
}
class Parent{
public void testExt1(){
System.out.println("快去写作业!");
}
public void testExt2(){
System.out.println("写完吃好吃的。");
}
}
class Son extends Parent{
public void testExt1(){//方法的重写
System.out.println("不想写作业!");
}
}
返回的结果是:
5. 父类与子类权限问题
子类继承其父类的所有public和protected成员,但不能继承其父类的private成员。那么如何在子类中访问到父类中的私有字段呢?我们可以在父类中提供用来访问其私有字段的public或protected方法,子类使用这些方法来访问父类中的private成员。比如:
public class Main1 {
public static void main(String[] args) {
Son son = new Son();
System.out.println(son.testExt1());//调用父类的函数,返回其私有成员变量
}
}
class Parent{
private int val = 8;
public int testExt1(){
return val;
}
}
class Son extends Parent{
}