之前的文章我们介绍了一下 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. Web for pentester_writeup之Commands injection篇

    Web for pentester_writeup之Commands injection篇 Commands injection(命令行注入) 代码注入和命令行注入有什么区别呢,代码注入涉及比较广泛, ...

  2. CSPS_105

    不想多说... T1 是$1$还是$26^n-1$ T2 是$f[getf(u)]=getf(v)$还是$f[u]=v$ T3 是$if(condition1\&\&condition ...

  3. 使用Typescript重构axios(二十六)——添加HTTP授权auth属性

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  4. jquery获取input输入框中的值

    如何用javascript获取input输入框中的值,js/jq通过name.id.class获取input输入框中的value 先准备一段 HTML <input type="tex ...

  5. 华为OceanConnect物联网平台概念全景 | 我的物联网成长记

    作者 | 我是卤蛋 华为云OceanConnect IoT云服务包括应用管理.设备管理.系统管理等能力,实现统一安全的网络接入.各种终端的灵活适配.海量数据的采集分析,从而实现新价值的创造. 华为云O ...

  6. vue-snippet-模板

    "template": { "prefix": "template", "body": [ "<temp ...

  7. PHP防止客户端多次点击

    PHP防止客户端多次点击 第一种用ip判断 第二种就是用 用户名第三种就是cookie仅限 H5第四种 用swoole 用swoole id

  8. Kubernetes(k8s)集群安装

    一:简介 二:基础环境安装 1.系统环境 os Role ip Memory Centos 7 master01 192.168.25.30 4G Centos 7 node01 192.168.25 ...

  9. k8s部署高可用Ingress

    部署高可用Ingress 官网地址https://kubernetes.github.io/ingress-nginx/deploy/ 获取ingress的编排文件 wget https://raw. ...

  10. Mybatis动态语句部分收集

    where: <select id="findActiveBlogLike" resultType="Blog"> SELECT * FROM BL ...