[转载] java-继承和多态
参考链接: Java中的继承
继承:
继承就是保持已有类的特性而构造新类的过程。继承后,子类能够利用父类中定义的变量和方法,就像它们属于子类本身一样。
单继承:在类层次中,子类只继承一个父类的数据结构和方法,一个类只有一个父类
多继承:在类层次中,子类继承了多个父类的数据结构和方法,一个类允许有多个继承
(java支持多层继承)
//父类
public class file{
public long size; //文件大小
public String name; //文件名
public void info() //显示文件信息
{
System.out.println(name + " " + size);
}
}
//子类
public class videofile extends file()
{
//父类的public成员自动继承
//private不能被继承,子类无权访问
//只需要添加子类的特性
public int duration //时长
public void play()
{
System.out.println("播放" + this.name);
}
public void stop()
{
System.out.println("停止" + this.name);
}
}
成员变量隐藏:是指在子类中定义了一个与直接超类的某个成员变量同名的成员变量,从而使超类中的那个成员变量不能直接被子类继承。
当成员变量隐藏时,在超类类题代码中用简单变量命名访问的一定是超类中的成员变量,而在子类类体代码中用简单变量名访问的则一定是在子类中的成员变量
可以用下列各式访问超类中被隐藏的成员变量
super.<变量名> 在子类类体里,访问直接超类中被隐藏的成员变量
((<超类名>)<子类实例引用>).变量名 访问指定超类中被隐藏的成员变量
<超类名>.<变量名> 访问指定超类中被隐藏的类变量
public class number {
int x;
static int y; //类变量
void set(int a)
{
x = a;
y = a;
}
void print()
{
System.out.println("x" + "\t" + x);
}
}
public class newnumber extends number {
int x;
static int y;
void newset(int a)
{
x = a;
y = a;
}
void newprint()
{
System.out.println("x" + "\t" + x); //x = 100
System.out.println("y" + "\t" + y); //y = 100
System.out.println("x" + "\t" + super.x); //x = 10
//在子类类体里,访问直接超类中被隐藏的成员变量
System.out.println("y" + "\t" + super.y); //y = 10
}
}
public class HelloWorld {
public static void main(String[] args) {
newnumber n = new newnumber();
n.set(10);
n.print();
n.newset(100);
n.newprint();
System.out.println("y" + "\t" + number.y); //y = 10
System.out.println("x" + "\t" + ((number)n).x); //x= 10
}
}
若子类和父类里都有相同的名字定义的方法,但是实现不一致。覆盖的方法是按照子类中重定义的方法进行调用,而继承的方法直接调用父类的方法
覆盖 (重写)(Override):
1、方法名称要一样
2、返回值数据类型要一样
3、所使用的参数列表要一样,参数列表包括参数个数及每个参数的数据类型,不包括参数的变量名
4、访问修饰符只能越来越开放,不能越来越封闭
public class file {
public long size;
public String name;
public void info()
{
System.out.println(name + "\t" + size);
}
}
public class vediofile extends file{
public int duration;
public void play()
{
System.out.println("播放" + this.name);
}
public void stop()
{
System.out.println("停止" + this.name);
}
//Override 覆盖
public void info() {
System.out.println("name : " + name + " size : " + size + " time : " + time);
}
}
public class HelloWorld {
public static void main(String[] args) {
vediofile v = new vediofile();
v.size = 20000;
v.name = "abc.mp4";
v.duration = 70;
v.info();
//name : abc.mp4 size : 20000 time : 70
}
}
泛化:
抽取调整代码到父类的过程,称为泛化
Eclipse自动添加覆盖功能:
点击source,选择Override/Implement Methods
选择要覆盖的方法
创建完成
子类可以选择完全重写或者在父类方法中补充
public void info() {
// TODO Auto-generated method stub
super.info(); //调用父类的实现
System.out.println("time : " + duration);
//name : abc.mp4 size : 20000 time : 70
}
构造方法的继承:
创建子类对象时,父类的构造方法会被自动调用
public class parent {
public parent()
{
System.out.println("父类构造...");
}
}
public class child extends parent {
public child()
{
System.out.println("子类构造...");
}
}
public class HelloWorld {
public static void main(String[] args) {
child c = new child();
}
}
若父类有很多个构造方法,可以在子类里显示指定用哪个构造方法
public class parent {
private int a;
public parent() //默认构造
{
System.out.println("父类构造...");
}
public parent(int a) //带参构造
{
this.a = a;
System.out.println("带参父类构造...");
}
}
public class child extends parent {
public child()
{
super(23); //调用带参构造
System.out.println("子类构造...");
}
}
public class HelloWorld {
public static void main(String[] args) {
child c = new child();
}
}
单根继承:Java语言里,一个类只能继承一个父类
如果一个类没有指定父类,则它的默认父类就是Object
toString() 方法返回此对象本身(它已经是一个字符串)
public class Student {
public String id;
public String name;
public boolean sex;
@Override
public String toString() {
String s = " 学号 : " + id + " 姓名 : " + name;
if(sex)
{
s = s + "(男)";
}
else
{
s = s + "(女)";
}
return s;
}
}
public class HelloWorld {
public static void main(String[] args) {
Student s = new Student();
s.id = "20003";
s.name = "lisi";
System.out.println(s.toString()); // 学号 20003 姓名 lisi(女)
}
}
多态
1、使用父类类型的引用只想子类的对象
2、该引用只能调用父类中定义的方法和变量
3、如果子类中重写(覆盖)了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法
4、变量不能被重写(覆盖),重写只针对方法,如果在子类中重写了父类的变量,编译时会报错
子类转成父类是可以的(隐式转换)
当调用一个方法的时候,不是看引用类型,而是看对象的实际类型。
转化原则
子类对象可以当作父类对象使用
父类对象不能当作子类对象使用
如果父类引用实际只想的是子类对象,那么该父类引用可以通过强制转化成子类对象使用
public class file {
public long size;
public String name;
public void info()
{
System.out.println("name : " + name + " size : " + size);
}
}
public class vediofile extends file{
public int duration;
public void play()
{
System.out.println("播放" + this.name);
}
public void stop()
{
System.out.println("停止" + this.name);
}
@Override
public void info() {
// TODO Auto-generated method stub
super.info();
System.out.println("time : " + duration);
}
}
public class HelloWorld {
public static void main(String[] args) {
vediofile v = new vediofile();
v.size = 20000;
v.name = "abc.mp4";
v.duration = 70;
file f = v;
f.info(); //调用的子类的info
}
}
覆盖是动态绑定
重载是静态绑定
用instanceof操作符测试一个对象是否是一个类的实例
instanceof返回值是true或false
对象名 instanceof 类名 -> true or false
class SchoolMember
{
public void introduce()
{
System.out.println("a schoolmember");
}
}
class Student extends SchoolMember
{
public void study()
{
System.out.println("study");
}
}
class Teacher extends SchoolMember
{
public void teach()
{
System.out.println("teach");
}
}
class Test
{
static void use(SchoolMember obj)
{
obj.introduce();
//判断实例化的对象是Student还是Teacher
if(obj instanceof Student)
{
Student s = (Student)obj;
s.study();
}
if(obj instanceof Teacher)
{
Teacher t = (Teacher)obj;
t.teach();
}
}
public static void main(String[] args)
{
Student s1 = new Student();
//Teacher t1 = new Teacher();
use(s1);
//use(t1);
}
}
eg:
a schoolmember
study
方法看右侧,属性看左侧
先访问父类的构造方法再访问子类的构造方法
eg1:
class A
{ String s="class A"; }
class B extends A
{ String s="class B"; }
public class TypeConvert
{
public static void main(String args[])
{
B b1,b2=new B();
A a1,a2;
a1=(A)b2;
a2=b2;
System.out.println(a1.s); //class A
System.out.println(a2.s); //class A
b1=(B)a1;
System.out.println(b1.s); //class B
System.out.println(b2.s); //class B
}
}
eg2 :
class A
{ String s="class A";
void show() { System.out.println(s);}
}
class B extends A
{ String s="class B";
void show() { System.out.println(s);}
}
public class TypeConvert
{ public static void main(String args[]) {
B b1;
B b2=new B();
A a1,a2;
a1=(A)b2;
a2=b2;
System.out.println(a1.s); //class A
a1.show(); //class B
System.out.println(a2.s); //class A
a2.show(); //class B
b1=(B)a1;
System.out.println(b1.s); //class B
b1.show(); //class B
System.out.println(b2.s); //class B
b2.show(); //class B
}
}
eg3:
class A
{
public A()
{
System.out.println(“The default constructor of A is invoked”);
}
}
class B extends A
{
public B()
{
}
}
public class C
{
public static void main(String[] args)
{
B b = new B();
}
}
输出 The default constructor of A is invoked
[转载] java-继承和多态相关推荐
- 学习-Java继承和多态之子类继承性
第1关:学习-Java继承和多态之子类继承性 任务描述 相关知识 编程要求 测试说明 任务描述 本关任务:定义一个 Dog 类,继承 Animal 类(Animal 类已经定义),定义自己的性别属性, ...
- 学习-Java继承和多态之方法重载
第1关:学习-Java继承和多态之方法重载 任务描述 相关知识 编程要求 测试说明 任务描述 本关任务:使用重载方法为 Student 类创建三个构造方法. 相关知识 Java 中重载是指一个类中可以 ...
- java继承和多态的实验报告_Java继承与多态实验报告.doc
Java继承与多态实验报告 西 安 邮 电 大 学 (计算机学院) 课内实验报告 实验名称: 继承与多态 专业名称: 计算机科学与技术 班 级: 计科1405班 学生姓名: 高宏伟 学 号: 指导教师 ...
- 头歌实践-Java继承与多态
头歌实践作业 第1关:练习-Java继承和多态之final关键字 第2关:学习-Java继承和多态之对象类型的转换 任务描述 相关知识 向上转型 向下转型 编程要求 第3关:练习-Java继承和多态之 ...
- 学习-Java继承和多态之子类对象特点
第1关:学习-Java继承和多态之子类对象特点 任务描述 相关知识 子类对象的特点 instanceof 运算符 编程要求 测试说明 任务描述 本关任务:使用 instanceof 运算符判断所指对象 ...
- 学习-Java继承和多态之final关键字
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 题目:学习-Java继承和多态之final关键字. 任务:调试代码,对代码进行增添.删除和修改等操作,使得程序能够正常运行,输出结果请 ...
- java继承和多态的实验报告_JAVA,继承和多态实验报告
实验项目名称 : 继承和多态 ( 所属课程 : Java 语言程序设计 ) 院 系: 专业班级: 姓 名: 学号: 实验地点: 指导老师: 本实验项目成绩: 教师签字: 日期: 1.实验目的 (1)掌 ...
- java继承与多态_Java继承与多态
感慨一下,到了现在感觉Java里面很多东西都是模模糊糊,不能这样了,一点点解决吧.今天看了继承与多态的一些内容,感觉看得很浅,先写下来,算是巩固,如果后面看到更好的内容,再慢慢加上去. 继承与多态,他 ...
- java 继承与多态 习题_JAVA基础 第4章继承与多态_练习题_200910
Java基础第4章练习题大外软件学院 第4章继承与多态 一.选择题 1. 编译和运行以下两文件结果是( D ). //文件P1.java package MyPackage; class P1{ vo ...
- JAVA继承和多态详细讲解
面向对象编程的重要知识:继承和多态.通过类的继承机制,可以使用已有的类为基础派生出新类,无需编写重复的程序代码,很好地实现程序代码复用.多态是面向对象编程中继封装和继承之后的另一大特征,它具体是指同一 ...
最新文章
- ASP.NET Razor – C# 循环和数组简介
- [CareerCup] 11.1 Merge Arrays 合并数组
- unity 给图片边缘_Unity Shader 屏幕后效果——边缘检测
- 三维重建-opencv实现sfm
- React的Ant Design Pro目录结构
- php 设置统一处理错误,统一的PHP错误处理理论
- 河北师范大学计算机应用技术分数线,2019年河北师范大学各专业录取分数线
- Hibernate多对多双向关联需要注意的问题(实例说话)
- 一篇文章搞懂filebeat(ELK)
- PROFILER 技术总结(二): 利用Monte Carlo Profiler 工具
- 用java读取word2003和word2007的内容
- 服务器安装mysql文档_Linux 服务器安装MySQL数据库
- 干货 | attention超全综述
- poj 3007 stl
- iPhone13全系列参数对比
- 浅谈FineReport常用函数及使用时报错的解决办法
- LaTeX无图片编号
- 沉思的片刻,我们都是哲学家
- 推荐系统论文阅读——Factorizing Personalized Markov Chains for Next-Basket Recommendation
- UI自动化执行遇到的问题汇总
热门文章
- Springboot国际化信息(i18n)解析
- java多线程编程_《java多线程编程实战指南》读书笔记 -- 基本概念
- 计算机控制基础知识,最新 分析计算机控制系统及其运算基础知识-精品
- java jive歌词_Java Jive_Manhattan Transfer with Phil Collins_高音质在线试听_Java Jive歌词|歌曲下载_酷狗音乐...
- hashmap remove 没释放内存_java从零开始手写 redis(13)HashMap 源码原理详解
- Qt图形界面编程入门(基本窗口及控件)
- 360手柄摇杆漂移修复_彻底解决你的Switch手柄摇杆问题,最省钱的完美修复。
- python字符串是否包含某元素_Python实现判断一个字符串是否包含子串的方法总结...
- 【SpringBoot 2】(二)快速入门案例HelloWorld
- window设置快捷键左右方向键