Java 继承之子父类中的成员变量和函数
- 格式:docx
- 大小:13.65 KB
- 文档页数:3
java继承子类重写父类方法Java继承和方法重写什么是继承?在Java中,继承是一种重要的面向对象编程概念。
它允许我们创建一个新的类,称为子类(或派生类),从一个现有的类,称为父类(或基类)继承属性和方法。
子类可以继承父类的所有非私有成员,并可以添加自己的新成员。
为什么要继承?继承提供了代码重用的机制,减少了重复编写代码的工作量。
它还可以使代码更具可读性,可维护性和可扩展性。
通过继承,我们可以建立类之间的层次结构,使得代码的组织更加清晰。
方法的重写方法的重写是指子类重新定义或实现从父类继承的方法。
在Java 中,子类可以覆盖父类的方法,以满足其特定的需求。
方法的重写通过使用相同的方法名,返回类型和参数列表来实现。
当子类重写父类的方法时,子类的方法将完全取代父类的方法。
子类可以根据自己的需要实现不同的行为,但方法的签名必须与父类的方法相同。
方法重写的规则在进行方法重写时,需要遵守以下规则:1.子类的方法必须具有与父类方法相同的名称和参数列表。
2.子类的方法必须具有相同或更宽松的访问权限(即不能缩小方法的访问权限)。
3.子类的方法必须具有相同的返回类型或其子类。
4.子类的方法不能抛出比父类方法更广泛的异常。
方法重写示例下面是一个例子,演示了如何在Java中实现方法的重写:public class Animal {public void sound() {("Animal is making a sound");}}public class Dog extends Animal {@Overridepublic void sound() {("Dog is barking");}}public class Cat extends Animal {@Overridepublic void sound() {("Cat is meowing");}}public class Main {public static void main(String[] args) { Animal animal = new Animal();();Dog dog = new Dog();();Cat cat = new Cat();();}}输出结果:Animal is making a soundDog is barkingCat is meowing在上面的例子中,我们定义了一个Animal类,其中包含了一个sound()方法。
java语言的类间的继承关系1. 前言Java语言作为一门面向对象编程(OO)语言,其中最重要的特性之一是继承(Inheritance)。
继承使得一个类可以从另一个类中继承其特征,使得代码复用变得更加高效。
本文旨在介绍Java语言中类间的继承关系,从什么是继承开始,到如何在代码中使用继承,包括继承的类型、继承的规则和优缺点等。
2. 什么是继承继承(Inheritance)可以定义为一个类(子类)继承属性和方法的过程,这些属性和方法是已经存在于另一个类(父类)中的。
子类可以从父类继承其属性和方法,同时还可以添加自己的属性和方法。
在Java语言中,继承关系是一种“is-a”(是一个)关系,例如:“狗”是“动物”的一种,因此可以定义一个“狗”类,使其继承“动物”类的属性和方法。
3. 继承的类型Java语言中,有两种类型的继承,分别是类继承和接口继承。
3.1 类继承类继承指的是一个类从另一个类中继承其属性和方法。
在Java语言中,一个父类可以有多个子类,但是一个子类只能有一个直接父类。
如果一个子类有多个父类,则会构成多重继承。
Java语言中不支持多重继承的原因是,这会造成命名冲突,无法确定调用哪个方法。
3.2 接口继承接口继承指的是一个接口从另一个接口中继承其方法签名。
在Java语言中,一个类可以实现多个接口,但是一个接口只能继承一个接口。
4. 继承的规则在Java语言中,有一些规则限制了继承的使用。
这些规则是:4.1 访问修饰符子类可以继承父类中的方法和属性,但是子类不能访问父类中的私有属性和私有方法。
另外,子类可以访问父类中的公有属性和公有方法。
4.2 构造函数子类不能继承父类的构造函数,但是可以通过调用父类的构造函数来初始化父类中的属性。
4.3 方法重写子类可以重写父类中的方法,以实现子类自己的特定需求。
在重写方法时,子类必须使用相同的方法签名(名称、参数列表和返回类型)。
4.4 super关键字子类可以使用super关键字来调用父类中的方法或属性。
1. (对) 所有的文件输入/输出流都继承于InputStream /OutputStream类。
2. (错) 一个方法最多能有一个return语句。
3.(对) 一个异常处理中 finally语句块只能有一个或者可以没有。
4. (对)Java是区分大小写的语言,关键字的大小写不能搞错,如果把类class 写成Class或者CLASS,都是错误的。
5.(对)“//”符号表示从“//”符号开始到此行的末尾位置都作为注释。
6.(错)子类可以继承父类所有的成员变量和成员方法。
7.(错)在Java中不允许一个方法在自身定义的内部调用自己。
8.(错)Java源程序编写好之后,以文件的形式保存在硬盘或U盘上,源文件的名字可以随便取的,它不一定与程序的主类名一致。
9. (错) 线程使用sleep()方法休眠后,可以用notify()方法唤醒。
10. (错)用Javac编译Java源文件后得到代码叫字节码。
4.(错)一个类中定义两个方法,名字相同,参数相同,返回值不同,它们是重载方法。
5.(对)一个类的构造函数既可以发生重载又可以被继承。
6.(对)Java系统的标准输入对象是System.in,标准输出对象有两个,分别是标准输出System.out和标准错误输出System.err。
10. (错)Java语言使用的是Unicode字符集,每个字符在内存中占8位。
1. (错)任何类都必须显式地定义该类的构造方法,以便对类的成员进行各种初始化操作。
6.(对) abstract和final不能同时修饰同一个类。
7.(错)访问类的成员,必须以类的对象为前缀。
8.(错)诊断和改正程序中错误的工作通常称为程序执行。
9. (错)在运行字节码文件时,使用java命令,一定要给出字节码文件的扩展名.class。
1. (错)由继承性可知,程序中子类拥有的成员数目一定大于等于父类拥有的成员数目。
2.(错)注释的作用是使程序在执行时在屏幕上显示//之后的内容。
java类的继承实验报告Java类的继承实验报告引言:在面向对象的编程语言中,继承是一种重要的概念。
Java作为一门面向对象的编程语言,也支持类的继承。
本篇实验报告将介绍Java类的继承的基本概念、语法以及实际应用。
一、继承的基本概念继承是指一个类可以派生出另一个类,被派生出的类称为子类,派生出子类的类称为父类。
子类可以继承父类的属性和方法,并且可以在此基础上进行扩展或修改。
继承的关系可以形成类的层次结构,使得代码的复用性和可维护性得到提高。
二、继承的语法在Java中,使用关键字"extends"来实现类的继承关系。
子类通过继承父类来获得父类的属性和方法。
语法格式如下:```javaclass 子类名 extends 父类名 {// 子类的成员变量和方法}```在子类中可以重写父类的方法,以实现自己的逻辑。
使用关键字"super"可以调用父类的构造方法和成员变量。
三、继承的实际应用1. 代码复用继承的一个主要优势是可以实现代码的复用。
子类可以继承父类的属性和方法,避免了重复编写相同的代码。
例如,假设有一个父类"Animal",子类"Dog"和"Cat"可以继承父类的一些通用属性和方法,如"eat()"和"sleep()"。
2. 多态性继承也为多态性的实现提供了基础。
多态性是指一个对象可以根据不同的类型表现出不同的行为。
通过继承,可以将不同的子类对象赋给父类引用,实现对不同子类对象的统一操作。
例如,有一个父类"Shape",子类"Circle"和"Rectangle"可以继承父类的方法"draw()",并在自己的类中实现具体的绘制逻辑。
通过将子类对象赋给父类引用,可以统一调用"draw()"方法,实现对不同形状的绘制。
面向对象今日内容介绍◆继承◆抽象类第1章继承1.1继承的概念在现实生活中,继承一般指的是子女继承父辈的财产。
在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系。
例如公司中的研发部员工和维护部员工都属于员工,程序中便可以描述为研发部员工和维护部员工继承自员工,同理,JavaEE工程师和Android工程师继承自研发部员工,而维网络维护工程师和硬件维护工程师继承自维护部员工。
这些员工之间会形成一个继承体系,具体如下图所示。
图1-1员工继承关系图在Java中,类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类被称作子类,现有类被称作父类,子类会自动拥有父类所有可继承的属性和方法。
1.2继承的格式&使用在程序中,如果想声明一个类继承另一个类,需要使用extends关键字。
格式:class 子类 extends 父类 {}接下来通过一个案例来学习子类是如何继承父类的,如下所示。
Example01.java/** 定义员工类Employee*/class Employee {String name; // 定义name属性// 定义员工的工作方法public void work() {System.out.println("尽心尽力地工作");}}/** 定义研发部员工类Developer 继承员工类Employee*/class Developer extends Employee {// 定义一个打印name的方法public void printName() {System.out.println("name=" + name);}}/** 定义测试类*/public class Example01 {public static void main(String[] args) {Developer d = new Developer(); // 创建一个研发部员工类对象 = "小明"; // 为该员工类的name属性进行赋值d.printName(); // 调用该员工的printName()方法d.work(); // 调用Developer类继承来的work()方法}}运行结果如下图所示。
继承的基本概念:(1)Java不⽀持多继承,也就是说⼦类⾄多只能有⼀个⽗类。
(2)⼦类继承。
继承的基本概念:(1)Java不⽀持多继承,也就是说⼦类⾄多只能有⼀个⽗类。
(2)⼦类继承了其⽗类中不是私有的成员变量和成员⽅法,作为⾃⼰的成员变量和⽅法。
(3)⼦类中定义的成员变量和⽗类中定义的成员变量相同时,则⽗类中的成员变量不能被继承。
(4)⼦类中定义的成员⽅法,并且这个⽅法的名字返回类型,以及参数个数和类型与⽗类的某个成员⽅法完全相同,则⽗类的成员⽅法不能被继承。
分析以上程序⽰例,主要疑惑点是“⼦类继承⽗类的成员变量,⽗类对象是否会实例化?私有成员变量是否会被继承?被继承的成员变量在哪⾥分配空间?”1:虚拟机加载ExtendsDemo类,提取类型信息到⽅法区。
2:通过保存在⽅法区的字节码,虚拟机开始执⾏main⽅法,main⽅法⼊栈。
3:执⾏main⽅法的第⼀条指令,new Student(); 这句话就是给Student实例对象分配堆空间。
因为Student继承Person⽗类,所以,虚拟机⾸先加载Person类到⽅法区,并在堆中为⽗类成员变量在⼦类空间中初始化。
然后加载Student类到⽅法区,为Student类的成员变量分配空间并初始化默认值。
将Student类的实例对象地址赋值给引⽤变量s。
4:接下来两条语句为成员变量赋值,由于name跟age是从⽗类继承⽽来,会被保存在⼦类⽗对象中(见图中堆中在⼦类实例对象中为⽗类成员变量分配了空间并保存了⽗类的引⽤,并没有实例化⽗类。
),所以就根据引⽤变量s持有的引⽤找到堆中的对象(⼦类对象),然后给name 跟age赋值。
4:调⽤say()⽅法,通过引⽤变量s持有的引⽤找到堆中的实例对象,通过实例对象持有的本类在⽅法区的引⽤,找到本类的类型信息,定位到say()⽅法。
say()⽅法⼊栈。
开始执⾏say()⽅法中的字节码。
5:say()⽅法执⾏完毕,say⽅法出栈,程序回到main⽅法,main⽅法执⾏完毕出栈,主线程消亡,虚拟机实例消亡,程序结束。
Java的private成员变量的继承问题
java板块关于private变量到底会不会被继承,⼀直都有争议。
另⼀种说法是⾮继承关系,但是不能够解释为什么。
分析内存的分配后发现:
当⼀个⼦类被实例化的时候,默认会先调⽤⽗类的构造⽅法对⽗类进⾏初始化,即在内存中创建⼀个⽗类对象,然后再⽗类对象的外部放上⼦类独有的属性,两者合起来成为⼀个⼦类的对象。
虽然说⼦类对象内存空间包含这个private变量,但是⼦类不能⾃⼰编写函数对这个private变量进⾏直接修改,访问。
只能通过继承下来的public函数对private变量进⾏修改,访问。
关于这些争议,最佳的解决办法是明⽩如何定义继承。
对于持⾮继承观点的⼈来说,继承下载的变量或⽅法必须得能够直接使⽤,即直接修改或访问。
这是符合传统的继承概念。
对于持继承观点的⼈来说,因为⼦类内存中有private变量,即⼦类拥有private变量,它就应该是继承的。
对于这两种想法,都有⼀定道理,但是书上定义偏向于第⼀种,因此个⼈接受第⼀种的思想。
java练习题答案第1章java语言概述习题一、填空题1、面向对象程序的主要特征:继承,__封装___,___多态_____。
2、java中的继承机制之所以能够降低程序的复杂性,提高程序的效率,主要是因为它使代码可以__重用或复用___.3、java语言中,为将源代码翻译成__字节码__文件时产生的错误称为编译错误,而将程序在运行中产生的错误称为运行错误。
4、javac是java语言中的编译器,基本语法是:javac[选项]__文件名__,java是java语言中的解释执行器,基本语法是:java[选项]___类名___.5、java语言的主要贡献者是谁Jamegoling二、单选题1、编译JavaApplication源程序文件将产生相应的字节码文件,这些字节码文件的扩展名为(B)。
A、javaB、.claC、htmlD、.e某e2、main方法是JavaApplication程序执行的入口点,关于main方法的方法首部,以下(B)项是合法的。
A、publictaticvoidmain()B、publictaticvoidmain(Stringarg[])C、publictaticintmain(String[]arg)D、publicvoidmain(Stringarg[])三、判断1、Java语言具有较好的安全性和可移植性及与平台无关等特性。
√2、Java语言的源程序不是编译型的,而是编译解释型的。
√四、问答题1、编写、运行java程序需要经过哪些主要步骤?答:1.编写源文件,扩展名必须是.java2.编写java源程序,使用java编译器编写源文件,得到字节码文件3.运行java程序,使用javaSE平台只不过的java解释器来解释执行字节码文件。
2、阅读下列java源代码文件,并回答问题publicclaSpeak{voidpeakHello(){Sytem.out.println(\);}}cla某iti8{publictaticvoidmain(Stringarg[]){Speakp=newSpeak();p.peakHello();}}(1)上述源文件的名字是什么?Speak.java(2)上述源文件编译后生成几个字节码文件,这些字节码文件的名字分别是什么?Speak.cla某iti8.cla第2章(1)基本数据类型练习题一、填空题1、java基本数据类型中整型,字符型分别占用字节数为___4___,___2____.2、java语言中的浮点数根据数据存储长度和数值精度的不同,进一步分为_float__和__double__两种具体类型。
Java2实用教程(第三版)课后习题参考答案第1章 Java入门1. 开发与运行Java程序需要经过哪些主要步骤和过程?答:(1)编写Java源文件:使用文本编辑器(Edit或记事本),拓展名为.java(2)编译Java源文件:使用Java编译器(javac.exe)。
得到字节码文件*.class(3)运行Java程序:Java应用程序使用Java解释器(java.exe)执行字节码文件;Java小应用程序使用支持Java标准的浏览器来执行。
2. 怎样区分应用程序和小应用程序?应用程序的主类或小应用程序的主类必须用public修饰吗?答:①应用程序必须有main方法,这个方法是程序执行的入口。
小应用程序没有main方法。
②应用程序的主类不一定用public修饰;小应用程序的主类必须用public修饰。
3. Java程序是由什么组成的?一个程序中必须要有public类吗?Java源文件的命名规则是怎样的?答:①Java程序由类组成。
②应用程序可以没有public类;小应用程序一定有一个类是public类(主类)。
③应用程序:如果只有一个类,源文件名与该类的类名相同,拓展名为.java;有多个类时,如果有public类(最多一个),源文件名与public类的类名相同,拓展名是.java;没有public类,源文件名与任何一个类的类名相同即可,拓展名为.java。
小应用程序:源文件名与主类的类名相同,拓展名是.java。
4. 在运行小程序的HTML文件中可以使用codebase属性指定小程序的字节码所驻留的目录。
如果不使用codebase属性,小程序的字节码文件必须和运行它的HTML文件在同一目录中。
编写一个小程序并将小程序的字节码存放在某个目录中,比如C:\5000;把运行该小程序的HTML文件(注意其中的codebase属性): <applet code=你的小程序的字节码 width=200 height=300 codebase=C:\5000></applet>存放在另一个目录中。
本文由我司收集整编,推荐下载,如有疑问,请与我司联系
Java 继承之子父类中的成员变量和函数
2015/05/09 102
//父类。
class Fu{ int num = 3;}class Zi extends Fu{ int num = 4; void show() { System.out.println(“num= “+this.num);}}class ExtendsDemo { public static void main(String[] args) { Zi z = new Zi(); z.show(); }}从一张图来看它的原理:
图有点乱,看一下顺序吧。
在代码中,super 和this 的用法很相似,this 代表的
是本类对象的引用,super 代表的是父类的内存空间。
成员函数:【子父类中成员函数的特点】特殊情况:子父类中的定义了一模一
样的函数。
运行的结果:子类的函数在运行。
这种情况在子父类中,是函数的另一个
特性:override(重写,覆盖,复写)
重写什么时候用?举例:
//描述手机。
class Phone{ int number; //打电话。
void call(){} //来电显示。
void show() { sop(“电话号码..”+number); }}Phone p = new Phone();p.show();随着电话的升级,只显示号码不爽,希望显示姓名,照片。
修改源码,虽然费劲但是可以解决,
不利于后期的维护和扩展。
为了扩展方便。
新功能是不是新的电话具备呢?单独描
述单独封装。
新电话也是电话中的一种。
继承。
直接获取父类中的功能。
但是新电
话的来显功能已经变化了。
需要重新定义。
那么定义一个新功能合适吗?比如newShow,不合适,因为父类已经将来显功能定义完了,子类完全不需要重新定义
新功能。
直接用就可以了。
如果子类的来显功能内容不同。
直需要保留来显功能,
定义子类的内容即可:这就是重写的应用!class NewPhone extends Phone{ String name; String picPath;//图片路径。
void show() { //sop(“电话号码”);super.show();//如果还需要父类中原有的部分功能,可以通过super 调用。
System.out.print(“姓名”+name);System.out.print(“照片”+picPath); }}【重写(覆盖)的注意事项】1,子类
覆盖父类,必须保证全要大于或者等于父类的权限。
Fu: private void show(){} Zi:。