【Java】 5.6 类的继承
目录
Java的继承:实现代码复用的手段之一
方法重写(Override,也叫覆盖):两同、两小、一大
super限定
调用父类构造器
Java的继承:实现代码复用的手段之一
- 一个类与另一个人类的关系
- extends - 拓展而非继承
- “is a”
- 从“一般到特殊”的关系(人 → 老师 → IT老师 → Java老师)
//Java中子类继承父类的语法格式为
修饰符 class SubClass extends SuperClass{//类定义部分
}
现实中的继承
- 一个实例与另一个实例的关系
- “捞到”财富
//Fruit类(SuperClass)public class Fruit {public double weight;public void info() {System.out.println("我是一个水果!重"+weight+"g!");}
}
//Banana类,继承了Fruitpublic class Banana extends Fruit{public static void main(String[] args) {//创建一个Banana对象Banana b=new Banana();//其实呢,Banana本身是没有weight成员变量//但是Banana的父类Fruit有weight成员变量,而且Banana类继承了Fruit类的weight变量b.weight=54.5;//调用Banana对象的info()方法b.info();}
}
Java的继承,单继承,extends 后只有一个父类
子类继承了父类,就可以获得父类的
- Field(成员变量)
- 方法
- 子类的构造器总会调用父类的构造器【一次】
如果你定义的Java类没有显式指定父类,系统会默认让他继承object类
“仪器类都是object类的子类”
===============================================================
方法重载(Overload):两同,一个不同
方法重写(Override,也叫覆盖):两同、两小、一大
- 两同
- 方法名相同
- 形参列表相同
- 两小
- 子类重写的方法的返回值类型必须比父类方法的返回值类型更小、或相等
- 子类重写的方法的声明抛出的异常必须必父类方法的声明抛出的异常更小、或相等、
- 一大
- 子类重写的方法的访问权限必须比父类方法的访问权限更大、或相等
此外,覆盖方法和被覆盖方法要么都是实例方法要么都是类方法,不能一个是实例
@Override 让编译器执行更严格的检查,要求被修饰的方法,必须是重写父类的方法
public class Fish {public void swim() {System.out.println("我在大海里自由自在游泳……");}
}
public class Shark extends Fish {public void swim() {System.out.println("我是一条鲨鱼,我在大海里自由自在的游泳");}public static void main(String[] args) {Shark sh = new Shark();//将输出"我是一条鲨鱼,我在大海里自由自在的游泳"sh.swim();}
}
=================================================================
super限定
super限定的语法格式:
public void callOverridedMothod{//在子类方法中通过super限定显式调用被覆盖的方法//既可以调用重写的方法,又可以调用父类的方法super.swim();
}
- super限定:强制去使用父类方法
- super调用:用于显式调用父类的构造器
- 规则:子类的构造器【总会】调用父类的构造器【一次】
- 默认情况下,子类构造器会自动调用父类无参数的构造器
- 如果希望明确指定子类构造器调用父类的哪个构造器
- 可用super(参数)来调用
- super调用必须出现在构造器第一行
- super不能出现在static修饰的类方法中,super是指向实例的
/*
* public class:是JAVA定义的,一般占到编程的角度来将就是包含main方法的,
* 一个java文件中只有一个public class,而且public class的文件名要跟.java的文件名一致;
*
* class:在Java编程是描述对象的,也就是类。
*///super限定词
class BaseClass {public int a=5;
}public class SubClass extends BaseClass{public int a=7;public void accessOwner() {System.out.println(a);}public void accessBase() {//通过super关键字来限定调用的a实例变量System.out.println(super.a);}public static void main(String[] args) {SubClass sub = new SubClass();sub.accessOwner(); //输出7sub.accessBase(); //输出5}
}
在查找子类中的a的顺序为:
- 查找该方法中有没有局部变量a
- 查找当前类中有没有成员变量a
- 查找a的直接父类中是否包含名为a的成员变量,依次上溯a的所有父类。直到java.lang,Object
【注意】
- 系统在为程序分配内存时,子类n个实例变量与父类m个实例变量(即使有同名的实例变量)依然为保存n+m个实例变量
- 继承中强制向上转型
class Parent{public String tag = "我正在学习Java";
}class Son extends Parent{private String tag = "我正在学习Java基础";
}
public class HideTest {public static void main(String[] args) {Son s = new Son();//如果直接使用s.tag会出现编译失败,因为private的修饰符只允许本类中访问其成员变量System.out.println(((Parent)s).tag);}}
==========================================================================================
调用父类构造器
- 子类不会获得父类的构造器,但是子类构造器中可以调用父类构造器的初始化代码
- super调用、this调用都必须出现在构造器的第一行
- super调用、this调用不能同时出现
class Base{public double size;public String name;public Base(double size,String name) {this.size=size;this.name=name;}
}
public class Sub extends Base{public String color;public Sub(double size,String name,String color) {//通过super调用来调用父类构造器的初始化过程super(size,name);this.color=color;}public static void main(String[] args) {Sub sub=new Sub(5.56,"M4A1自动步枪","绿色");System.out.println(sub.size+"---"+sub.name+"-----"+sub.color);}
}
【注意】
- 如果既没有super调用也没有this调用,子类构造器会自动先调用父类无参数构造器
- 如果有super调用(必须在子类的第一行),子类构造器会根据super调用传入的参数去调用父类对应的构造器
- 如果有this调用,子类构造器会先找this调用所对应子类中被中被重载的构造器
- this调用和super调用很像,this调用的是当前类的重载构造器,而super调用的是父类的构造器
- 构造器初始化是从最高的父类Object开始依次初始化的
【Java】 5.6 类的继承相关推荐
- Java接口与类之间继承,多态的练习,文字游戏,
Java接口与类之间继承,多态的练习例题,文字游戏, 问题描述: 一.定义两个接口: public interface Assaultable可攻击的, 接口有一个抽象方法public abstrac ...
- (JAVA学习笔记) 类的继承,super,方法的重写,多态
文章目录 类的继承,super,方法的重写,多态 1.类的继承 代码演示: 2.super和this 代码演示: 3.方法的重写 代码演示: 4.多态 代码演示: 类的继承,super,方法的重写,多 ...
- java实验33 类的继承2_java实验2 类的继承性
实验2 类的继承性 一.实验目的 掌握面向对象的继承性在Java中的实现方法:掌握super关键字的用法,体会抽象类和抽象方法的作用. 二.实验内容 1.程序理解: 1)类的继承 2)第4章课后编程第 ...
- Java语言所有异常类均继承自_Java将运行错误分为两类:(__)和(__), 其对应的类均派生自(__)类;...
[单选题]设 x,y 均为已定义的类名,下列声明对象x1的语句中正确的是( ) [判断题]构造函数的方法名可以由编程人员任意命名. [单选题]能够实现对原文的鉴别和不可否认性的认证技术是( ). [单 ...
- java 什么是类的继承_Java基础,类的继承,粗略的理解希望对大家有所帮助!
Java基础:继承 读者老爷们大家好,今天图图带大家了解一下java基础里的继承. 首先确定一下我们今天的学习的三个目标.第一个是类的继承:第二个是访问控制权限:第三个方法重写(覆盖)override ...
- Java语言所有异常类均继承自_要继承自定义异常类的继承方式必须使用 ( ) 关键字_学小易找答案...
[填空题]当异常已经被定义时,必须通过( ) 语句来处理它. [填空题]Catch 子句包含( )的程序段 [单选题]下列java语言的常用异常类中,属于检测异常的是() [单选题]自定义异常类时,可 ...
- java中阻止类的继承
1.使用final来修饰类 final表示这个类是继承树的末端,不能被继承. 2.将类的构造方法声明为private的,再提供一个static的方法来返回一个类的对象. JAVA语言要求继承时必须在构 ...
- Java作业:类的继承的实例(正方体、圆柱体、圆锥体、球体分别继承自矩形类和圆类)
圆类 : //package Graph;//圆类 public class Circle {//定义圆类的私有属性radiusprivate float radius;//无参构造方法Circle( ...
- Java基础 -- 复用类(组合和继承)
复用类有两种实现方式. 在新的类中产生现有类的对象,由于新的类是由现有类的对象所组成,所以这种方法称之为组合. 采用继承实现. 一 组合语法 下面创建两个类WaterSource和Sprinkler ...
- java中的类的继承_再谈Java中类的继承
上篇博客谈到了Java中类的继承,但是那些远远不能满足我们在实际操作中的需要,那么怎么才能让子类的功能更强大,并且具有父类的属性呢? 一: 父类 1 public classA {2 3 final ...
最新文章
- 文本在计算机中的编码表示方法,计算机中数字、文字、图像、声音和视频的表示与编码...
- python交互式数据可视化_python数据可视化工具
- 二十三、Python数据建模(上),禁止转载
- 基于TensorFlow Lite的人声识别在端上的实现
- python爬取歌曲评论并进行数据可视化
- Virtualbox安装增强工具失败
- KDD CUP 2018 前4 名解决方案公开: AI预测空气质量
- 【转】关于输出用%lf和%f的问题
- 改变mysql默认字符集为utf8
- matlab2014a vs2015,Matlab2014a使用VS2015混合编译
- Python--判断一个数字的奇偶性
- one class SVM
- Android MVVM框架搭建(十)Hilt、ViewBinding、Activity Result API
- 驱动专题:第五章MTD及Flash驱动 1.mtd框架分析
- 一个遮罩层怎么遮罩两个图层_遮罩效果全解(13种方法)
- 时间格式化问题@DateTimeFormat和@JsonFormat的区别
- Dubbo:Dubbo服务发现
- 阿里MNS服务:代码显示成功并可以得到消息id及其md5,手机却收不到短信
- npm install下载包的时候报4048rename的错误
- vmware15pro