Java学习第二课---面向对象编程(oop)与类和对象

一、类和对象定义


(一)对象:
    任何一个具体的事物或者物体就是一个对象
eg.小明的耳机,李华的电子词典等等

(二)类:
    把具有相同特征和作用的对象的集合
eg.老师,学生,电脑等等

(三)对象和类的关系与区别:
    1.类是对象的集合,是对其属性与行为的抽象定义
    2.类是抽象概念,其本身不存在于物质世界,就像电场线一样,是人为对其性质的定义,方便理解和利用而为之;
而对象则是相对具体的实物,有对象类才有存在的意义
    3.类本身不具有方法或函数(也就是行为),本身无法赋值,须通过对象来调用其属性和方法;
而对象则是兼具属性/变量和方法/函数(行为)的


二、描述对象
   

     想要通过面向对象编程(根据需要用到的对象在Java中设计对应的类)设计程序,首先要知道如何描述对象;
所有对象都可以从两方面来描述:
属性(变量)方法(函数)
属性(变量)特征  ;格式:访问修饰符(public) 数据类型 属性名;
方法(函数)行为  格式:访问修饰符(public) 返回值类型 方法名(参数类型 参数名,,,){ 方法体...}

tips.方法(函数)有时可根据具体情境理解为行为等;返回值类型中void表示不返回
eg.要输出这样一段话:“小明正在吃苹果,吃掉了2个,苹果的数量还剩4个”
这里的对象是小明,特征(属性/变量)是苹果、数量、名字,行为(方法/函数)是吃

在知道如何描述对象后,下面便可根据描述来设计相应程序


三、面向对象编程(oop)
 

tips.调用对象的方法

1.将对象的类调用到当前类中,格式如下:
       类名 对象名 = new 类名();
2.调用变量(属性):
       对象名.属性名= 值;
3.调用函数(方法):
       对象名.方法名(参数);

(一)   上面小明为例,可写如下程序:   

 //这里先定义类为Person(人),包含对象小明(名字)
public class Person {    
     //接下来定义名字(String)和数量(int)属性
     //注意区别定义和赋值的区别(赋值(有等号和数据)不加访问修饰符(public))
    public String name;
    public int number;
     //定义小明的方法(吃)
    public void eat(int num){
     //   这里用num来表述吃的数量,以区别开吃的数量和剩余数量
      //然后让苹果数量合计
        number -= num;  //number = number +num
        System.out.println(name+"正在吃苹果"+num+"个,苹果的数量还剩"+number+"个");
    }
}
          //为了精简运行程序的代码,我们在另一个文件夹中写运行的代码
public class Manage {
    //主函数,别忘了写
    public static void main(String[] args){
        //如上面所说,在主函数中,类里面的属性和方法必须通过对象调用
        //创建Person类的对象  格式:类名 对象名 = new 类名();
        //调用属性:对象名.属性名= 值;
        //调用方法:对象名.方法名(参数,,);

        Person xm = new Person();
        xm.number = 6;
        xm.name = "小明";

        xm.eat(2);
     //前面的类中num并未赋值,所以这里想要正常运行必须赋值

    }
}

运行结果为输出以下一句话:
“小明正在吃苹果,吃了2个,苹果的数量还剩4个”
(二)拓展应用

public class PracticeIII {
    //程序:李华新买了一本单词书,他决定在假期里坚持每天背5页单词,现在假期已经过去6天了,李华也按照计划背了30页
    //类:李华 Person  变量:名字、单词书、单词、假期  方法:背、过去、买
        public String name;
        public int page;
        public int date;
        public void recite ( int p){
            for(int i=1;i<10;i++)
            {
        if(date==6) {
            page=page+p*date;
            System.out.println(name + "新买了一本单词书,他决定在假期里坚持每天背" + p + "页单词,现在假期已经过去" + date + "天了,李华也按照计划背了" + page + "页");
        }
        date++;
        }
    }
}

public class PracticeIIImanage {
    public static void main(String[] args) {
                PracticeIII lh = new PracticeIII();
        lh.page= 0;
        lh.date= 0;
        lh.name = "李华";
        lh.recite(5);
    }
}

输出效果如下:

“李华新买了一本单词书,他决定在假期里坚持每天背5页单词,现在假期已经过去6天了,李华也按照计划背了30页”

四、关于访问修饰符的拓展
     
     

     访问修饰符可分为公开(public)和私有(private),顾名思义,公开指其他类可直接调用,而私有则指其他类无法直接调用,但在本类中可自由使用,下面我们来展开讲解如何调用私有函数(private)的数据:

tips.无论是set还是get终归是种方法,最终无论计算还是赋值都是给了调用变量本身
(一)设置set(不返回数据),格式如下:
 

public void set变量/属性/(数据类型 数据){
        变量/属性 = 数据;
 }


     其主要目的是调用私有(信息中转)方便赋值,后续调用必须要赋值,格式如下:
set变量/属性/(赋值数据);

tips.(1)“set变量(属性)”是个整体,且变量(函数)的首字母要大写,切记这两点

(2)set不会返回数据,因此只可用于赋值(只输出不返回,用其计算毫无意义)

(二)获取get(返回数据),格式如下:
 

public 数据类型 get变量/属性{
        return 变量/属性;
    }


      其主要目的是调用私有(信息中转)返回数据(取值),其本身须有对应的值(或者后续通过其他方法赋值也行,如通过set方法赋值),注意无法通过get函数赋值,后续引用格式如下:
get变量/属性()

tips.(1)同样,“get变量(属性)”是个整体,且变量(函数)的首字母要大写,切记这两点

(2)由于get会返回数据,所以可以用于计算,但不可给其整体赋值,想要赋值可以利用set,如

 li.setVolume(li.getVolume()-vo);
//最后调用还是用get,set只不过是赋值给volume

(三)应用

现在我们利用私有函数来设计一段程序,让其达到基础回合制游戏的效果:

classI

public class Liplus {
    private String name;
    private int volume;
    private int vo ;
    public void setName(String n){
        name = n;
    }
    public String getName(){
        return name;
    }
    public int getVolume(){
        return volume;
    }
    public void setVolume(int v){
        volume = v;
    }

    public int getVo(){
        return vo;
    }
    public void setVo(int voo){
        vo = voo;
    }

    public void attack(Luplus lu) {
        lu.setVolume(lu.getVolume()-vo);
        if (lu.getVolume() < 0) {
            vo = lu.getVo();
            System.out.println(name + "正在攻击" + lu.getName() + "," + lu.getName() + "掉血" + vo + "剩余血量0");
        }
        if (lu.getVolume() > 0) {

            System.out.println(name + "正在攻击" + lu.getName() + "," + lu.getName() + "掉血" + vo + "剩余血量" + lu.getVolume());

        }
    }
}

classII

public class Luplus {
    private String name;
    private int volume;
    private int vo ;

    public String getName(){
        return name;
    }
    public void setName(String n){
        name = n;
    }

    public int getVolume(){
        return volume;
    }
    public void setVolume(int v){
        volume = v;
    }

    public int getVo(){
        return vo;
    }
    public void setVo(int voo){
        vo = voo;
    }

    public void attack(Liplus li) {
        li.setVolume(li.getVolume()-vo);
        if (li.getVolume() < 0) {
            vo = li.getVo();
            System.out.println(name + "正在攻击" + li.getName() + "," + li.getName() + "掉血" + vo + "剩余血量0");
        }
        if (li.getVolume() >0) {

            System.out.println(name + "正在攻击" + li.getName() + "," + li.getName() + "掉血" + vo + "剩余血量" + li.getVolume());
        }
    }

}

manage

public class Manage {public static void main(String[] args) {
    LiYuanfang li=new LiYuanfang();
    Luna lu=new Luna();

    lu.name="露娜";
    lu.volume=9736;
    li.name="李元芳";
    li.volume=6039;



    for(int i=1;i>0;i++){
        lu.attack(li);
        li.attack(lu);
        if(li.volume<0){
            System.out.println(lu.name+"获胜");
            break;
        }
        if(lu.volume<0){
            System.out.println(li.name+"获胜");
            break;
        }
    }


}
}

输出效果如下

李元芳正在攻击露娜,露娜掉血532剩余血量8504
露娜正在攻击李元芳,李元芳掉血369剩余血量5670
李元芳正在攻击露娜,露娜掉血532剩余血量7972
露娜正在攻击李元芳,李元芳掉血369剩余血量5301
李元芳正在攻击露娜,露娜掉血532剩余血量7440
露娜正在攻击李元芳,李元芳掉血369剩余血量4932
李元芳正在攻击露娜,露娜掉血532剩余血量6908
露娜正在攻击李元芳,李元芳掉血369剩余血量4563
李元芳正在攻击露娜,露娜掉血532剩余血量6376
露娜正在攻击李元芳,李元芳掉血369剩余血量4194
李元芳正在攻击露娜,露娜掉血532剩余血量5844
露娜正在攻击李元芳,李元芳掉血369剩余血量3825
李元芳正在攻击露娜,露娜掉血532剩余血量5312
露娜正在攻击李元芳,李元芳掉血369剩余血量3456
李元芳正在攻击露娜,露娜掉血532剩余血量4780
露娜正在攻击李元芳,李元芳掉血369剩余血量3087
李元芳正在攻击露娜,露娜掉血532剩余血量4248
露娜正在攻击李元芳,李元芳掉血369剩余血量2718
李元芳正在攻击露娜,露娜掉血532剩余血量3716
露娜正在攻击李元芳,李元芳掉血369剩余血量2349
李元芳正在攻击露娜,露娜掉血532剩余血量3184
露娜正在攻击李元芳,李元芳掉血369剩余血量1980
李元芳正在攻击露娜,露娜掉血532剩余血量2652
露娜正在攻击李元芳,李元芳掉血369剩余血量1611
李元芳正在攻击露娜,露娜掉血532剩余血量2120
露娜正在攻击李元芳,李元芳掉血369剩余血量1242
李元芳正在攻击露娜,露娜掉血532剩余血量1588
露娜正在攻击李元芳,李元芳掉血369剩余血量873
李元芳正在攻击露娜,露娜掉血532剩余血量1056
露娜正在攻击李元芳,李元芳掉血369剩余血量504
李元芳正在攻击露娜,露娜掉血532剩余血量524
露娜正在攻击李元芳,李元芳掉血369剩余血量135
李元芳正在攻击露娜,露娜掉血369剩余血量0
李元芳获胜


 

四、tips.

1.取名:(1)不能用数字开头(更不能用关键字)  
            (2).取名要语义(可读性),不要写拼音
2.注意调用属性/方法时的格式区别

3.函数(方法)中不可调用其他类的函数、变量,想要调用须在当前函数的参数位置填放要调用的类

eg.

public void study(Course c){
        //让学生的学分累加
        //获取私有属性的数据
        score += c.getScore();
        System.out.println(name+"正在学习"+c.getName()+"课程,学分增加了"+c.getScore()+"分,现在的学分是"+score);
    }
}


4.如果方法的参数类型是类(引用类型/自定义类型),那么调用方法时给的参数是该类对象
eg.

Course co = new Course();
//注意需先将类调用过来
        co.setScore(300);
        co.setName("java");
        zq.study(co);

以上是当前全部内容,后续会补充

你可能感兴趣的:(Java零基础学习笔记,java,学习,开发语言,初学者,零基础)