之前的文章我们介绍了一下 Java 中的引用型数组类型,接下来我们再来看一下 Java 中的继承。

继承的概念

继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。

继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

在日常生活中,我们会养些猫和狗,从程序的角度讲猫和狗都属于对象,那么我们就可以根据其特性来定义,如下:

 class Dog extends Animal {
String name;
String color;
int age; void run() {
System.out.println("我可以跑");
} void lookDoor() {
System.out.println("我可以看门");
}
} class Cat {
String name;
String color;
int age; void run() {
System.out.println("我可以跑");
} void catchMouse() {
System.out.println("我可以抓老鼠");
}
}

我们在定义 Dog 和 Cat 类的时候发现它们绝大部分属性和方法是相同的。那这样的话我们再定义其他动物的时候同样会出现这种气矿,这就造成了大量代码的重复,造成程序臃肿,不易维护。

我们可以这样解决上面的问题,将 Dog 和 Cat 类里相同的属性和方法写到一个父类里,自己特有的方法在自己的类里完成,这样就可以有效的解决上面的问题,其实这就是 Java 类的继承,如下:

 public class HelloWorld {
public static void main(String[] args) {
Dog dog = new Dog();
dog.run(); // 我可以跑
dog.lookDoor(); // 我可以看门 Cat cat = new Cat();
cat.run(); // 我可以跑
cat.catchMouse(); // 我可以抓老鼠
}
} class Animal{
String name;
String color;
int age; void run() {
System.out.println("我可以跑");
}
} class Dog extends Animal {
void lookDoor() {
System.out.println("我可以看门");
}
} class Cat extends Animal {
void catchMouse() {
System.out.println("我可以抓老鼠");
}
}

在上面的代码中,我们定义类一个 Animal 类,里面定义了 Dog 和 Cat 类中相同的属性和方法,然后我们在定义 Dog 和 Cat 类的时候通过  extends Animal 的方式来继承 Animal 类,当我们继承 Animal 类的时候,Animal 类中的属性和方法就会被一并继承过来,这样我们在声明 Dog 和 Cat 类的时候便可以调用从 Animal 类及成果来的属性和方法,这就是继承。

继承:

1、目的:避免代码重复,有利于代码的重用

2、通过 extends 实现继承

3、父类:所有子类所用共有的属性和方法;子类:子类所特有的属性和方法

4、子类继承父类后,子类具有 子类+父类 的属性和方法

5、一个父类可以有多个子类,一个子类只能有一个父类-----单一继承

6、继承具有传递性

7、Java 规定:构造子类之前必须先构造父类,子类构造中若没有调用父类的构造,则默认super(),若自己调了,则不再默认提供。

在上面的5,6条我们可以看出,在写程序时,我们不能这样  class Dog extends Cat extends Animal 的形式来实现继承,这样会出现编译错误,但是我们可以通过  class Cat extends Animal  class Dog extends Cat 的形式来逐层进行继承。

在上面的代码中我们已经了解了 Java 的继承,接下来我们在结合之前说到的构造方法来介绍一下 super

 public class HelloWorld {
public static void main(String[] args) {
Dog dog = new Dog();
dog.run(); // 我可以跑
dog.lookDoor(); // 我可以看门
dog.name = "旺财";
dog.color = "黄色";
dog.age = 8;
System.out.println("我叫" + dog.name + ",今年" + dog.age + ",是" + dog.color + "的"); // 我叫旺财,今年8,是黄色的 Cat cat = new Cat("咪咪", "白色", 5);
cat.run(); // 我可以跑
cat.catchMouse(); // 我可以抓老鼠
System.out.println("我叫" + cat.name + ",今年" + cat.age + ",是" + cat.color + "的"); // 我叫咪咪,今年5,是白色的
}
} class Animal {
String name;
String color;
int age; Animal() { } Animal(String name, String color, int age) {
this.name = name;
this.color = color;
this.age = age;
} void run() {
System.out.println("我可以跑");
}
} class Dog extends Animal {
Dog() {
super();
} void lookDoor() {
System.out.println("我可以看门");
}
} class Cat extends Animal {
Cat(String name, String color, int age) {
super(name, color, age);
} void catchMouse() {
System.out.println("我可以抓老鼠");
}
}

在上面的代码中,我们在父类 Animal 类中分别定义了一个无参构造和一个有参构造,在子类 Dog 中定义了一个无参构造,在子类 Cat 中定义类一个有参构造,我们发现,在子类的构造方法中我们添加了一个 super() 的方法,通过这种方法我们就可以继承来自父类的构造方法,从而在实例化我们的子类的时候初始化我们想要的参数,在继承父类的有参构造的时候需要将父类有参构造的参数传递进来。

接下来我们来看下面的代码:

 public class HelloWorld {
public static void main(String[] args) {
Dog dog1 = new Dog();
Dog dog2 = new Animal(); // 编译错误
Animal animal1 = new Animal();
animal1.run(); // 我可以跑
animal1.lookDoor(); // 编译错误
Animal animal2 = new Dog();
animal2.run(); // 我可以跑
animal1.lookDoor(); // 编译错误
}
} class Animal {
String name;
String color;
int age; Animal() { } Animal(String name, String color, int age) {
this.name = name;
this.color = color;
this.age = age;
} void run() {
System.out.println("我可以跑");
}
} class Dog extends Animal {
Dog() {
super();
} void lookDoor() {
System.out.println("我可以看门");
}
}

在上面的代码中,我们如果通过 new Dog() 来创建一个 Dog 对象是完全没有问题的,通过 new Animal() 来创建一个 Animal 对象也是没有问题的,但是通过 new Animal() 来创建一个 Dog 对象会编译错误,通过 new Dog() 来创建一个 Animal 对象也是没有问题的,我们可以这样理解,new 类名() 所指向的类必须是本类或父类,不能是子类,即等号左侧的类型必须大于或等于等号右侧的 new 出来的类。当大于时我们称之为向上造型。向上造型后  子类 将不再具备其自己定义的方法,只有父类的方法。

Java 从入门到进阶之路(十)的更多相关文章

  1. Java 从入门到进阶之路(十二)

    在之前的文章我们介绍了一下 Java 类的重写及与重载的区别,本章我们来看一下 Java 类的 private,static,final. 我们在之前引入 Java 类概念的时候是通过商场收银台来引入 ...

  2. Java 从入门到进阶之路(十五)

    在之前的文章我们介绍了一下 Java 中的接口,本章我们来看一下 Java 中类的多态. 在日常生活中,很多意思并不是我们想要的意思,如下: 1.领导:“你这是什么意思?” 小明:“没什么意思,意思意 ...

  3. Java 从入门到进阶之路(十四)

    在之前的文章我们介绍了一下 Java 中的抽象类和抽象方法,本章我们来看一下 Java 中的接口. 在日常生活中,我们会接触到很多类似接口的问题,比如 USB 接口,我们在电脑上插鼠标,键盘,U盘的时 ...

  4. Java 从入门到进阶之路(十六)

    在之前的文章我们介绍了一下 Java 中类的多态,本章我们来看一下 Java 中类的内部类. 在 Java 中,内部类分为成员内部类和匿名内部类. 我们先来看一下成员内部类: 1.类中套类,外面的叫外 ...

  5. Java 从入门到进阶之路(十九)

    在之前的文章我们介绍了一下 Java 中的Object,本章我们来看一下 Java 中的包装类. 在 Java 中有八个基本类型:byte,short,int,long,float,double,ch ...

  6. Java 从入门到进阶之路(二十)

    在之前的文章我们介绍了一下 Java 中的包装类,本章我们来看一下 Java 中的日期操作. 在我们日常编程中,日期使我们非常常用的一个操作,比如读写日期,输出日志等,那接下来我们就看一下 Java ...

  7. Java 从入门到进阶之路(二十二)

    在之前的文章我们介绍了一下 Java 中的  集合框架中的Collection 中的一些常用方法,本章我们来看一下 Java 集合框架中的Collection 的迭代器 Iterator. 当我们创建 ...

  8. Java 从入门到进阶之路(十八)

    在之前的文章我们介绍了一下 Java 中的正则表达式,本章我们来看一下 Java 中的 Object. 在日常生活中,任何事物我们都可以看做是一个对象,在编程中是同样的道理,在 Java 编程中其实更 ...

  9. Java 从入门到进阶之路(二十四)

    在之前的文章我们介绍了一下 Java 中的  集合框架中的Collection 的泛型,本章我们来看一下 Java 集合框架中的Collection 的子接口 List. Collection 接口有 ...

随机推荐

  1. Flask:数据库的建模

    学习完模板系统,接下来要研究的就是框架对数据库的操作,不论python的那个框架,直接使用数据库API(redis.pymysql等)都可以进行操作,但是这些操作不够方便,于是就有了ORM 1.Fla ...

  2. IndentationError: unindent does not match any outer indentation level笔记

    执行一个Python脚本的时候,报"IndentationError: unindent does not match any outer indentation level" 错 ...

  3. 洛谷P5522 【[yLOI2019] 棠梨煎雪】

    区间操作考虑用线段树维护. 建\(n*2\)棵线段树,前\(n\)棵线段树维护每个串的第i位是否是0. 后\(n\)棵线段树维护每个串的第i位是否是1. 如果是问号的话,直接跳过就好(通过1和0能看出 ...

  4. Ubuntu 18.04 下安装pip3及pygame模块

    1.Ubuntu下pip3的安装.升级.卸载 安装pip3 sudo apt-get install python3-pip 升级pip3 sudo pip3 install --upgrade pi ...

  5. [考试反思]1101csp-s模拟测试97:人品

    上来粘6个图皮一下.(以后粘排行榜是不是都应该粘两份啊...文件出入的确挺难受的) 话说最近RP为什么会这么高啊???我干什么好事了???不知道. 这次考试的题挺有水准的,但是我的分数挺没水准的. T ...

  6. 「刷题」Triple

    正解是普通型母函数+FFT. 才学了多项式,做了一道比较好的题了. 首先有三个斧子被偷了. 我们考虑构造一种普通型母函数. 就是说一种多项式吧,我的理解. 系数是方案,下标,也就是所谓的元指数代表的是 ...

  7. php 全文搜索搜索-讯搜使用

    相信很多朋友遇到过,需要全文搜索的场景,百度了一圈发现了一个xunsearch 首先本地采集了1万篇文章,发现效率还可以. 使用上也很简单,直接上代码 //接收关键词 $xs = new XS('xp ...

  8. 2019年10月11号 王庆超 linux

    1.计算机操作系统简介 (1)掌握操作系统的定义:操作系统是一个用来协调.管理和控制计算机硬件和软件资源的系统 程序,它位于硬件和应用程序之间. (2)掌握操作系统的内核的定义:操作系统的内核是一个管 ...

  9. JavaScript 弹出框:警告(alert)、确认(confirm)的简单写法

    onclick="javascript:return window.confirm('message')"

  10. 深入理解 PHP 的 7 个预定义接口

    深入理解预定义接口 场景:平常工作中写的都是业务模块,很少会去实现这样的接口,但是在框架里面用的倒是很多.   1. Traversable(遍历)接口 该接口不能被类直接实现,如果直接写了一个普通类 ...