类的继承
2016-04-14 20:02
295 查看
类和对象 类的继承
一.背景简介
1.开发平台:Eclipse
2.开发语言: java语言
二.理论依据
1.什么是继承
生活中:父母与子女、有包含关系的(如圆桌,方桌,都包含在桌子里)
上图都是桌子,只是形状不一样,可以看为继承于桌子。
程序中:
关键字 extends
public class 类名(子类、派生类、超类)extends 类名(父类、基类){
}
2.为什么要继承
1).减少代码重复,提高代码重用性
2).提高代码扩展性
3.关于四种修饰符的范围大小
访问修饰符 同类中 同包中 不同包中 不同包但有继承关系的子类中
private
可以 不可以
不可以 不可以
默认的 可以 可以不可以
不可以
protected
可以 可以 不可以 可以
public 可以 可以可以
可以
注意:
a.一个子类只能继承一个父类
b.子类能继承到父类所有的属性和方法,但是并不能调用所有的,要看修饰符,修饰符范围public>protected>默认>private
c.子类还可以自己定义父类所没有的
d.子类中必须要调用父类一个构造方法,否则程序编译报错;调用父类构造方法关键字是super。
e.子类可以定义父类中没有的属性和方法。
4.方法重写
子类跟父类的方法不一样时,需要用到重写,比如说学生类是总类,大学生、中学生类继承于学生类,就可以在总类里定义也study方法,因为大、中学生study方法不一样,继承之后就可以重写这个方法。
注意:
a.一定要有继承关系
b.子类修饰符范围>父类
c.子类重写的返回值,方法名,参数必须与父类完全一样
d.调用看new后面的类名
5.自动转型
必要有继承关系
父类 对象名=new 子类();
生活中举例,比如老师教学生,学生分为大学生小学生中学生,大、中、小学生都要定义类,但是在老师教学生这里,可以用自动转型,直接斜纹teacher teach(student),然后定义一个student类,让大、中、小学生都继承于student
注意:
编译时看对象名前面的类,运行看new后面的类
存储时看的是=前面的。
就是说,调用一个方法时,如果父类中没有,即会报错,如果父类子类都有,则调用的是子类的方法。
Java编译机制的问题:
Java在编译程序时,只会根据对象名的类型去查找方法是否存在,如果存在,则编译通过,如果不存在则编译报错。
编译的是.java的文件。
运行的是内存中的对象。
6.多态
多态是由方法重载、继承、方法重写、自动转型技术组合的特性。
面向对象编程有三大特性:继承、多态、封装
三.代码应用及分析
情景:.回合制对战游戏:奥特曼A和小怪兽A进行PK,直到一方的血量为0时结束战斗,输出谁胜利了!
如果奥特曼A胜利,则奥特曼A和奥特曼B进行PK,直到一方的血量为0时结束战斗,输出谁胜利了!
如果小怪兽A胜利,则小怪兽A和小怪兽B进行PK,直到一方的血量为0时结束战斗,输出谁胜利了!
要求:类中只能有一个攻击方法,并方法的参数只能有一个。
分析:
对象:角色(奥特曼和小怪兽实际上都是角色,他们可以看为角色的子类)
特征:姓名,血量
行为:对战(另一方)
1.定义一个角色类
2.定义奥特曼类
3.定义小怪兽类
4.定义总类
四.测试
如图,编译通过,运行结果正确
一.背景简介
1.开发平台:Eclipse
2.开发语言: java语言
二.理论依据
1.什么是继承
生活中:父母与子女、有包含关系的(如圆桌,方桌,都包含在桌子里)
上图都是桌子,只是形状不一样,可以看为继承于桌子。
程序中:
关键字 extends
public class 类名(子类、派生类、超类)extends 类名(父类、基类){
}
2.为什么要继承
1).减少代码重复,提高代码重用性
2).提高代码扩展性
3.关于四种修饰符的范围大小
访问修饰符 同类中 同包中 不同包中 不同包但有继承关系的子类中
private
可以 不可以
不可以 不可以
默认的 可以 可以不可以
不可以
protected
可以 可以 不可以 可以
public 可以 可以可以
可以
注意:
a.一个子类只能继承一个父类
b.子类能继承到父类所有的属性和方法,但是并不能调用所有的,要看修饰符,修饰符范围public>protected>默认>private
c.子类还可以自己定义父类所没有的
d.子类中必须要调用父类一个构造方法,否则程序编译报错;调用父类构造方法关键字是super。
e.子类可以定义父类中没有的属性和方法。
4.方法重写
子类跟父类的方法不一样时,需要用到重写,比如说学生类是总类,大学生、中学生类继承于学生类,就可以在总类里定义也study方法,因为大、中学生study方法不一样,继承之后就可以重写这个方法。
注意:
a.一定要有继承关系
b.子类修饰符范围>父类
c.子类重写的返回值,方法名,参数必须与父类完全一样
d.调用看new后面的类名
5.自动转型
必要有继承关系
父类 对象名=new 子类();
生活中举例,比如老师教学生,学生分为大学生小学生中学生,大、中、小学生都要定义类,但是在老师教学生这里,可以用自动转型,直接斜纹teacher teach(student),然后定义一个student类,让大、中、小学生都继承于student
注意:
编译时看对象名前面的类,运行看new后面的类
存储时看的是=前面的。
就是说,调用一个方法时,如果父类中没有,即会报错,如果父类子类都有,则调用的是子类的方法。
Java编译机制的问题:
Java在编译程序时,只会根据对象名的类型去查找方法是否存在,如果存在,则编译通过,如果不存在则编译报错。
编译的是.java的文件。
运行的是内存中的对象。
6.多态
多态是由方法重载、继承、方法重写、自动转型技术组合的特性。
面向对象编程有三大特性:继承、多态、封装
三.代码应用及分析
情景:.回合制对战游戏:奥特曼A和小怪兽A进行PK,直到一方的血量为0时结束战斗,输出谁胜利了!
如果奥特曼A胜利,则奥特曼A和奥特曼B进行PK,直到一方的血量为0时结束战斗,输出谁胜利了!
如果小怪兽A胜利,则小怪兽A和小怪兽B进行PK,直到一方的血量为0时结束战斗,输出谁胜利了!
要求:类中只能有一个攻击方法,并方法的参数只能有一个。
分析:
对象:角色(奥特曼和小怪兽实际上都是角色,他们可以看为角色的子类)
特征:姓名,血量
行为:对战(另一方)
1.定义一个角色类
<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong>public class role{ private String name; int blood; public void setName(String n){ name=n;} public String getName(){ return name;} public void pk(role r){ r.blood--;}</strong></span>
2.定义奥特曼类
<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong>public class aoteman extends role{ public void pk(xiaoguaishou xgs){ xgs.blood--; System.out.println(getName()+”与”+xgs.getName()+”战斗”}; If(xgs.blood==0) System.out.println(getName()+”胜利了”}; </strong></span>
3.定义小怪兽类
<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong>public class xiaoguaishou extends role{ public void pk(aoteman atm){ atm.blood--; System.out.println(getName()+”与”+atm.getName()+”战斗”}; If(atm.blood==0) System.out.println(getName()+”胜利了”};</strong></span>
4.定义总类
<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong>public class manager{ public static void main{String[] args){ aoteman a=new aoteman(); aoteman b=new aoteman(); a.name=”奥特曼A”; b.name=”奥特曼B”; a.blood=5; b.blood=5; xiaoguaishou c=new xiaoguaishou(); xiaoguaishou d=new xiaoguaishou(); c.name=”小怪兽A”; d.name=”小怪兽B”; c.blood=5; d.blood=5; while(a.blood>o&&c.blood>0){ a.pk(c); If(c.blood==0){ while(a.blood>0&&b.blood>0){ b.pk(a); If(a.blood==0){ break;} a.pk(b); } break; } c.pk(a); If(a.blood==0){ while(c.blood>0&&d.blood>0){ d.pk(c); If(c.blood==0){ break;} c.pk(d); break;}}}</strong></span>
四.测试
如图,编译通过,运行结果正确
相关文章推荐
- java字符数组的处理
- 方法可以返回局部变量的引用
- SGU 119 Magic Pairs(一元线性同余方程)
- 在使用springmvc上传图片时碰到的 The current request is not a multipart request问题
- 周总结(第六周)
- 向tiny6410移植tslib(tslib-1.4)
- 12个不可不知的Sublime Text应用技巧和诀窍
- 中点算法之y=x^2/16
- Hibernate Map集合映射属性,创建表失败或表不存在
- PHP正则表达式
- 增强学习笔记2
- 查找单链表的倒数第k个节点,要求只能遍历一次链表(C语言)
- Lampyridae Teleportae
- Android网络知识
- c++第3次作业
- 给js创建的一个input数组绑定click事件
- 用inline替换#define的好处
- 查找单链表的中间节点,要求只能遍历一次链表(C语言)
- unity脚本中内部类的使用
- HDU 5661/BC 79B Claris and XOR