我的总结3《继承》
1.格式:
java继承的关键字是:extends
格式: (基类和超类)
public class 类名(子类名) extends 类名(父类名) {
}
注意:Java中类的继承是单继承
2.子类继承到了父类的那些属性和方法:
所有的属性和方法(构造方法除外)。
private ,protected ,默认的 ,public
但private的子类不能直接使用
3•能调用的属性的方法:
1.子类和父类在同一个包下:
私有的属和私有的方法不能被子类或子类对象调用。
默认的,受保护的,公有的属性和方法能被子类或子类对象调用。
2.子类和父类在不同的包下:
只有公有的属性和方法能被子类和子类的对象调用。
受保护的属性和方法能被子类调用
私有的和默认的属性和方法不能被子类以及子类的对象调用。
4.方法重写的条件:
1.返回值类型,方法名,参数个数,参数类型,参数顺序必须要相同
2.访问修饰符:子类重写方法的访问修饰分可以大于或者等于父类方法的访问修饰符。
默认的,protected 可以修改为 public
注意:子类中可以对父类的方法进行重写
5.子类可以定义自己的属性和方法。
在创建子类对象时,实际上也创建了父类的对象(参见Test5)
6.若父类中定义了构造方法(没有再写默认的),则子类中必须写出与父类中对应的构造方法,把名字换成子类名,然后运用super()函数。(参见Text1)
7.访问修饰符的范围:
1.private 在类的()里面
2.默认的 在同包的任何类中
3.protected 在同包下和不同包的子类中
4.public 在任何类中都可以
8.对象的自动转型
要实现自动转型必须要存在继承关系。
格式:
1.父类名 对象名 = new 子类构造方法();
2.在另一个类中定义方法时:
该类的方法名(父类名 对象名);
然后在使用该方法时可以传子类的对象名
但请注意!:不能调用子类自己定义的方法。(Java的编译机制引起的问题)
9.多态
多态是由Java的方法重载,继承,方法重写,自动转型等技术的组合。
10.面向对象的三大特性:1.继承 2.多态 3.封装
实验代码:模拟简单游戏,战士和怪兽对打
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
Skill [] skillSol = {new Skill("普通攻击",1),new Skill("暴击",3),new Skill("大招",5)};
Soldiers sol = new Soldiers("战士",10,skillSol);
Skill [] skillBoss = {new Skill("抓",1),new Skill("踢",2),new Skill("咬",3),new Skill("喷火",6)};
Monster boss = new Monster("怪兽",10,skillBoss);
while(sol.getBlood() > 0 && boss.getBlood() >0){
sol.fight(boss);
if(boss.getBlood() <= 0){
System.out.println(sol.getName()+"胜利了!");
break;
}
boss.fight(sol);
if(sol.getBlood() <= 0){
System.out.println(boss.getName()+"胜利了!");
break;
}
}
}
}
import java.util.Random;
public class Man {
private String name;
private int blood;
private Skill[] skill;
public Man(String name, int blood, Skill[] skill) {
this.name = name;
this.blood = blood;
this.skill = skill;
}
public void setName(String n) {
name = n;
}
public String getName() {
return name;
}
public void setBlood(int b) {
blood = b;
}
public int getBlood() {
return blood;
}
public void fight(Man enemy) {
Random rand = new Random();
int value = rand.nextInt(skill.length);
enemy.blood = enemy.blood - skill[value].getPower();
System.out.println(name+"使用了"+skill[value].getName()+"使"+enemy.getName()+"掉血"+skill[value].getPower());
}
}
public class Monster extends Man{
public Monster(String name,int blood, Skill[] skill){
super(name,blood,skill);
}
}
public class Soldiers extends Man {
public Soldiers(String name,int blood, Skill[] skill){
super(name,blood,skill);
}
}
public class Skill {
private String name;
private int power;
public Skill(String name, int power) {
this.name = name;
this.power = power;
}
public String getName() {
return name;
}
public int getPower() {
return power;
}
}
1.格式:
java继承的关键字是:extends
格式: (基类和超类)
public class 类名(子类名) extends 类名(父类名) {
}
注意:Java中类的继承是单继承
2.子类继承到了父类的那些属性和方法:
所有的属性和方法(构造方法除外)。
private ,protected ,默认的 ,public
但private的子类不能直接使用
3•能调用的属性的方法:
1.子类和父类在同一个包下:
私有的属和私有的方法不能被子类或子类对象调用。
默认的,受保护的,公有的属性和方法能被子类或子类对象调用。
2.子类和父类在不同的包下:
只有公有的属性和方法能被子类和子类的对象调用。
受保护的属性和方法能被子类调用
私有的和默认的属性和方法不能被子类以及子类的对象调用。
4.方法重写的条件:
1.返回值类型,方法名,参数个数,参数类型,参数顺序必须要相同
2.访问修饰符:子类重写方法的访问修饰分可以大于或者等于父类方法的访问修饰符。
默认的,protected 可以修改为 public
注意:子类中可以对父类的方法进行重写
5.子类可以定义自己的属性和方法。
在创建子类对象时,实际上也创建了父类的对象(参见Test5)
6.若父类中定义了构造方法(没有再写默认的),则子类中必须写出与父类中对应的构造方法,把名字换成子类名,然后运用super()函数。(参见Text1)
7.访问修饰符的范围:
1.private 在类的()里面
2.默认的 在同包的任何类中
3.protected 在同包下和不同包的子类中
4.public 在任何类中都可以
8.对象的自动转型
要实现自动转型必须要存在继承关系。
格式:
1.父类名 对象名 = new 子类构造方法();
2.在另一个类中定义方法时:
该类的方法名(父类名 对象名);
然后在使用该方法时可以传子类的对象名
但请注意!:不能调用子类自己定义的方法。(Java的编译机制引起的问题)
9.多态
多态是由Java的方法重载,继承,方法重写,自动转型等技术的组合。
10.面向对象的三大特性:1.继承 2.多态 3.封装
实验代码:模拟简单游戏,战士和怪兽对打
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
Skill [] skillSol = {new Skill("普通攻击",1),new Skill("暴击",3),new Skill("大招",5)};
Soldiers sol = new Soldiers("战士",10,skillSol);
Skill [] skillBoss = {new Skill("抓",1),new Skill("踢",2),new Skill("咬",3),new Skill("喷火",6)};
Monster boss = new Monster("怪兽",10,skillBoss);
while(sol.getBlood() > 0 && boss.getBlood() >0){
sol.fight(boss);
if(boss.getBlood() <= 0){
System.out.println(sol.getName()+"胜利了!");
break;
}
boss.fight(sol);
if(sol.getBlood() <= 0){
System.out.println(boss.getName()+"胜利了!");
break;
}
}
}
}
import java.util.Random;
public class Man {
private String name;
private int blood;
private Skill[] skill;
public Man(String name, int blood, Skill[] skill) {
this.name = name;
this.blood = blood;
this.skill = skill;
}
public void setName(String n) {
name = n;
}
public String getName() {
return name;
}
public void setBlood(int b) {
blood = b;
}
public int getBlood() {
return blood;
}
public void fight(Man enemy) {
Random rand = new Random();
int value = rand.nextInt(skill.length);
enemy.blood = enemy.blood - skill[value].getPower();
System.out.println(name+"使用了"+skill[value].getName()+"使"+enemy.getName()+"掉血"+skill[value].getPower());
}
}
public class Monster extends Man{
public Monster(String name,int blood, Skill[] skill){
super(name,blood,skill);
}
}
public class Soldiers extends Man {
public Soldiers(String name,int blood, Skill[] skill){
super(name,blood,skill);
}
}
public class Skill {
private String name;
private int power;
public Skill(String name, int power) {
this.name = name;
this.power = power;
}
public String getName() {
return name;
}
public int getPower() {
return power;
}
}