一、继承
继承:java针对多个类中有相同的部分的话,可以将相同的部分提取出来,单独放到一个类中A,然后其他类与这个A类产生一个关系,这样的话,其他的类中就有了A类中的属性或行为。这个关系叫做继承,java提供了一个关键字extends来表示继承关系。
继承的好处:
1.提高了代码的复用性:多个类相同的成员可以放到同一个类中。
2.提高了代码的维护性:如果功能的代码需要修改,修改一处即可。
3.让类与类之间产生了关系,是多态的前提:这也是继承的一个弊端(类的耦合性很强)。
注意事项:
1.子类无法继承父类中的构造方法。
2.java中的类与类之间的继承,不允许出现子类同时继承多个父类的情况,只允许单继承。
3.Java中的类与类之间的继承,运行多重继承,形成继承体系。
4.java中子类无法继承父类中的私有成员。
5.不要为了部分功能而去继承。
二、this和super
继承与成员变量的关系:就近原则
用法:
访问成员变量:
this.成员变量 super.成员变量
访问构造方法(子父类的构造方法问题):
this(……) super(……)
访问成员方法()
this.成员方法() super.成员方法()
例子
class Fu2{
int a = 10;
public void show1(){
int a = 40;
}
}
class Zi2 extends Fu2{
int a = 20;
public void fun1(){ // 无法访问到父类中方法中的变量
int a = 30;
System.out.println(a); // 获取的是当前方法中的局部变量a:30
//需求1:在不创建对象的前提下获取子类中成员变量a:20
System.out.println(this.a);
//需求2:在不创建父类对象的前提下获取父类中成员变量a:10
//java提供了一个关键字表示父类的引用:super
//将来在子类中可以使用super关键字调用父类中的所有非私有的成员
System.out.println(super.a);
}
}
public class ExtendsDemo3 {
public static void main(String[] args) {
Zi2 zi2 = new Zi2();
zi2.fun1();
}
}
三、初始化
1.要想初始化子类,必须先初始化其直接父类。
2.子类的构造方法第一句话默认是super()。
3.java中的类只能进行一次初始化,不允许重复初始化。
class Fu3 {
// Fu3(){
// System.out.println("这是父类中的无参构造方法。。。");
// }
Fu3(String s) {
System.out.println("数加 " + s);
}
}
class Zi3 extends Fu3 {
Zi3() {
//方案1:当父类中没有无参构造方法的时候,使用super关键字调用其直接父类中的其他构造方法,完成父类初始化
// super("java");
// super(); // Fu3();
//方案2:间接地调用父类的有参构造方法,完成父类的初始化
this("java");
System.out.println("这是子类中的无参构造方法。。。");
// super(); // 不允许重复初始化
}
Zi3(String s){
super(s);
System.out.println("这是子类中的有参构造方法。。。");
}
}
public class ExtendsDemo4 {
public static void main(String[] args) {
Zi3 zi3 = new Zi3();
}
}
四、继承与成员方法的关系
1.子类访问成员变量方法遵循就近原则。
2.方法的重写(子类中出现了和父类中一模一样的方法声明(返回值类型,方法名,参数列表都和父类一模一样))。