Java 从入门到进阶之路(十)
之前的文章我们介绍了一下 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 从入门到进阶之路(十)的更多相关文章
- Java 从入门到进阶之路(十二)
在之前的文章我们介绍了一下 Java 类的重写及与重载的区别,本章我们来看一下 Java 类的 private,static,final. 我们在之前引入 Java 类概念的时候是通过商场收银台来引入 ...
- Java 从入门到进阶之路(十五)
在之前的文章我们介绍了一下 Java 中的接口,本章我们来看一下 Java 中类的多态. 在日常生活中,很多意思并不是我们想要的意思,如下: 1.领导:“你这是什么意思?” 小明:“没什么意思,意思意 ...
- Java 从入门到进阶之路(十四)
在之前的文章我们介绍了一下 Java 中的抽象类和抽象方法,本章我们来看一下 Java 中的接口. 在日常生活中,我们会接触到很多类似接口的问题,比如 USB 接口,我们在电脑上插鼠标,键盘,U盘的时 ...
- Java 从入门到进阶之路(十六)
在之前的文章我们介绍了一下 Java 中类的多态,本章我们来看一下 Java 中类的内部类. 在 Java 中,内部类分为成员内部类和匿名内部类. 我们先来看一下成员内部类: 1.类中套类,外面的叫外 ...
- Java 从入门到进阶之路(十九)
在之前的文章我们介绍了一下 Java 中的Object,本章我们来看一下 Java 中的包装类. 在 Java 中有八个基本类型:byte,short,int,long,float,double,ch ...
- Java 从入门到进阶之路(二十)
在之前的文章我们介绍了一下 Java 中的包装类,本章我们来看一下 Java 中的日期操作. 在我们日常编程中,日期使我们非常常用的一个操作,比如读写日期,输出日志等,那接下来我们就看一下 Java ...
- Java 从入门到进阶之路(二十二)
在之前的文章我们介绍了一下 Java 中的 集合框架中的Collection 中的一些常用方法,本章我们来看一下 Java 集合框架中的Collection 的迭代器 Iterator. 当我们创建 ...
- Java 从入门到进阶之路(十八)
在之前的文章我们介绍了一下 Java 中的正则表达式,本章我们来看一下 Java 中的 Object. 在日常生活中,任何事物我们都可以看做是一个对象,在编程中是同样的道理,在 Java 编程中其实更 ...
- Java 从入门到进阶之路(二十四)
在之前的文章我们介绍了一下 Java 中的 集合框架中的Collection 的泛型,本章我们来看一下 Java 集合框架中的Collection 的子接口 List. Collection 接口有 ...
随机推荐
- 部署spring boot + Vue遇到的坑(权限、刷新404、跨域、内存)
部署spring boot + Vue遇到的坑(权限.刷新404.跨域.内存) 项目背景是采用前后端分离,前端使用vue,后端使用springboot. 工具 工欲善其事必先利其器,我们先找一个操作L ...
- 【XSY2488】【HDU5818】Joint Stacks
这题合并栈让我们想到了左偏树. 我们可以维护val值为时间,dis值为size的左偏树,定义两个根root1和root2,表示两个栈的栈顶,建大根的左偏树. 接下来的插入,删除,两个栈合并都是左偏树的 ...
- 如何做seo优化才能获取搜索引擎排名?
现在网络上有很多网站,但是排名和流量都不理想,所以很多企业会很苦恼.所以我们经常思考如何使网站被搜索引擎喜欢,被用户喜欢,有一个良好的排名和流量? 在这个鱼龙混杂的网络中,seo优化实际上是seo网站 ...
- Redis开发与运维:SDS
STRING 我们会经常打交道的string类型,在redis中拥有广泛的使用.也是开启redis数据类型的基础. 在我最最开始接触的redis的时候,总是以为字符串类型就是值的类型是字符串. 比如: ...
- C标准库stdlib.h概况
库变量 size_t 这是无符号整数类型,它是 sizeof 关键字的结果 wchar_t 这是一个宽字符常量大小的整数类型. div_t 这是 div 函数返回的结构 ldiv_t 这是 l ...
- [Luogu5384][Cnoi2019] 雪松果树
传送门 虽然这题是一道二合一,也不算难,但还是学到了很多东西啊,\(k\) 级儿子个数的五种求法!!我还是觉得四种比较好( \(k\) 级儿子个数有五种求法,你知道么? --鲁迅 首先 \(k\) 级 ...
- ES入门宝典(详细截图版)
本文使用版本基于elasticsearch-6.4.0 1.什么是ES? 官网: https://www.elastic.co/products/elasticsearch 中文官网:https:/ ...
- Spring Boot 2.X(十七):应用监控之 Spring Boot Admin 使用及配置
Admin 简介 Spring Boot Admin 是 Spring Boot 应用程序运行状态监控和管理的后台界面.最新UI使用vue.js重写里. Spring Boot Admin 为已注册的 ...
- [WPF] Caliburn Micro学习三 Binding
Caliburn Micro学习一 Installation Caliburn Micro学习二 Infrastructure 如果说WPF推崇的Binding开辟了一条UI开发新的方式——让写代码的 ...
- UML分析AsyncDisplayKit框架-ASMuplexImageNode异步下载时序图。
PS:博客园图片服务器不正常工作,数据上传后服务器返回http500,园方迟迟还没解决. 我从2016-01-18 05:52向园方反馈问题-请问博客园的图片服务器有在正常运行吗,至此时2016-01 ...