一、对象
1.对象的概念:
对象并不只是存在于java的,它只是一种概念,在生活中,只要是一个具体的物体或者一件具体的事情就是一个对象。例如:某个人、某一辆车、某台电脑,这都是一个对象。
这里需要注意的是对象一定要是一个具体的事物,而例如人、车,这种没有具体的指代,就不能算一个对象。
2.对象的描述:
如何描述一个对象?我们需要从两方面进行描述:特征(属性)和行为(方法)
例如:对于某一台电脑这个对象:1.特征:形状,大小,重量,品牌,型号,CPU,内存,显卡,硬盘,...;2.行为:上网,玩游戏,学习,播放电影,...
二、类
1.类的组成:
生活中的类:根据对象相似的特征和相似的行为进行归类。例如:桌子、椅子
程序中的类 :由两个部分组成:1.属性(成员变量) ;2.方法(成员函数)
2.类的基本格式:
public class 类名 {
访问修饰符 数据类型 属性名;
访问修饰符 返回值类型 方法名(数据类型 参数名,...){
//代码
}
}
3.实例化对象和调用方法的格式:
实例化对象的格式:
实例化对象的关键字:new
类名 对象名 = new 构造方法(参数值,...);
参数值可以为空
调用方法的格式:
对象名.方法名(参数值,...);
举例1:
现在设置这样一个情景:学生张三(已有20学分)选修了一门Java课程,学完该课程后,学分要加3分。
下面我们先来分析一下:
1.对象:
张三
特征:姓名,学分 行为:学习(Java)
Java课程
特征:学分,课程名,课时 行为:无
2.根据类的格式定义学生和课程类。
3.实例化对象:
Student stu = new Student();
Classes cla = new Classes();
//定义Student类
public class Student {
//声明属性
private String name;//姓名属性
private int score;//学分属性
//定义设置课程名属性值的方法
public void setName(String n){
name = n;
}
//定义获取课程名属性值的方法
public String getName(){
return name;
}
//定义设置学分属性值的方法
public void setScore(int s){
score = s;
}
//定义获取学分属性值的方法
public int getScore(){
return score;
}
//定义学习课程的方法Classes是类名 cla是参数名对象名
public void study(Classes cla){
System.out.println(name+"正在学习"+cla.getName()+"课程!");
//得到课时
int time = cla.getTime();
//减少课时
time--;
//将减少后的值设置给课程对象
cla.setTime(time);
//判断是否已经学完所有课时
if(cla.getTime() <= 0){
System.out.println(name+"已经学完"+cla.getName()+"课程。");
//让学生的学分加上课程的学分。
score= score+cla.getScore();
}
}
}
//定义课程类
public class Classes {
private String name;//课程名属性
private int score;//学分属性
private int time;//课时属性
//定义设置课程名属性值的方法
public void setName(String n){
name = n;
}
//定义获取课程名属性值的方法
public String getName(){
return name;
}
//定义设置学分属性值的方法
public void setScore(int s){
score = s;
}
//定义获取学分属性值的方法
public int getScore(){
return score;
}
//定义设置课时属性值的方法
public void setTime(int t){
time = t;
}
//定义获取课时属性值的方法
public int getTime(){
return time;
}
}
//定义管理学生学习课程的类
public class Manager {
//定义程序的入口主函数
public static void main(String [] args){
//实例化Student类的对象
Student stu = new Student();
//设置对象的姓名属性值
stu.setName("张三");
//设置对象的学分属性值
stu.setScore(20);
//实例化Classes类的对象
Classes cla = new Classes();
cla.setName("Java");//设置课程名
cla.setScore(3);//设置学分
cla.setTime(10);//设置课时
for(int i=0;i<10;i++){
//调用学生学习课程的方法
stu.study(cla);
}
System.out.println(stu.getName()+"现在的学分是"+stu.getScore());
}
}
以上程序的执行结果为
张三正在学习java课程!
张三正在学习java课程!
张三正在学习java课程!
张三正在学习java课程!
张三正在学习java课程!
张三正在学习java课程!
张三正在学习java课程!
张三正在学习java课程!
张三正在学习java课程!
张三正在学习java课程!
张三已经学完java课程。
张三现在的学分是23
举例2:
奥特曼和小怪兽进行PK,直到一方的血量为0 时,结束战斗输出谁胜利了。
//定义People类
public class People {
//声明属性
private String name;//姓名属性
private int blood;//血量属性
//定义设置People名属性值的方法
public void setName(String n){
name = n;
}
//定义获取People名属性值的方法
public String getName(){
return name;
}
//定义设置血量属性值的方法
public void setBlood(int b){
blood = b;
}
//定义获取血量属性值的方法
public int getBlood(){
return blood;
}
//定义打小怪兽的方法
public void hit(Monster mon){
System.out.println(name+"对"+mon.getName()+"进行攻击!");
int blood = mon.getBlood();//得到血量
blood-=2;//减少血量
mon.setBlood(blood);//将减少后的血量值设置给怪兽对象
if(mon.getBlood()<=0){
System.out.println(name+"胜利了!");
}
}
}
//定义monster类
public class Monster{
private String name;// Monster名属性
private int blood;//血量属性
//定义设置Monster名属性值的方法
public void setName(String n){
name = n;
}
//定义获取Monster名属性值的方法
public String getName(){
return name;
}
//定义设置血量属性值的方法
public void setBlood(int b){
blood = b;
}
//定义获取血量属性值的方法
public int getBlood(){
return blood;
}
//定义打奥特曼的方法
public void hit(People peo){
System.out.println(name+"对"+peo.getName()+"进行攻击!");
int blood = peo.getBlood();
blood--;//减少血量
peo.setBlood(blood);//将减少后的血量值设置给People对象
if(peo.getBlood()<=0){
System.out.println(name+"胜利了!");
}
}
}
//定义管理类
public class Manager{
//定义程序的入口函数
public static void main(String [] args){
People peo = new People();//实例化People类的对象
peo.setName("奥特曼");//设置对象的姓名属性值
peo.setBlood(10);//设置对象的血量属性值
Monster mon = new Monster();//实例化Monster类的对象
mon.setName("小怪兽");//设置对象的姓名属性值
mon.setBlood(10);//设置对象的血量属性值
while (mon.getBlood()>0 && peo.getBlood()>0)
{
mon.hit(peo);
peo.hit(mon);
}
System.out.println(mon.getName()+"现在的血量是"+mon.getBlood());
System.out.println(peo.getName()+"现在的血量是"+peo.getBlood());
}
}
以上程序的执行结果为:
小怪兽对奥特曼进行攻击!
奥特曼对小怪兽进行攻击!
小怪兽对奥特曼进行攻击!
奥特曼对小怪兽进行攻击!
小怪兽对奥特曼进行攻击!
奥特曼对小怪兽进行攻击!
小怪兽对奥特曼进行攻击!
奥特曼对小怪兽进行攻击!
小怪兽对奥特曼进行攻击!
奥特曼对小怪兽进行攻击!
奥特曼胜利了!
小怪兽现在的血量是0
奥特曼现在的血量是5
三、构造方法
以上程序我们都是用的普通方法,但有时候我们需要用到构造方法
△.构造方法也称为构造函数或构造器。
1.基本格式:
访问修饰符 构造方法名(数据类型 参数名,...){
//代码
}
而上面的普通方法的格式为:
访问修饰符 返回值类型 方法名(数据类型 参数名,...){
//代码
}
}
我们可以看出,在格式上,构造方法与普通方法的区别在于其少了返回值类型。
△.注意:构造方法名必须要和类名完全一致。这也是其与普通方法不同的地方。
2.用途:
Java如果要创建一个对象,就必须要使用构造方法,否则对象无法创建。那么为什么前面我们没用到构造方法,也创建了对象呢?这是因为如果你没有自定义构造方法,Java就会给每一个类提供一个默认不带参数的构造方法;而一旦你自己定义了构造方法,则默认的构造方法会被覆盖,无法再继续使用。
构造方法还有一个用途就是传参数,如果之前声明了参数,那么在实例化对象的时候,可以将参数传过来,即:
类名 对象名 = new 构造方法(参数);
这在之后的例子中会演示到。
3.方法重载:
概念:方法重载是指在一个类中定义多个同名的方法。
条件:a.方法名必须要完全一致;b.方法所带的参数个数,参数类型,参数顺序必须要有一个不同。(这是因为主程序在调用方法时,是根据参数的区别来调用的)
使用时机:当一个对象会产生不同参数的方法时使用,
例如:学生的学习方法不止一个,可以自己看书,可以上课等等。即:
public void study(Book bk){
//代码
}
public void study(Course cos){
//代码
}
举例:
奥特曼和小怪兽以及Boss进行PK,直到一方的血量为0时,结束战斗谁出谁胜利了。
//定义People类
public class People {
private String name;
private int blood;
public People (String name,int blood){
this.name=name;
this.blood=blood;
}
//定义设置People名属性值的方法
public void setName(String n){
name=n;
}
//定义获取People名属性值的方法
public String getName(){
return name;
}
//定义设置血量属性值的方法
public void setBlood(int b){
blood = b;
}
//定义获取血量属性值的方法
public int getBlood(){
return blood;
}
//定义打小怪兽的方法
public void hit(Monster mon){
System.out.println(name+"对"+mon.getName()+"进行攻击!");
int blood = mon.getBlood();//得到血量
blood-=2;//减少血量
mon.setBlood(blood);//将减少后的血量值设置给怪兽对象
if(mon.getBlood()<=0){
System.out.println(name+"胜利了!");
}
}
//定义打boss的方法
public void hit(Boss bs){
System.out.println(name+"对"+bs.getName()+"进行攻击!");
int blood = bs.getBlood();//得到血量
blood-=1;//减少血量
bs.setBlood(blood);//将减少后的血量值设置给怪兽对象
if(bs.getBlood()<=0){
System.out.println(name+"胜利了!");
}
}
}
//定义Monster类
public class Monster {
private String name;
private int blood;
public Monster (String name,int blood){
this.name=name;
this.blood=blood;
}
//定义设置Monster名属性值的方法
public void setName(String n){
name = n;
}
//定义获取Monster名属性值的方法
public String getName(){
return name;
}
//定义设置血量属性值的方法
public void setBlood(int b){
blood = b;
}
//定义获取血量属性值的方法
public int getBlood(){
return blood;
}
//定义打奥特曼的方法
public void hit(People peo){
System.out.println(name+"对"+peo.getName()+"进行攻击!");
int blood = peo.getBlood();
blood--;//减少血量
peo.setBlood(blood);//将减少后的血量值设置给People对象
if(peo.getBlood()<=0){
System.out.println(name+"胜利了!");
}
}
}
//定义boss类
public class Boss {
private String name;
private int blood;
public Boss (String name,int blood){
this.name=name;
this.blood=blood;
}
//定义设置Boss名属性值的方法
public void setName(String n){
name = n;
}
//定义获取Monster名属性值的方法
public String getName(){
return name;
}
//定义设置血量属性值的方法
public void setBlood(int b){
blood = b;
}
//定义获取血量属性值的方法
public int getBlood(){
return blood;
}
//定义打奥特曼的方法
public void hit(People peo){
System.out.println(name+"对"+peo.getName()+"进行攻击!");
int blood = peo.getBlood();
blood--;//减少血量
peo.setBlood(blood);//将减少后的血量值设置给People对象
if(peo.getBlood()<=0){
System.out.println(name+"胜利了!");
}
}
}
//定义管理类
public class Manager {
public static void main(String[] args) {
// TODO Auto-generated method stub
People peo=new People("奥特曼",20);
Monster mon=new Monster("小怪兽",10);
Boss bs=new Boss("大魔王",30);
while (mon.getBlood()>0 && peo.getBlood()>0)
{
mon.hit(peo);
if ( peo.getBlood()>0)
peo.hit(mon);
}
while (bs.getBlood()>0 && peo.getBlood()>0){
bs.hit(peo);
if ( peo.getBlood()>0)
peo.hit(bs);
}
System.out.println(mon.getName()+"现在的血量是"+mon.getBlood());
System.out.println(peo.getName()+"现在的血量是"+peo.getBlood());
System.out.println(bs.getName()+"现在的血量是"+bs.getBlood());
}
}
运行结果为:
小怪兽对奥特曼进行攻击!
奥特曼对小怪兽进行攻击!
小怪兽对奥特曼进行攻击!
奥特曼对小怪兽进行攻击!
小怪兽对奥特曼进行攻击!
奥特曼对小怪兽进行攻击!
小怪兽对奥特曼进行攻击!
奥特曼对小怪兽进行攻击!
小怪兽对奥特曼进行攻击!
奥特曼对小怪兽进行攻击!
奥特曼胜利了!
大魔王对奥特曼进行攻击!
奥特曼对大魔王进行攻击!
大魔王对奥特曼进行攻击!
奥特曼对大魔王进行攻击!
大魔王对奥特曼进行攻击!
奥特曼对大魔王进行攻击!
大魔王对奥特曼进行攻击!
奥特曼对大魔王进行攻击!
大魔王对奥特曼进行攻击!
奥特曼对大魔王进行攻击!
大魔王对奥特曼进行攻击!
奥特曼对大魔王进行攻击!
大魔王对奥特曼进行攻击!
奥特曼对大魔王进行攻击!
大魔王对奥特曼进行攻击!
奥特曼对大魔王进行攻击!
大魔王对奥特曼进行攻击!
奥特曼对大魔王进行攻击!
大魔王对奥特曼进行攻击!
奥特曼对大魔王进行攻击!
大魔王对奥特曼进行攻击!
奥特曼对大魔王进行攻击!
大魔王对奥特曼进行攻击!
奥特曼对大魔王进行攻击!
大魔王对奥特曼进行攻击!
奥特曼对大魔王进行攻击!
大魔王对奥特曼进行攻击!
奥特曼对大魔王进行攻击!
大魔王对奥特曼进行攻击!
大魔王胜利了!
小怪兽现在的血量是0
奥特曼现在的血量是0
大魔王现在的血量是16
这个例子中我们在People、Monster和Boss类里面都用了带参数的构造方法(两个参数:名字、血量), 在People类里面,对于hit方法用到了方法的重载(参数类型不同)。
△.给参数赋值的时候,用到了this.name=name和this.blood=blood,因为当参数名和属性名一致时,根据Java的规则,会优先使用最近的参数,这样参数赋给参数就和属性没有关系。所以这里用this.属性名,来表示这个是一个属性。这是this的一个用法,关于this的其他用法这里就不具体介绍了。