1. 继承(extends)
1.1 继承概述
将两个类中相同的部分拿出来,创造一个新的类,前两个类就少了一部分,需要和新类建造一个新的关系,这个关系就是继承关系;
继承是面向对象三大特征之一:可以使子类具有父类的属性和方法;
1.2 继承的实现
格式: public class 子类名 extends 父类名{}
范例:public class Zi extends Fu{}
Fu:是父类,也被称为基类、超类
Zi:是子类,也被称为派生类
子类的特点:
子类可以有父类的内容
子类可以使用自己特有的内容
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class Teacher extends Person {
public void teach(){
System.out.println("教书育人");
}
}
public class Student extends Person{
public void study(){
System.out.println("努力学习");
}
}
public class ExtendsTest {
public static void main(String[] args) {
Person person = new Person();
// Student对象
Student student = new Student();
// Teacher
Teacher teacher = new Teacher();
//给以上对象赋予属性值
person.setName("黄帝");
person.setAge(100);
student.setName("张三");
student.setAge(20);
teacher.setName("老张");
teacher.setAge(50);
// 获取对象的属性
System.out.println(person.getName() +"---"+person.getAge());
System.out.println(student.getName()+"----"+student.getAge());
System.out.println(teacher.getName()+"----"+teacher.getAge());
}
}
通过extends可以使student、teacher、person之间产生一种关系,这种关系被称之为继承。
在继承关系中,子类可以继承父类的成员同时可以拥有自己特有的成员
类的构成:
成员属性
成员方法
构造方法
子类继承父类:
1. 可以继承使用public修饰的成员方法,如果方法内涉及私有的属性,也可以通过方法来使用该属性
2. 对于成员属性的继承,只能继承非私有的成员属性
继承影响:
继承使类与类之间产生关系,子类可以使用父类的非私有成员
子类继承父类非私有的方法和属性
子类可以使用父类中定义的方法和属性,也可以创建新的数据和方法
继承的关键字是“extends”,子类不是父类的子集,而是对父类的“扩展”
规则:
子类不能直接访问父类中私有的成员变量和方法,但如果public方法内涉及私有的属性,也可以通过方法来使用该属性。
好处:
1. 提高代码的复用性;
2. 提高代码的维护性,当父类修改后,子类也能产生相应的变化。
弊端:
继承是类与类之间产生了关系,是的类与类之间的耦合度增强了。是的子类的独立性减弱。在面向对象程序设计中,有一个默认的原则:高内聚,低耦合。
使用继承的情况:
继承体现的是一种is a的关系。子类是父类的 一种。只有当子类和父类真实的存在这种is a的关系,才可以使用继承来提高代码的复用行和可维护性。
不要为了继承而继承
2.子类继承父类的成员变量的访问
使用父类和子类同名的成员变量
首先在当前类中寻找,如果当前类中没有,则去父类中寻找,如果子类和父类都没有就会报错。
public class Zi extends Fu{
//public int num = 20;
public void show(){
System.out.println("子类的show方法");
System.out.println(num);
}
}
public class Fu {
public int num= 10;
public void show(){
System.out.println("父类的show方法");
System.out.println(num);
}
}
public class ExtendsVarTest {
public static void main(String[] args) {
Fu f = new Fu();
Zi z = new Zi();
f.show();//10
z.show();//20
}
}
super
super和this的意思基本相同:
this代表的是本类的当前对象,通过this可以调用苯类的成员变量和方法
super代表的是父类的当前对象,通过super可以调用父类的成员变量和方法。
public void show(){
System.out.println("子类的show方法");
System.out.println(super.num);
super.show();
}
此时使用super去主动调用父类的成员变量和方法;
子类和父类构造方法的访问
当我们去创建子类的对象的时候,首先会调用父类的构造方法来创建一个隐含的父类对象
创建父类隐含对象的意义就在于我们有可能会在子类中去调用父类的成员
在创建子类对象时,会默认调用父类的无参构造创建隐含的父类对象
public Zi(int num){
super(num);//通过 super调用父类的构造方法
System.out.println("子类的 构造方法被调用");
}
通过super去显示的调用父类的构造方法,必须出现在子类构造方法的第一行;
子类在创建对象的构造方法,会默认调用父类的同型构造方法;
public Zi(){
super();// 在子类的构造方法中 隐含这这样的调用语句
}
在子类中调用构造方法的时候 this和super不能同时出现.
因此在定义一个类的时候 ,如果要编写构造方法,一定要将类的默认无参构造手动的写出来
Super的内存区域
对象在堆内存中,会单独存在一块super区域,用来存放父类的数据