一、继承
- 理解定义:继承就是一个物获得另一个物的东西,在java中就是一个类(子类)获得另一个类(父类)的属性和方法,子类在此基础上还可以延伸拓展。
- 关键字:extends
- 格式:public class 类名 extends 父类 { }
- 作用:在已有基础上继续进行功能的扩充;消除结构定义上的重复,使代码简洁高效。
- 现实生活中的“继承”关系:
西瓜—水果; 木桌子----木头; 金鱼—鱼类;大学生----学生; - 注:object是所有其他类的父类;Java中不允许多重继承,但是允许多层继承!多层继承一般不会超过三层
- 代码应用:
public class person {
String name;
int age;
//父类的构造方法
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age=age;
}
}
public class student extends person{
String hobby;
//添加子类的延伸属性
public String getHobby(){
return hobby;
}
public void setHobby(String hobby){
this.hobby=hobby;
}
}
public class test1 {
public static void main(String[] args)
{
student student=new student();
student.setName("爱丽丝");
student.setAge(18);
student.setHobby("爱吃冰淇淋");
System.out.println(" 姓名:"+student.getName() +" 年龄:"+student.getAge()+" 爱好:"+student.getHobby());
}
}
输出:
姓名:爱丽丝 年龄:18 爱好:爱吃冰淇淋
通过以上代码我们发现,子类可父类发生了继承关系之后,子类不仅可以直接继承父类的属性和方法,实现代码的重用,还可以拓展延伸功能。
二、访问权限
何为访问限权?即控制被修饰的内容能在哪些范围使用。
当前类 同包下的子类 不同包下的子类 不同包下的非子类
public ok ok ok ok
protected ok ok ok
缺省 ok ok
private ok
public:最海纳百川,在哪都可以调用它,整个工程下,同一个包下的不同类中,不同包下的不同类下等等;
private:私有的,只能自己用,只能在当前类下使用,出了当前类均不可以用
protected:被保护的,它的容量比public小一些,出了不同包下的子类的花括号就不可以使用,即不能在不同包下的非子类使用
缺省:前面啥也不写,有点默认的意思,它的功能比private强大点,可以在当前类和同一个package下的子类当中使用。
子类能拥有父类的哪些属性和方法?
子类继承父类,能拥有父类所有的属性和方法。部分属性和方法限于访问权限,不能直接使用。
1.子类会继承父类的所有成员 。但是父类对象中的私有属性和方法,子类是无法访问到,只是拥有,但不能使用。就像有些东西你可能拥有,但是你并不能使用。比如说是你父亲将家里的银行卡继承给了你,但是没有告诉你密码,你还是不能使用的,除非有密码,而在这里的密码就指的是getter和setter方法,如果父类中有getter方法,那么私有属性你是可以通过getter方法访问的。是的 就像是有了你爸爸才会有你
2.父类因为有私有属性不能被子类访问,复制这个说法应该不对 而且父类和子类是不能用内部类来相互定义的 内部类可以直接访问外部类的元素(包括私有域),要是将父类当成内部类岂不是分类可以访问子类独有的方法,显然是不可以的。
三、重写 和 转型
重写:父类的方法不能满足子类的需要,则子类可以重写父类的方法。
要求:
- 必须有继承关系。
- 父类的方法在子类中可见。
- 方法的声明,访问权限可以扩大,其他(返回值类型、方法名、参数)必须一致。
自动转型:子类对象可以自动的变为父类类型的对象。
自动转型后,方法的调用以子类为准。
场景练习
要求:
1、诸葛亮和李白PK,采用回合制,每次攻击让对方的血量减少,减少量为攻击方的攻击值。重复,直到某一方的血量小于等于0,胜利的一方继续和主宰PK, 主宰每次攻击让对方的血量减少,减少量为主宰的两倍攻击值。重复直到某一方的血量小于等于0;
2、每个类至多有一个攻击方法;
3、输出:战斗的过程、结果。
代码如下:
父类
public class Hero {
String name;
String skill;
int ad;
int hp;
//攻击方法1
public void attack1(Hero lb){
lb.hp=lb.hp-ad;
System .out.println(name+"使用"+skill+"攻击了"+lb.name+"使其失去了"+ad+"点生命值,剩余了"+lb.hp+"点。");
}
//攻击方法2
public void attack2(Hero lb){
lb.hp=lb.hp-2*ad;
System .out.println(name+"使用"+skill+"攻击了"+lb.name+"使其失去了"+2*ad+"点生命值,剩余了"+lb.hp+"点。");
}
}
子类1
public class Zhugeliang extends Hero {
}
子类2
public class Libai extends Hero {
}
子类3
public class Zhuzai extends Hero {
}
主方法运行
public class VTest {
public static void main(String[] args) {
System.out.println("游戏开始--->>>>");
//实例化对象
Hero zgl = new Zhugeliang();
Hero lb =new Hero();
Hero zz =new Hero();
//给对象赋值
lb.name="李白";
lb.skill="神来之笔";
lb.ad=99;
lb.hp=998;
zgl.name="诸葛亮";
zgl.skill="元气弹";
zgl.ad=85;
zgl.hp=1486;
zz.name="主宰";
zz.skill="末日狂欢";
zz.ad=80;
zz.hp=1200;
System.err.println("准备就绪!");
System.out.println("开始PK");
//作战运行条件
while(lb.hp>0&&zgl.hp>0){
lb.attack1(zgl);
if(zgl.hp>0){
zgl.attack1(lb);
}
}
//胜利的一方与主宰作战
while(lb.hp>0&&zz.hp>0){
zz.attack2(lb);
if(lb.hp>0){
lb.attack2(zz);
}
}
while(zgl.hp>0&&zz.hp>0){
zz.attack2(zgl);
if(zgl.hp>0){
zgl.attack2(zz);
}
}
//输出结果
if(zgl.hp<0&&zz.hp<0){
System.out.println("李白Win!");
}
else if(zgl.hp<0&&lb.hp<0){
System.out.println("主宰Win!");
}
else if(zz.hp<0&&lb.hp<0){
System.out.println("诸葛亮Win!");
}
}
}
输出结果:
游戏开始--->>>>
准备就绪!
开始PK
李白使用神来之笔攻击了诸葛亮使其失去了99点生命值,剩余了1387点。
诸葛亮使用元气弹攻击了李白使其失去了85点生命值,剩余了913点。
李白使用神来之笔攻击了诸葛亮使其失去了99点生命值,剩余了1288点。
诸葛亮使用元气弹攻击了李白使其失去了85点生命值,剩余了828点。
李白使用神来之笔攻击了诸葛亮使其失去了99点生命值,剩余了1189点。
诸葛亮使用元气弹攻击了李白使其失去了85点生命值,剩余了743点。
李白使用神来之笔攻击了诸葛亮使其失去了99点生命值,剩余了1090点。
诸葛亮使用元气弹攻击了李白使其失去了85点生命值,剩余了658点。
李白使用神来之笔攻击了诸葛亮使其失去了99点生命值,剩余了991点。
诸葛亮使用元气弹攻击了李白使其失去了85点生命值,剩余了573点。
李白使用神来之笔攻击了诸葛亮使其失去了99点生命值,剩余了892点。
诸葛亮使用元气弹攻击了李白使其失去了85点生命值,剩余了488点。
李白使用神来之笔攻击了诸葛亮使其失去了99点生命值,剩余了793点。
诸葛亮使用元气弹攻击了李白使其失去了85点生命值,剩余了403点。
李白使用神来之笔攻击了诸葛亮使其失去了99点生命值,剩余了694点。
诸葛亮使用元气弹攻击了李白使其失去了85点生命值,剩余了318点。
李白使用神来之笔攻击了诸葛亮使其失去了99点生命值,剩余了595点。
诸葛亮使用元气弹攻击了李白使其失去了85点生命值,剩余了233点。
李白使用神来之笔攻击了诸葛亮使其失去了99点生命值,剩余了496点。
诸葛亮使用元气弹攻击了李白使其失去了85点生命值,剩余了148点。
李白使用神来之笔攻击了诸葛亮使其失去了99点生命值,剩余了397点。
诸葛亮使用元气弹攻击了李白使其失去了85点生命值,剩余了63点。
李白使用神来之笔攻击了诸葛亮使其失去了99点生命值,剩余了298点。
诸葛亮使用元气弹攻击了李白使其失去了85点生命值,剩余了-22点。
主宰使用末日狂欢攻击了诸葛亮使其失去了160点生命值,剩余了138点。
诸葛亮使用元气弹攻击了主宰使其失去了170点生命值,剩余了1030点。
主宰使用末日狂欢攻击了诸葛亮使其失去了160点生命值,剩余了-22点。
主宰Win!
2574





