面向对象语言的三大特性继承、封装、多态,本篇文章讲解继承的相关内容。
一、基础内容
(1)定义:继承是面向对象三大特性之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,追加属相和方法。
java中类只支持单继承,不支持多继承;
java中类支持多层继承。
(2)格式
public class 子类名 extends 父类名()
举例如下:
/*
* 父类
* */
public class Person {
String name;
int age;
String sex;
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
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 void self_Introduction(String sex,String name,int age){
System.out.println("本人叫"+name+","+sex+"今年"+age+"岁!");
}
}
/*
* 子类1
* */
public class Woman extends Person {
public void selfclass(){
System.out.println("真好!");
}
}
/*
* 子类2
* */
public class Man extends Person {
public void selfclass(){
System.out.println("真好!");
}
}
简单编写了父类方法Person,然后分别写了两个子类方法Man、Woman继承父类,子类中没有其他任何变量和方法,接下来写个测试类,看看效果
/*
* 测试类
* */
public class Demo {
public static void main(String[] args) {
Man man = new Man();
man.self_Introduction("男","张三",22);
man.selfclass();
Woman woman = new Woman();
woman.self_Introduction("女","小红",23);
woman.selfclass2();
}
}
这里要总结一下子类的特点:
①子类可以调用父类的方法
②子类可以有自己的方法
(3)优点
①提高代码的复用性(多个类相同的成员可以放到同一个类中)
②提高了代码的维护性(如果方法代码需要修改,修改一处即可)
(4)弊端
继承让类与类之间产生了关系,类的耦合性增强了,当父类发生改变时子类的实现也不得不跟着改变,削弱了子类的独立性。
(5)什么时候用继承
继承体现的是is-a(水果和苹果,动物和绵羊)的关系,只有当两个类A和B满足,A是B的一种或者B是A的一种,就说明他们存在继承关系,这个时候就可以考虑使用继承实现,否则就不能滥用继承。
(6)继承中变量访问的特点
在子类方法中访问一个变量
首先在子类局部(方法内)范围找
然后在子类成员(子类中)范围找
最后到父类程艳范围找
若找不到则报错(比考虑父类的父类)
(7)super关键字
super关键字的用法和this关键字的用法相似
this:代表本类对象的引用
super:代表父类存储空间的标识(可以理解为父类对象的引用)
举个例子
/*
* 父类
* */
public class Person {
public int a = 1;
}
/*
* 子类
* */
public class Man extends Person {
public int a = 2;
public void selfclass(){
System.out.println(super.a);
System.out.println(a);
}
public static void main(String[] args) {
Man man = new Man();
man.selfclass();
}
}
一个简单的小例子,就可以看出super的实际作用,super和this一样,作用的范围
二、继承中构造方法和成员方法访问特点
(1)构造方法
子类中所有的构造方法默认都会访问父类中无参的构造方法。
为什么?
①因为子类会继承父类中的数据,可能还会使用父类的数据,所以,子类初始化之前,一定要先完成父类数据的初始化。
②每一个子类构造方法的第一次语句默认是:super()
如果父类中没有无参构造方法,只有带参构造方法,该怎么办?
①通过使用super关键字去显示的调用父类的类参构造方法。
②在父类中自己提供一个无参构造方法(推荐使用)。
(2)成员方法
继承中成员方法的访问特点与继承中变量访问的特点有些类似。
通过子类对象访问一个方法时
①子类成员范围找
②父类成员范围找
如果都没有就报错(不考虑父类的父类)
三、重写
方法的重写:子类中出现和父类中一模一样的方发声明。
应用:
当子类需要父类的功能,而功能主体类有自己特有的内容,可以重写父类中的方法,这样,即沿袭了父类的功能,有定义了子类特有的内容。
@Override这个注解可以帮助检查重写方法的方发声明的正确性。
举个例子
/*
* 父类
* */
public class Person {
public void abc(){
System.out.println("111");
}
}
/*
* 子类
* */
public class Man extends Person {
@Override
public void abc(){
System.out.println("1111");
}
}
特殊说明:
①私有方法不能被重写(父类私有成员子类是不能继承的)。
②子类重写的方法访问权限不能低与父类中方法的访问权限(public>默认>private )
综上所述,就是对继承的学习记录!
下一节: 面型对象语言的三大特性之多态