Java学习笔记(三)

2018.6.3

类的继承

1.为什么需要使用继承?
(1)提高代码的重用性;
(2)提高程序的扩展性。
2.Java类继承类的语法格式
(1)Java中类继承类的关键字:extends
格式:
public class 类名  extends 类名 {

}
注意:Java中类只能继承一个父类(单继承);

(2)现实生活中什么样的关系需要使用继承来实现?
包含关系
3.子类能继承到父类的那些内容?
(1)子类能继承到父类所有的属性和方法;

要调用父类属性和方法,就要根据访问修饰符来确定了(亦即public,protected,private),对于父类的属性,可以通过get和set接口来访问亦即setName()、getName()等等。

       (2)子类是否还可以定义父类中没有定义过的属性和方法呢?

答案肯定是可以的。
4.方法重写
实现方法重写,必须要满足的条件:
(1)必须要存在继承关系;
(2)子类在重写方法时,子类方法的访问修饰符必须要大于或者等于父类方法的访问修饰符;(访问修饰符的范围为:public 、protected、默认的 、 private)这句话的意思就是,比如你父类方法的修饰符为private时,你在子类重写的时候需要将修饰符改为public、protected、默认的都可以。
(3)子类在重写方法时,子类方法的返回值类型,方法名,参数都必须要和父类的完全一致;
(4)方法中的代码要不同。

有个地方需要注意一下的,比如我现在有Student这个父类和UNStudent这个子类,假如他们都有study()这个学习方法。那么现在我这样定义一个对象:Student st = new  UNStudent();st.study()。那么它调用的是谁的study()方法呢?答案是UNStudent的study(),因为是用new后面的类是初始化对象的,所以st对象被UNStudent的首地址初始化了,肯定是访问的UNStudent的方法。因此Java在调用时:根据new关键字后的类名来决定,如果类名是子类的,则优先调用子类的方法,如果子类没有才会调用父类的。

       如果你想在子类重写的方法中调用父类的方法,怎么做呢?(比如在子类的study()调用父类的study())

那么就要用super调用父类中的方法(super表示父类的对象,这是已经封装好的)
5.场景:**老师正在教大学生学习英语;这位老师是否可以教高中生英语?初中生?小学生?学生类型有10种呢?......
class Teacher { String name;
teach(Student un){ un.study() }
}
class Student { String name; study(); }
class UNStudent extends Student { study(); }
class GStudent extends Student {  study(); }
class CStudent extends Student {  }
class XStudent extends Student {  }
6.接口
定义接口的关键字:interface
public interface 接口名  extends 接口,... {
//常量
public static final 数据类型  常量名 = 值;
//抽象方法
public abstract 返回值数据类型  方法名(数据类型 参数名,...);
}
实现接口的关键字:implements
public class 类名   extends 类名或抽象类  implements 接口名,... {
//重写接口中所有的抽象方法,如果有任何一个抽象方法没有实现,则编译输出错
}

抽象类
public abstract class 类名   extends 类名或抽象类  implements 接口名,... {

}
抽象类是介于类和接口之间的一种特殊类;抽象类即有类的特性又有接口的特性。


接口和抽象类都不能实例化对象(也就是不能new初始化一个对象)

7.练习
回合对战游戏:
奥特曼A和小怪兽A进行PK,直到一方的血量为0时结束战斗,谁出谁胜利了!
如果奥特曼A胜利,则奥特曼A和奥特曼B进行PK,直到一方的血量为0时结束战斗,谁出谁胜利了!
如果小怪兽A胜利,则小怪兽A和小怪兽B进行PK,直到一方的血量为0时结束战斗,谁出谁胜利了!

每个类中只能有一个攻击方法,攻击方法只能有一个参数。

参考代码如下:

主要是体现的继承关系,逻辑有点小问题,就是每次调用攻击方法,是自身的血量减少。后期我会改进的。

首先找出奥特曼和怪兽共有的属性和方法:伤害、血量、名字、以及一些修改这些属性的方法。

然后将其封装成一个Father类。

然后再定义一个奥特曼类和怪兽类即可。



public class Father {
private String name;//名字是私有的
public int blood;//血量公有
public int fight;//攻击力公有

public int attack(Father A)
{
A.blood = A.blood-2;//攻击方式
if(A.blood<=0)  
return 0;

return 1;

}
public String getName()
{
return name;
}
public int getblood()
{
return blood;
}
public int getfight()
{
return fight;
}
public void setName(String str)
{
name = str;
}
public void setblood(int bl)
{
blood = bl;
}
public void setfight(int f)
{
fight=f;

}



public class Aoteman extends Father {
public void Init(String str,int bl,int f)
{
setName(str);
setblood(bl);
setfight(f);
System.out.println(getName()+"开始战斗!它的初始信息如下:");
System.out.println("血量:"+getblood());
System.out.println("攻击力:"+getfight());

}
public int attack(Aoteman A)
{
A.setblood(A.getblood()-A.getfight());
System.out.println(A.getName()+"剩余血量:"+A.getblood());
if(A.getblood()<=0) return 0;
return 1;
}


}



public class Master extends Father {
public void Init(String str,int bl,int f)
{
setName(str);
setblood(bl);
setfight(f);
System.out.println(getName()+"开始战斗!它的初始信息如下:");
System.out.println("血量:"+getblood());
System.out.println("攻击力:"+getfight());

}
public int attack(Master M)
{
M.setblood(M.getblood()-M.getfight());
System.out.println(M.getName()+"剩余血量:"+M.getblood());
if(M.getblood()<=0) return 0;
return 1;
}

}


public class Fight {

public static void main(String[] args) {

Aoteman A = new Aoteman();
Aoteman B = new Aoteman();
Master Aa = new Master();
Master Bb = new Master();
int flag1 = 0;
int flag2 = 0;
A.Init("奥特曼A", 20, 1);
Aa.Init("小怪兽A", 24, 3);
while(true)
{

int f1=Aa.attack(Aa);

if(f1==0)
{
System.out.println(A.getName()+" win!");
flag1 = 1;
break;
}
int f2=A.attack(A);
if(f2==0)
{
System.out.println(Aa.getName()+" win!");
flag1 = 0;
break;
}


}

if(flag1==1)
{

A.Init("奥特曼A", 20, 1);
B.Init("奥特曼B",26,2);
while(true)
{
if(A.attack(A)==0)
{
System.out.println(B.getName()+" win!");
break;
}
if(B.attack(B)==0)
{
System.out.println(A.getName()+" win!");
flag1 = 1;
break;
}
}
}
if(flag2==1)
{

Aa.Init("小怪兽A", 20, 2);
Bb.Init("小怪兽B",22,2);
while(true)
{
if(Aa.attack(Aa)==0)
{
System.out.println(Bb.getName()+"win!");
break;
}
if(Bb.attack(Bb)==0)
{
System.out.println(Aa.getName()+"win!");
flag1 = 1;
break;
}
}
}
}
}

}

加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值