继承:是面向对象的三大特征之一,可以使子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法。
格式:public class 子类名 extends 父类名{ }
父类:又称为基类、超类,子类:又称为派生类
继承中子类的特点:子类可以有父类的内容,子类也可以有自己特有的内容;
继承的好处:
(1)提高了代码的复用性(多个类相同的成员可以放到同一个类中);
(2)提高了代码的维护性(方法的需要修改时,只需要修改父类中的一处即可);
继承的弊端:削弱了子类的独立性
当两个类A和B,满足A是B的一种时,或者B是A的一种时,就说明他们存在继承关系,这个时候可以考虑用继承来实现,否则不能滥用继承。
举例:苹果和水果,猫和动物,iPad和计算机等
继承中变量的访问特点:
在子类方法中访问一个变量时,首先是在子类方法的局部范围内找,然后在子类成员范围内找,最后在父类成员范围内找。如果父类中没有就会报错,注意不考虑父类的父类......
super关键字:
super关键字的用法和this关键字的用法相似,this代表本类对象的引用,super代表对父类对象的引用。
关键字 | 访问成员变量 | 访问构造方法 | 访问成员方法 |
this | this.成员变量 访问本类成员变量 | this(...) 访问本类构造方法 | this.成员方法(...) 访问本类成员方法 |
super | super.成员变量 访问父类成员变量 | super(...) 访问父类构造方法 | super.成员方法(...) 访问父类成员方法 |
继承中构造方法的访问特点:
子类中所有的构造方法默认都会访问父类中无参的构造方法,因为子类会继承甚至是有父类中的数据,所以在子类初始化之前都需要先完成父类数据的初始化,可以理解为每个子类构造方法的额第一条语句默认为super()。
如果父类中没有无参构造方法,只有带参构造方法,可以通过(1)使用super关键字去调用父类的带参构造方法;(2)在父类中提供一个无参构造方法,更推荐后者。
继承中成员方法的访问特点:
通过子类对象访问一个方时,首先是在子类成员范围(子类成员方法)内找,然后在父类成员范围(父类成员方法)内找。如果父类中没有就会报错,注意不考虑父类的父类......
方法重写:
方法重写就是子类中出现了和父类中一模一样的方法声明,当子类需要父类的功能,而功能主题子类有自己特有的内容时,可以重写父类中的方法,这样既沿袭了父类的功能,又定义了子类特有的内容。
@Override:是一个注解,可以帮助我们检查重写方法的方法声明的正确性。
示例:
public class Phone {
public Phone(){
System.out.println("调用Phone的构造方法!");
}
public void call(String name){
System.out.println("给"+name+"打电话!");
}
}
public class NewPhone extends Phone {
public NewPhone(){
System.out.println("调用NewPhone的构造方法!");
}
@Override
public void call(String name){
System.out.println("开启视频功能!");
super.call(name);
}
}
public class Phone_test {
public static void main(String[] args) {
Phone p = new Phone();
NewPhone np = new NewPhone();
String name = "pjh";
p.call(name);
System.out.println("============");
np.call(name);
}
}
方法重写的注意事项:
(1)父类中的私有方法不能被重写(父类的私有成员子类是不能被继承的)
(2)重写方法时,子类方法的访问权限应该比父类方法的访问权限高(publi>默认>私有)
Java中继承的注意事项:
Java中类只支持单继承,不支持多继承,但是支持多层继承。
person-teacher-studen案例:
package extend_practice;
//person class
public class person {
private String name;
private String age;
public person() {
System.out.println("调用person类!");
}
public person(String name, String age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
package extend_practice;
//teacher class
public class teacher extends person {
public teacher(){
System.out.println("调用teacher类!");
}
public void teach(){
System.out.println("春蚕到死丝方尽,蜡炬成灰泪始干。");
}
}
package extend_practice;
//student class
public class student extends teacher {
public void learn(){
System.out.println("好好学习,天天向上!");
}
}
package extend_practice;
//person-teacher-student test class
public class per_tea_stu_test {
public static void main(String[] args) {
teacher tea = new teacher();
tea.setName("ljt");
tea.setAge("50");
System.out.println("teacher:"+tea.getName()+", "+"age:"+tea.getAge());
student stu = new student();
stu.setName("tjs");
stu.setAge("22");
System.out.println("student:"+stu.getName()+", "+"age:"+stu.getAge());
tea.teach();
stu.learn();
stu.teach();
}
}