java新手上路(三):类,对象和继承
2017-06-27 16:30
211 查看
首先对类,对象和继承的大概意思有一个认识:
1.对象:对生活中具体事物的描述,是现实生活中事物的最小单位。如迪迦奥特曼,哥斯拉怪兽….他们作为独立且最小的单位,有自己的特征(属性)和行为(用途)。
迪迦奥特曼的属性:名称,血量。行为:对敌人进行攻击
哥斯拉的属性:名称,血量。行为:对敌人进行攻击
2.类:对与对象而言,现实生活中的某些对象之间都有相同的特征和行为,在对它们进行描述的时候如果一个一个的表述显然会显得累赘,需要一种统一的概念将这些具有相同属性的对象进行归类。类就是对有统一特征和行为的事物的归类和抽象,将具有相同行为和特征的最小单位进行统一的定义。
如:
迪迦奥特曼和A奥特曼显然具有相同的特征行为,把他们统一定义为奥特曼
3.继承:显而易见,不同类之间也存在着某种联系,现实生活中不同类之间如果存在很多相同的属性,那么这时候为了减少代码的冗余,会需要用到继承的方法来表述。B的属性和A的属性相同,那么就可以讲A类定义为一个父类,B类从A类中得到属性,称为子类。而当子类从父类中继承的某些行为不同于父类时,需要用到方法重写来重新定义子类的行为。
比如:奥特曼和怪兽有相同的属性,那么可以用继承的方法,定义一个父类:角色类。然后定义奥特曼类和怪兽类作为角色类的子类。
下面通过具体的例子对类和对象以及继承关系进行分析:
情景:回合制对战游戏:奥特曼迪迦和小怪兽哥斯拉进行PK,直到一方的血量为0时结束战斗,输出谁胜利了,其中奥特曼每次攻击对手血量减少5个单位,怪兽每次攻击对手减少血量为一个随机数。
如果奥特曼迪迦胜利,则奥特曼迪迦和奥特曼A进行PK,直到一方的血量为0时结束战斗,输出谁胜利了,
如果小怪兽哥斯拉胜利,则小怪兽哥斯拉和小怪兽A进行PK,直到一方的血量为0时结束战斗,输出谁胜利了。
要求:类中间只能有一个攻击方法,方法中只能有一个参数;要使用这种方式来实现攻击不同的对象。
分析:对象:迪迦奥特曼,A奥特曼,哥斯拉,A怪兽
类:奥特曼类,怪兽类,角色类
继承关系:奥特曼和怪兽是角色的子类。
其中:因为奥特曼和怪兽都具有名称,血量的属性,和攻击的行为。可以把定义一个角色类作为他们的父类。
我们知道,在这个情景之中怪兽和奥特曼的攻击方法是不同的,我们在父类(角色类)中将攻击方式定义为随机数方式。怪兽可以直接继承父类的所有属性和方法。
而奥特曼的攻击方式不同于父类,所以我们需要用到方法重写的手段来重新定义他的攻击方式。
代码实现:
角色定义:
public class characters {
private String cname; //定义名称为私有
private double blood; //定义血量为私有
}
public class automan extends characters{
//extends表明为继承类
}
这里可以看到, 奥特曼的攻击方式发生了改变,通过方法重写改变攻击的函数。
定义怪兽的子类:
//怪兽的属性和方法与父类完全相同,所以直接继承,不需要方法重写
public class monster extends characters{
}
怪兽类没有改变。
定义Fight过程类:
public class Fight {
}
情景描述完成!!!
1.对象:对生活中具体事物的描述,是现实生活中事物的最小单位。如迪迦奥特曼,哥斯拉怪兽….他们作为独立且最小的单位,有自己的特征(属性)和行为(用途)。
迪迦奥特曼的属性:名称,血量。行为:对敌人进行攻击
哥斯拉的属性:名称,血量。行为:对敌人进行攻击
2.类:对与对象而言,现实生活中的某些对象之间都有相同的特征和行为,在对它们进行描述的时候如果一个一个的表述显然会显得累赘,需要一种统一的概念将这些具有相同属性的对象进行归类。类就是对有统一特征和行为的事物的归类和抽象,将具有相同行为和特征的最小单位进行统一的定义。
如:
迪迦奥特曼和A奥特曼显然具有相同的特征行为,把他们统一定义为奥特曼
3.继承:显而易见,不同类之间也存在着某种联系,现实生活中不同类之间如果存在很多相同的属性,那么这时候为了减少代码的冗余,会需要用到继承的方法来表述。B的属性和A的属性相同,那么就可以讲A类定义为一个父类,B类从A类中得到属性,称为子类。而当子类从父类中继承的某些行为不同于父类时,需要用到方法重写来重新定义子类的行为。
比如:奥特曼和怪兽有相同的属性,那么可以用继承的方法,定义一个父类:角色类。然后定义奥特曼类和怪兽类作为角色类的子类。
下面通过具体的例子对类和对象以及继承关系进行分析:
情景:回合制对战游戏:奥特曼迪迦和小怪兽哥斯拉进行PK,直到一方的血量为0时结束战斗,输出谁胜利了,其中奥特曼每次攻击对手血量减少5个单位,怪兽每次攻击对手减少血量为一个随机数。
如果奥特曼迪迦胜利,则奥特曼迪迦和奥特曼A进行PK,直到一方的血量为0时结束战斗,输出谁胜利了,
如果小怪兽哥斯拉胜利,则小怪兽哥斯拉和小怪兽A进行PK,直到一方的血量为0时结束战斗,输出谁胜利了。
要求:类中间只能有一个攻击方法,方法中只能有一个参数;要使用这种方式来实现攻击不同的对象。
分析:对象:迪迦奥特曼,A奥特曼,哥斯拉,A怪兽
类:奥特曼类,怪兽类,角色类
继承关系:奥特曼和怪兽是角色的子类。
其中:因为奥特曼和怪兽都具有名称,血量的属性,和攻击的行为。可以把定义一个角色类作为他们的父类。
我们知道,在这个情景之中怪兽和奥特曼的攻击方法是不同的,我们在父类(角色类)中将攻击方式定义为随机数方式。怪兽可以直接继承父类的所有属性和方法。
而奥特曼的攻击方式不同于父类,所以我们需要用到方法重写的手段来重新定义他的攻击方式。
代码实现:
角色定义:
public class characters {
private String cname; //定义名称为私有
private double blood; //定义血量为私有
//对名称进行初始化和得到 public void setName(String str){ cname=str; } public String getName(){ return cname; } //对血量进行初始化和得到 public void setBlood(double tempblood){ blood=tempblood; } public double getBlood(){ return blood; } //定义characters类的攻击行为为随机数攻击 public boolean attack(characters enemy){ **//随机数攻击形式** double re; re = (double)Math.random()*10; enemy.blood -= re; System.out.println(enemy.cname + "的剩余血量为" + enemy.blood); if(enemy.blood<0){ System.out.println("随着" + cname + "的攻击," + enemy.cname + "被打死了,哈哈哈!!!"); return true; } else return false; }
}
在这个类中,角色名称和血量定义为私有类型。通过getName,getBlood,setName和setBlood进行定义和获取。 下面定义奥特曼子类:
public class automan extends characters{
//extends表明为继承类
//采用方法重写的方式来改变攻击方式 //方法重写不能该改变方法的返回值类型,参数和方法名。 public boolean attack(characters enemy){ **//固定血量攻击方法** double re=5; enemy.setBlood(enemy.getBlood()-re); System.out.println(enemy.getName() + "的剩余血量为" + enemy.getBlood()); if(enemy.getBlood()<0){ System.out.println("随着" + getName() + "的攻击," + enemy.getName() + "被打死了,哈哈哈!!!"); return true; } else return false; }
}
这里可以看到, 奥特曼的攻击方式发生了改变,通过方法重写改变攻击的函数。
定义怪兽的子类:
//怪兽的属性和方法与父类完全相同,所以直接继承,不需要方法重写
public class monster extends characters{
}
怪兽类没有改变。
定义Fight过程类:
public class Fight {
public static void main(String[] args){ //定义四个对象Dautoman,Aautoman,Godzilla,Amonster characters Dautoman = new automan(); Dautoman.setName("Dauto"); Dautoman.setBlood(50); characters Aautoman = new automan(); Aautoman.setName("Aauto"); Aautoman.setBlood(50); characters Godzilla = new monster(); Godzilla.setName("Gz"); Godzilla.setBlood(50); characters Amonster = new monster(); Amonster.setName("Amon"); Amonster.setBlood(50); //以下为攻击过程: while(true){ if(Dautoman.attack(Godzilla)){ while(true){ if(Dautoman.attack(Aautoman)) break; else if(Aautoman.attack(Dautoman)) break; else continue; } break; } else if(Godzilla.attack(Amonster)){ while(true){ if(Amonster.attack(Godzilla)) break; else if(Godzilla.attack(Dautoman)) break; else continue; } break; } else continue; } }
}
情景描述完成!!!
相关文章推荐
- 新手上路,初学java,关于String的对象
- Java新手上路大全(问问题之前请先看)
- Java新手上路经验1
- 黑马程序员---java面向对象 封装, 继承, 多态
- Java继承中属性、方法和对象的关系
- Java程序员从笨鸟到菜鸟之(二十九)javascript对象的创建和继承实现
- Java新手上路大全
- Java继承中属性、方法和对象的关系
- 黑马程序员——第七天(Java面向对象-继承)
- JAVA面向对象基础:继承、变量隐藏、方法重写、包、修饰符、this、super
- 黑马程序员_JAVA学习日记_JAVA中API中Math和Random对象和继承1
- Java面向对象继承与组合的问题
- Java新手上路大全
- java类、抽象类、接口、继承和对象解析
- java/构造函数,函数的重载,this的运用,构造函数的重载,静态函数,静态初始化,import,对象的继承,
- 对JAVA的继承,方法的覆盖,重载的认识 以及对象访问方面的探讨
- java学习笔记5:对象继承upcasting
- java类、抽象类、接口、继承和对象解析
- Java程序员从笨鸟到菜鸟之(二十九)javascript对象的创建和继承实现
- JAVA中创建线程对象的两种方法:继承Thread和实现Runable