撰写时间:2019年04月17日
继承是Java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。
继承就是子类继承父类的特征和行为,使得子对象(实例)具有父类的实例域和方法,
或子类从父类继承方法,使得子类具有父类相同的行为。
继承格式:
在Java中通过extends关键字申明一个类继承与另外一个类,一般格式如下:
class 父类 {
}
class 子类 extends 父类 {
}
为什么需要用继承?在正常的情况下,我们编写代码,是会出现代码重复的,这就会导
致后果代码量大且臃肿,而且维护性不高。所以要解决这个代码问题就需要用到继承,
将相同代码部分提取出来组成一个父类,后面需要用到就直接继承父类用需要的那部分。
这样维护性也提高了,代码也简洁,提高代码的复用性。
注意:Java不支持多继承,但支持多重继承
单继承:A<——B
class classA{
}
class classB extendsclassA{
}
多重继承:A<——B<——C 间接继承
class classA{
}
class classB extends classA{
}
class classC extends classB{
}
不同类继承同一个类:A<——B,A<——C
class classA{
}
class classB extends classA{
}
class classC extends classA{
}
不支持多继承
class classA{
}
class classB{
}
class classC extends classA,B{
}
注意:这个多继承是不支持的。
简单示例:
简单的继承
public class ExtendsDemo1 {
public static void main(String[] args) {
BaseClassB baseClassB=new BaseClassB();
System.out.println(baseClassB.intA);
baseClassB.print();
}
}
class BaseClassA{
int intA=100;
public void print() {
System.out.println("-----BaseClassA----");
}
}
class BaseClassB extends BaseClassA{
}
这里可以看到,在BaseClassB里面是什么都没写的,而上面实例化的就是
BaseClassB,而且还输出intA跟print(),而这两个都是BaseClassA的东西,
这就是用到了关键字extends 让BaseClassB从BaseClassA继承到了变量和方
法,然后BaseClassB就可以调用它们。
ExtendsDemo2 原代码数据
public class ExtendsDemo2 {
public ExtendsDemo2() {
System.out.println("ExtendsDemo2 构造器");
}
int weight=0;
//private 成员变量
private int intPrivate=10;
//-方法
public void fly() {
System.out.println("它是猪,它可以飞");
}
public void eatting() {
System.out.println("....吃....蕉啦");
}
public static void print() {
System.out.println("print");
}
}
输出ExtendsDemo2
public class Demo1 {
public static void main(String[] args) {
ExtendsDemo2 extendsDemo2=new ExtendsDemo2();
extendsDemo2.weight=9;
System.out.println(extendsDemo2.weight);
extendsDemo2.fly();
extendsDemo2.eatting();
}
}
多重继承
ExtendsDemo3 继承ExtendsDemo2 ,ExtendsDemo3 没有自己的变量、方法
public class ExtendsDemo3 extends ExtendsDemo2{
}
然后ExtendsDemo4再来继承ExtendsDemo3 ,这时候ExtendsDemo4就通过了
ExtendsDemo3 继承到了ExtendsDemo2的变量方法。
public class ExtendsDemo4 extends ExtendsDemo3 {
int a = 0;
public ExtendsDemo4() {
this.a = 10;
System.out.println("Ostrch 构造器");
}
// 重写fly方法
public void fly() {
super.fly();// (1)重写了父类的方法又想调用父类的方法就是用super
System.out.println("虽然它是猪,但它不会飞");
privateMethod();
}
public static void print() {
System.out.println("Ostrch print");
}
private void privateMethod() {
System.out.println("privateMethod");
}
}
可以对ExtendsDemo2的方法进行重写,重写是子类对父类的允许访问的方法的实现过
程进行重新编写, 返回值和形参都不能改变。 它的好处就是子类可以根据自己的需要,
定义特定于自己的行为。 也就是说子类能够根据 需要实现父类的方法。重写方法不能
抛出新的检查异常,或比被重写方法更加宽泛的异常。
public class Demo1 {
public static void main(String[] args) {
ExtendsDemo4 extendsDemo4=new ExtendsDemo4();
extendsDemo4.weight=50;
System.out.println(extendsDemo4.weight);
extendsDemo4.fly();
extendsDemo4.eatting();
ExtendsDemo3.print();
ExtendsDemo4.print();//静态要大写
}
}
ExtendsDemo4 多重继承ExtendsDemo2 的方法flu(),将它重写输出。
任何一个类都是有父类的,哪怕没写继承,都有一个公共的父类,哪怕间接继承,都是
从object类继承下来,任何类直接或间接继承object类,object是根类