一、继承概述:
1.多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。
2.通过extends关键字可以实现类与类的继承。
格式:class 子类名 extends 父类名{}
3.单独的这个类称为父类、基类、超类,这多个类可以称为子类或者派生类。
4.有了继承以后,我们定义一个类的时候,可以在一个已经存在的类的基础上,还可以定义自己的新成员。
//继承实例
package test3;
import java.util.*;
class Student extends Person{
Student(){
}
}
class Teacher extends Person{
Teacher(){
}
}
class Person{
public void eat(){
System.out.println("我要吃饭");
}
public void sleep(){
System.out.println("我要睡觉");
}
}
public class Example2_3 {
public static void main(String[] args) {
Student stu = new Student();
stu.eat();
stu.sleep();
System.out.println("---------------");
Teacher tea = new Teacher();
tea.eat();
tea.sleep();
}
}
二、继承的好处:
1.提高了代码的复用性。多个类相同的成员可以当到同一个类中。
2.提高了代码的维护性。如果功能的代码需要修改,修改一处即可。
3.让类与类之间产生了关系,是多态的前提,其实这也是继承的一个弊端,类的耦合性很强。
三、继承的特点:
1.Java只支持单继承,不支持多继承,有些语言是支持多继承的。
2.Java支持多层继承(继承体系)
四、注意事项:
1.子类只能继承父类所有非私有的成员(成员变量、成员方法)其实也体现了继承的另一个弊端:打破了封装性。
class Father{
private int num = 10;
public int num1 = 20;
private void method(){
System.out.println(num);
System.out.println(num1);
}
public void show(){
System.out.println(num1);
System.out.println(num1);
}
}
class Son extends Father{
public void function(){
//System.out.println(num1);//不能访问私有成员变量
System.out.println(num1);
}
}
public class Example2_4 {
public static void main(String[] args) {
Son sc = new Son();
//sc.method();//不能访问私有成员方法
sc.show();
}
}
2.子类不能继承父类的构造方法,但是可以通过super关键字去访问父类的构造方法。
3.不要为了部分功能而去继承。
class A{
public void show1(){}
public void show2(){}
}
class B{
public void show2(){}
public void show3(){}
}
//我们发现B类出现了和A类一样的show2()方法,所以,用继承来体现
class B extends A{
public void show3(){}
}
//其实这样不好,因为这样你不但有了show2(),还多了show1(),有可能show1()不是你想要的。
4.我们到底在什么时候使用继承呢?
继承中之间体现的是“is a”的关系,采用假设法:如果有两个类A,B,只有他们符合A是B的一种或B是A的一种,就可以考虑继承。
五、继承中成员变量的关系:
案例演示:子类中同名和不同名的成员变量
class Father{
public int num1 = 10;
}
//子类中的成员变量和父类中的成员变量名称不一样
/*class Son extends Father{
public int num2 = 20;
public void show(){
System.out.println(num1);//num1=10
System.out.println(num2);//num2=20
}
}*/
//子类中的成员变量和父类中的成员变量名称不一样
class Son extends Father{
public int num1 = 20;
public int num2 = 40;
public void show(){
System.out.println(num1);//num1=20
System.out.println(num2);//num2=40
}
}
public class Example2_5 {
public static void main(String[] args)
{
//创建对象
Son sc = new Son();
sc.show();
}
}
小总结:
1.首先在子类方法中访问一个变量;
2.然后在子类局部范围找;
3.最后在父类局部范围找(肯定不能访问到父类局部变量);
4.如果还是没有就报错(不考虑父亲的父亲)