在面向对象程序设计中,可以从已有的类派生出新类。 这称做继承(inheritance)。

白话解释:

例子1:继承一般是指晚辈从父辈那里继承财产,也可以说是子女拥有父母给予他们的东西。

例子2:猫和狗都属于动物,程序中便可以描述为猫和狗继承自动物。同理,咖啡猫和波斯猫继承自猫,而泰迪犬和比特犬继承自狗。所有的动物之间都会形成一个继承体系,具体下图:

所不同的是,这里继承的实体是类而非人.事物,也就是说。继承是子类拥有父类的成员。

当一个类继承自另一个类时候,我们会说这是子类去继承父类。若你想知道某物是否应该要继承另一物时,则可以用IS-A测试来检验。

三角形是一个多边形……没错。

妇科医生是一个医生……也没错。

泰迪是一只狗……对。

澡盆是一个浴室……错。

排骨没有洗干净……这是在说什么?

以后开发的时候如果想知道设计有没有错误,适用这样的测试来加以检验。如果不合理,表示你的设计有问题。

浴室和澡盆确实有关联,但不是继承关系。浴室与澡盆发生的是HAS-A的关系。如果“浴室有一个澡盆”成立的话,这表示浴室带有澡盆的实例变量。也就是说浴室会有个澡盆的引用,但是浴室并没有继承过澡盆。

继承特点

1:描述类和类之间的关系

2:降低类和类之间的重复代码

1:降低对象和对象之间的代码重复使用静态变量

2:降低类和类之间的代码重复使用就继承

测试代码1(dog类和cat类都继承Animal类):

package day08;
//定义Animal类
class Animal{
String name ;
//定义动物叫的方法
void shout(){
System.out.println(this.name+"在叫");
}
}
//定义Dog类继承Animal类
class Dog extends Animal{
public void dogName(){
//定义一个打印name的方法
System.out.println("name="+this.name);
}
}
class Cat extends Animal{
//定义一个打印name的方法
public void catName(){
System.out.println("name="+this.name);
}
}
public class Demo1 {
public static void main(String[] args){
Dog dog = new Dog();//创建一个Dog类的实例对象
dog.name = "哈士奇" ;//为Dog类的name属性进行赋值
dog.dogName();//调用Dog类的dogName()方法
dog.shout();//调用Dog类的shout()方法
Cat cat = new Cat();//创建一个Cat类的实例对象
cat.name = "波斯猫" ;//为Cat类的name属性进行赋值
cat.catName();//调用Cat类的catName()方法
cat.shout();//调用Cat类的shout()方法
}
}

运行结果:

测试代码1中的Dog类通过extends关键字继承了Animal类,这样Dog类便是Animal类的子类。从运行结果我们可以看出,dog类和cat类(子类)虽然没有定义name属性和shout()方法,但是却能访问这两个成员。这就说明,子类继承父类的时候,会自动拥有父类所有的成员。

在类的继承中,需要注意一些问题:

1.在Java中,类只支持单继承,不允许多重继承,也就是说一个类只能有一个直接父类,例如下面测试代码2这就不合法了

测试代码2(类不允许多继承):

class A{}
class B{}
class C extends A,B{} //C类不能同时继承A类和B类。。

2.多个类可以继承一个父类,例如下面测试代码3这种情况是允许的

测试代码3(多个类可以继承一个父类):

class A{}
//B类和C类都可以继承A类
class B extends A{}
class C extends A{}

3.在Java中,多层继承是允许的,即一个类的父类可以再去继承另一个的父类, 例如C类继承自B类,而B类又可以去继承A类,这是,C类可称作A类的子类。 在Java中,子类和父类是一种相对概念,也就是说一个类是某个类的父类同时,也可以是另一个类的子类。B类是A类的子类,同时又是C类的父类,下面测试代码4这种情况是允许的。

测试代码4(C继承B,B继承A):

class A{}			//A类是B类和C类的父类
class B extends A{} //B类继承A类,B类是A类的子类
class C extends B{} //C类继承B类,C类是B类的子类,同时也是A类的子类。

继承细节;

一:类名的设定,被继承的类称之为父类(基类),继承的类称之为子类

二:子类并不能继承父类中所有的成员

1:父类定义完整的成员 静态成员,非静态,构造方法。静态变量和静态方

法都可以通过子类名.父类静态成员的形式调用成功。

2:所有的私有成员不能继承,private修饰的成员。

3:构造函数不能被继承

三:如何使用继承

1:不要为了使用继承而继承。工人和学生都有共性的成员,不要为了节省代

码,让工人继承学生。

重写父类方法

在继承关系中,子类会自动继承父类中定义的方法,但是有时在子类中需要对继承的方法进行一些修改,即对父类的方法进行重写。

重写的方法需要和父类被重写的方法具有相同的方法名,参数列表以及返回值类型。

Cat_1类从Animal类继承了shout()方法,该方法在调用的时候会打印"动物在叫",这是明显不能明确描述哪种动物在叫,Cat类对象表示猫科动物,应该发出的叫声是“喵喵”,为了解决这问题,我可以在Cat_1类中重写父类Animal_1中的shout()方法。

测试代码5(重写父类shout()方法):

package day08;
//定义Animal类
class Animal_1{
String name ;
//定义动物叫的方法
void shout(){
System.out.println("动物在叫");
}
}
class Cat_1 extends Animal_1{
//定义一个打印name的方法
void shout(){
System.out.println("喵喵");
}
}
public class Demo2 {
public static void main(String[] args){
Cat_1 cat = new Cat_1();
cat.shout();
}
}

运行结果:

测试代码5Cat_1类继承了Animal_1类。 从结果可以看出,在调用Cat_1类对象的shout()方法时,只会调用子类从写重写的该方法,并不会调用父类的shout()方法。

P.S.

子类在重写父类的方法时,不能使用比父类中被重写的方法更严格的访问权限,如果父类中的方法时public的,子类的方法就不能是private的,关于访问权限中的更多问题,在我以后的blog中我会详细讲出,这里有个印象就可以了。

联系企鹅:654249738

JAVA_SE基础——39.继承的更多相关文章

  1. JAVA_SE基础——6.标识符&关键字

    学会写helloworld之后,  我们就开始来认识标识符&关键字 一.标识符 标识符是指可被用来为类.变量或方法等命名的字符序列,换言之,标识符就是用户自定义的名称来标识类.变量或方法等.更 ...

  2. JAVA_SE基础——26.[深入解析]局部变量与成员变量的区别

    黑马程序员入学blog ... 如果这章节很难懂的话应该返回去先看  JAVA_SE基础--10.变量的作用域 定义的位置上区别: 1. 成员变量是定义在方法之外,类之内的. 2. 局部变量是定义在方 ...

  3. JAVA_SE基础——9.基本数据类型间的转换

    前面我已经教会大家基本的数据类型进行了介绍,   然后这篇文章,我来介绍下,基本数据类型的转换. Java中有两种类型转换形式,分别是自动类型转换和强制类型转换. Step1.自动类型转换. 自动类型 ...

  4. JAVA_SE基础——8.基本数据类型

    基本数据类型有:整数类型.浮点类型.字符类型.布尔类型 整数类型 整数类型用来存储整数数值,即没有小数部分的数值.与C.C++语言相同,整数在Java语言中有3种表示形式:十进制.八进制和十六进制. ...

  5. JAVA_SE基础——7.常量&变量

    上一篇,我讲了标识符&关键字    这篇我来解释下变量&常量~~~ 变量与常量这两个概念相信大家都不会感到陌生,在数学中就已经涉及了变量与常量.理解变量与常量,可以举这样一个例子: 例 ...

  6. JAVA_SE基础——5.第一个Java程序HelloWorld&注释的应用

    配置完JDK&环境变量后,我们就可以开始写程序了,那么程序怎么写呢,用什么工具呢,我建议 为了方便学习,我们最好在一个磁盘下建立一个专门的文件来写java程序,比如就在D盘下建立一个名为&qu ...

  7. JAVA_SE基础——4.path的临时配置&Classpath的配置

    这次,我来写下关于path的临时配置的心的 我来说个有可能的实例:如果你去到别人的电脑 又想写代码 又不想改乱别人的path配置的话  再说别人愿意你在别人的电脑上瞎配吗? 那该怎么办呢? 那没问题 ...

  8. JAVA_SE基础——2.环境变量的配置&测试JDK

    哈喽,利用晚上的空余时间再写篇心的~~~  谢谢大家 前一篇文章 JAVA_SE基础--JDK&JRE下载及安装http://blog.csdn.net/thescript_j/article ...

  9. JAVA_SE基础——1.JDK&JRE下载及安装

    这是我学了JAVA来写的第一篇博客: 我首先是在传智播客领了张.毕向东老师的免费JAVA学习光盘来学习! 下面我来教大家安装使用JAVA时候必备的JDK 1.首先上甲骨文公司的官方网站下载JDK的安装 ...

随机推荐

  1. 八年架构师大咖首次揭秘,年薪50W秘籍!

    序言 我是土生土长的老北京人,你们肯定觉得我很有钱,为啥呢? 因为觉得我是北京户口,其实你们错了,我的房子是靠我自己买的,父母基本上没帮到我什么,当然,我也不需要吧! 我只想说,作为一名程序员,我很自 ...

  2. ASP.NET Core 一步步搭建个人网站(7)_Linux系统移植

    摘要 考虑我们为什么要选择.NET Core? 因为它面向的是高性能服务器开发,抛却了 AspNet 的臃肿组件,非常轻量,加上微软的跨平台战略,对 Docker 的亲和性,对于开发人员也非常友好,所 ...

  3. Android学习之AutoCompleteTextView和MultiAutoCompleteTextView

    转自:http://blog.csdn.net/qq_28468727/article/details/52258409 AutoCompleteTextView.MultiAutoCompleteT ...

  4. vue 数组渲染问题

    vue 数组渲染问题 问题一: 用v-for循环渲染数组数据时,数据更新了,视图却没有更新 由于 JavaScript 的限制, Vue 不能检测以下变动的数组: 1. 当你利用索引直接设置一个项时, ...

  5. linux kexec内核引导

    linux kexec 介绍 kexec的功能是用一个运行的内核去运行一个新内核,就像运行一个应用程序一样.这种机制因为跳过了bootloader,可以实现系统的快速重启.另外kdump也是基于kex ...

  6. 使用git提交到github,每次都要输入用户名和密码的解决方法

    使用git提交文件到github,每次都要输入用户名和密码,操作起来很麻烦,以下方法可解决,记录以下. 原因:在clone 项目的时候,使用了 https方式,而不是ssh方式. 默认clone 方式 ...

  7. 【前端】input radio多选事件获取所有选中的id,radio样式优化可修改

    $("#all_button").on('click', function() { obj = document.getElementsByClassName("inpu ...

  8. webpack学习(七)打包压缩图片

    使用插件webpack-spritesmith生成雪碧图 1.安装webpack-spritesmith:npm install --save-dev webpack-spritesmith 2.配置 ...

  9. 最大堆(Java数组实现)

    最大堆 data[1]开始存,data[0]空着不用.也可以把data[0]当成size来用. public class MaxHeap<T extends Comparable<? su ...

  10. Tomcat使用基础

    1.解压Tomcat压缩文件后需要在环境变量里配置 :TOMCAT_HOME:D:\apache-tomcat-8.0.35. 2.将打好的项目war包放到tomcat安装目录的webapps文件夹下 ...