Java基础—继承
继承是面向对象的核心特征之一,是由已有类创建新类的机制。利用继承机制,可以先创建一个具有共性的一般类,然后根据该一般类创建具有特殊性的新类,新类继承一般类的属性和方法,并根据需要增加自己的新属性和方法。类的继承机制是面向对象程序设计中实现软件可重用性的重要手段。
由已有类定义新类,已有类称为父类或超类,新类称为子类或派生类。通过继承机制,子类拥有父类所有的成员变量和成员方法,子类中既可以定义新的属性和方法,也可以对父类中的成员变量和成员方法进行改进,使类的功能得以扩充。
1.继承的实现
①、子类的声明,eg:
- public class Dog extends Animal{
- private String color; //新加的属性
- private String kinds;
- public void sleep(String color, String kinds){
- System.out.println("颜色为:" + color + ",种类为:"+ kinds + "的狗正在睡觉!!!" ); //新加的方法
- }
- }
如上面所示:Dog类继承Animal类,那么Animal即为父类,Dog类即为子类,Dog类也将拥有父类Animal的所有成员变量和方法。
②、继承的原则
Java语言中继承机制的原则如下:
A:Java是单继承的,一个类只能继承一个父类。
B:子类继承父类的实例变量和类变量(静态变量)。
C:子类继承父类除构造方法以外的实例成员和类方法(静态方法)。
D:子类不能继承父类的构造方法,因为父类的构造方法用来创建父类对象,子类需要声明自己的构造方法,用来创建自己的对象。
E:子类可以重新声明父类的成员。
③、子类对父类成员的访问权限
子类虽然继承了父类的成员变量和成员方法,但并不是对父类所有的成员变量和成员方法都具有访问权限,即并不是在自己声明的方法中都能够访问父类的所有成员变量或成员方法。Java中子类访问父类成员的权限如下:
A:子类对父类的private成员没有访问权限。子类方法中不能直接引用父类的private成员变量,不能直接调用父类的private方法,但可以通过父类非private成员方法访问父类的成员变量。
B:子类对父类的public和protected成员具有访问权限。
C:子类对父类的默认权限成员的访问权限分为两种情况:对于同一个包中的父类默认权限成员具有访问权限,对其他包中父类的默认权限成员没有访问权限。
类中成员的访问权限体现了类封装的信息隐藏原则,如果类中成员仅限于该类使用,则声明为private;如果类中成员允许子类使用,则声明为protected;如果类中成员允许所有类访问,则声明为public。
根据一个案例来理解继承,eg:
- package extendsExample;
- /**
- *
- * @author JackW
- *
- */
- public class Animal {
- //私有属性
- private String type;
- private String breed;
- private String name;
- //构造方法
- public Animal(String type, String breed, String name) {
- super();
- this.type = type;
- this.breed = breed;
- this.name = name;
- }
- //自我介绍方法
- public void introduce(){
- System.out.println("主人好,我是" + this.type +",我的品种是" + this.breed + ",我的名字叫:" + this.name);
- }
- //叫声方法
- public void sound(){
- }
- }
- package extendsExample;
- /**
- *
- * @author JackW
- *
- */
- public class Cat extends Animal{
- //子类构造函数
- public Cat(String breed, String name){
- //调用父类构造函数
- super("猫", breed, name);
- }
- }
- package extendsExample;
- /**
- *
- * @author JackW
- *
- */
- public class Dog extends Animal{
- //子类构造函数
- public Dog(String breed, String name){
- //调用父类构造函数
- super("狗", breed, name);
- }
- }
- package extendsExample;
- /**
- *
- * @author JackW
- *
- */
- public class PetShop {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- Cat cat = new Cat("波斯猫", "花花"); //定义猫对象cat
- Dog dog = new Dog("金毛", "芋头"); //定义狗对象dog
- cat.introduce(); //猫调用自我介绍方法
- dog.introduce(); //狗调用自我介绍方法
- }
- }
从上面的代码可以看出,Animal为父类,Cat类和Dog类为子类,父类中定义所有子类公共的属性和方法,不需要每个子类都再次的写一遍。
说明:
A:main()方法中的猫类对象cat和狗类对象dog都可以调用introduce()方法,但是Cat类和Dog类都未定义introduce()方法,这是因为Cat类和Dog类从父类Animal类中继承introduce()方法。
B:super 是Java的关键字,表示调用父类成员;this也是Java的关键字,表示调用当前类的成员。
④、super 和 this 引用
子类可以使用super关键字引用父类的成员变量,成员方法及构造方法。
A:引用父类成员变量
eg:super.成员变量名;
当子类中没有申明与父类同名的成员变量时,引用父类的成员变量可以不使用super 关键字;但当子类中声明了与父类同名的成员变量时,为类引用父类的成员变量,必须使用super 关键字,否则引用的是子类中同名的成员变量。
B:调用父类成员方法
子类自动继承父类所有的成员方法,可以使用以下方式调用父类的成员方法:
eg:super.成员方法(参数列表);
当子类中没有声明与父类同名且参数列表也相同的成员方法时,调用父类的成员方法可以不使用super 关键字;当子类中声明了与父类同名且参数列表也相同的成员方法时,为了调用父类的成员方法,必须使用super 关键字,否则调用的是子类中同名且参数列表也相同的方法。
C:调用父类的构造方法
在子类构造方法中,可以通过super 关键字调用父类构造方法,其调用形式如下:
eg:super(参数列表);
此处的参数列表由父类方法的参数列表决定,并且super()必须是子类构造方法体中的首条语句。
⑤、继承中的构造函数调用次序
实例化子类对象时,先调用子类构造函数,在调用父类构造函数。父类构造函数对属性进行初始化后,子类再对子类属性进行初始化。
⑥、继承中的实例化
实例化子类对象时,先实例化父类对象,后实例化子类对象,也就是说,实例化子类对象时,父类对象也被实例化了。
2.Object 类
在Java中,java.lang.Object 类是所有类的父类,当一个类没有使用 extends 关键字显式继承其他类时,该类默认继承 Object 类,因此所有类都是 Object 类的子类,都具有 Object 类的方法和属性。
Java基础—继承的更多相关文章
- 《Java基础——继承》
Java基础--继承 一.类的继承: 规则: 1.一个子类只能有一个父类,但一个父类可以有多个子类,每个子类都可以作为父类使用. 2.若一个类没有声明父类,则默认其父类为Object. 3.父 ...
- Java 基础 - 继承
子类继承父类的private字段么? Oracle的Java Documentation对Inheritance的定义: 很直白,定义里面就告诉你了这不叫继承.继承的意思是你可以对其进行直接的调用和修 ...
- java基础-继承
浏览以下内容前,请点击并阅读 声明 一个由其他类继承的类叫子类(也叫继承类,扩展类等),该类继承的类叫父类或超类.除了Object类意外,所有的类都有切仅有一个父类,如果一个类没有用extends关键 ...
- java基础-继承:矩形体积类问题
28.按要求编写一个Java应用程序: (1)定义一个类,描述一个矩形,包含有长.宽两种属性,和计算面积方法. (2)编写一个类,继承自矩形类,同时该类描述长方体,具有长.宽.高属性, 和计算体积的方 ...
- Java基础--继承方法调用顺序
最近因为面试的原因,回过头来复习基础的知识,都忘光了,准备买本面试书回来啃. 我先把自己测试的结论总结写出来,以后忘记再来看看 如果b类继承自a类,在main方法中new出b的对象(不带参数),那么他 ...
- JAVA基础--继承和权限控制
1. extends继承 2. java只支持单继承,不允许多继承 修饰符 类内部 同一个包 子类 任何地方 private YES default YES YES protect ...
- Java基础——继承
学习Java继承之前,我们想回忆一下Java面向对象需要特别注意的几个关键点. 面向对象是将复杂的事情简单化了,它通过封装的方式使得代码的重用性更高和安全性更强.平时我们要学会用面向对象的方式去思考, ...
- Java基础---继承、抽象、接口
一.概述 继承是面向对象的一个重要特征.当多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继那个类即可.这时,多个类可以称为子类,单 ...
- java基础继承
为什么用继承: 因为继承可以减少代码的冗余,提高维护性,为了从根本上解决存在的问题,就需要继承,就是将多个类当中的相同的地方提取到一个父类当中.父类更通用,子类更具体. 父类的继承格式 语法:publ ...
- 古典音乐 (java基础 继承)
摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 一.前言 小朽不才,最近爱上了听古典音乐收录了,mozart ,贝多芬… ...
随机推荐
- bzoj3526[Poi2014]Card*
bzoj3526[Poi2014]Card 题意: 有n张卡片在桌上一字排开,每张卡片上有两个数,第i张卡片上,正面的数为a[i],反面的数为b[i].有m个操作,第i个操作会交换c[i]和d[i]两 ...
- JVM系列-方法调用的原理
JVM系列-方法调用的原理 最近重新看了一些JVM方面的笔记和资料,收获颇丰,尤其解决了长久以来心中关于JVM方法管理的一些疑问.下面介绍一下JVM中有关方法调用的知识. 目的 方法调用,目的是选择方 ...
- lua的table表去重
推荐阅读: 我的CSDN 我的博客园 QQ群:704621321 我的个人博客 方法一 用过lua的人都知道,lua的table中不允许存在相同的key,利用这个思想,我们可以将原始table ...
- javascript : 递归遍历数组
我们假设有一个对象数组. 这个对象数组里的对象,有一个叫children的key,value也是一个对象数组. 这个数组里面可能还有children... 现在我们想递归遍历它. 上代码. test_ ...
- C++语法小记---友元
友元函数 延续C语言的结构体编程方式,直接访问类的私有成员,提高效率 友元分为函数友元和类友元 友元函数可以访问类的所有成员 友元类的所有成员函数都是友元函数 友元不具备传递性 友元函数和类的成员函数 ...
- 2020最新全栈必备 Redis,你还不了解么
什么是Redis Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 它支持多种类型的数据结构,如字符串, 散列, 列表, 集合, 有序集合与范围查 ...
- 深度搜索---------Lake counting
#include<iostream>#include<cstdio>#include<cstdlib>#define maxn 100char ch[maxn][m ...
- UWP 自定义密码框控件
1. 概述 微软官方有提供自己的密码控件,但是控件默认的行为是输入密码,会立即显示掩码,比如 *.如果像查看真实的文本,需要按查看按钮. 而我现在自定义的密码控件是先显示你输入的字符2s,然后再显示成 ...
- 实现了__iter__和__next__的对象是迭代器
class MyList(object): """自定义的一个可迭代对象""" def __init__(self): self.items ...
- 线程_GIL最简单的例子
#解决多进程死循环 import multiprocessing def deadLoop(): while True: print("Hello") pass if __name ...