Java笔记_6(面向对象)

一、面向对象

1.1、设计对象并使用

  • 类(设计图)︰是对象共同特征的描述;
  • 对象∶是真实存在的具体东西。

在Java中,必须先设计类,才能获得对象。
在这里插入图片描述
定义类的补充注意事项

  • 用来描述一类事物的类,专业叫做:Javabean类。
    在Javabean类中,是不写main方法的。

  • 在以前,编写main方法的类,叫做测试类。
    我们可以在测试类中创建javabean类的对象并进行赋值调用。

  • 类名首字母建议大写,需要见名知意,驼峰模式。

  • 一个ava文件中可以定义多个class类,且只能一个类是public修饰,而且public修饰的类名必须成为代码文件名。
    实际开发中建议还是一个文件定义一个class类。

  • 成员变量的完整定义格式是∶修饰符 数据类型 变量名称 = 初始化值;一般无需指定初始化值,存在默认值。

对象的成员变量的默认值规则:
在这里插入图片描述
开发中类的设计

一般分为属性行为

根据不同的属性使用不同的类型来设计,行为同理。

1.2、封装

对象代表什么,就得封装对应的数据,并提供数据对应的行为

封装的好处

  • 对象代表什么,就得封装对应的数据,并提供数据对应的行为
  • 降低我们的学习成本,可以少学、少记,或者说压根不用学,不用记对象有哪些方法,有需要时去找就行

理解封装思想的好处

  • 让编程变得简单,有什么事,找对象,调方法就行

private关键字

  • 是一个权限修饰符
  • 可以修饰成员(成员变量和成员方法)
  • 被private修饰的成员只能在本类中才能访问
  • 保证数据的安全性
  • 针对private修饰的成员变量,如果需要被其他类使用,提供相应的操作
  • 提供“setXxx(参数)”方法,用于给成员变量赋值,方法用public修饰
  • 提供“getXxx()”方法,用于获取成员变量的值,方法用public修饰

1.3、就近原则和this关键字

成员变量和局部变量
在这里插入图片描述

  • 当成员变量和局部变量重名时会按照就近原则取值,这是如果加上this关键字就会选取成员变量
  • this可以区分局部变量和成员变量

1.4、构造方法

public class Student{
	修饰符 类名(参数){
		方法体;
	}
}

特点:

  1. 方法名与类名相同,大小写也要一致
  2. 没有返回值类型,连void都没有
  3. 没有具体的返回值(不能由retrun带回结果数据)

执行时机:

  1. 创建对象的时候由虚拟机调用,不能手动调用构造方法
  2. 每创建一次对象,就会调用一次构造方法

构造方法注意事项:

  1. 构造方法的定义
    • 如果没有定义构造方法,系统将给出一个默认的无参数构造方法
    • 如果定义了构造方法,系统将不再提供默认的构造方法
  2. 构造方法的重载
    • 带参构造方法,和无参数构造方法,两者方法名相同,但是参数不同,这叫做构造方法的重载
  3. 推荐的使用方式
    • 无论是否使用,都手动书写无参数构造方法,和带全部参数的构造方法

构造方法的种类以及作用:

  • 无参数构造方法:初始化的对象时,成员变量的数据均采用默认值。
  • 有参数构造方法:在初始化对象的时候,同时可以为对象进行赋值。

构造方法概述:

创造对象的时候,虚拟机会自动调用构造方法,作用是给成员变量进行初始化的。

1.5、标准的JavaBean类

  1. 类名需要见名知意
  2. 成员变量使用private修饰
  3. 提供至少两个构造方法
    • 无参构造方法
    • 带全部参数的构造方法
  4. 成员方法
    • 提供每一个成员变量对应的setXxx()/getXxx()
    • 如果还有其他行为,也需要写上

1.6、对象内存图

一个对象的内存图

Student s = new Student()
  1. 加载class文件
  2. 申明局部变量
  3. 在堆内存中开辟一个空间
  4. 默认初始化
  5. 显示初始化
  6. 构造方法初始化
  7. 将堆内存中的地址值赋值给左边的局部变量

两个对象的内存图
在这里插入图片描述
两个引用指向同一个对象的内存图
在这里插入图片描述

1.7、基本数据类型和引用数据类型

基本数据类型

  • 与应用数据类型的主要区别就是内存位置的不同
  • 在栈内存区域直接存放真实的数据

引用数据类型
例如对象:
在这里插入图片描述

  • 数据值是存储在其他空间中,自己空间中存储的是地址值。
  • 赋值给其他变量,赋的地址值

1.8、this的内存原理

this的作用:区分局部变量和成员变量
this的本质:所在方法调用者的地址值
在这里插入图片描述

1.9、成员和局部

区别成员变量局部变量
类中位置不同类中,方法外方法内、方法声明上
初始化值不同有默认初始化值没有,使用之前需要完成赋值
内存位置不同堆内存栈内存
生命周期不同随着对象的创建而存在,随着对象的消失而消失随着方法的调用而存在,随着方法的运行结束而消失
作用域整个类中有效当前方法中有效

二、面向对象(综合练习)

2.1、文字版格斗游戏

格斗游戏,每个游戏角色的姓名,血量,都不相同,在选定人物的时候(new对象的时候),这些信息就应该被确定下来。

Role class

package object;

import java.util.Random;

public class Role {
    private String name;
    private int blood;
    private char gender;
    private String face;

    String[] boyfaces = {"帅气的","靓的","酷的","超帅的"};
    String[] girlfaces = {"美的","靓的","酷的","超靓的"};


    Random r = new Random();

    public void setFace(char gender){
        if(gender == '男'){
            int index = r.nextInt(boyfaces.length);
            this.face = boyfaces[index];
        }else if(gender =='女'){
            int index = r.nextInt(girlfaces.length);
            this.face = girlfaces[index];
        }

    }
    public void attack(Role role){

        int hurt = r.nextInt(20)+1;
        int remainBoold = role.getBlood();

        remainBoold =role.getBlood() -hurt;
        remainBoold = remainBoold < 0 ? 0 : remainBoold;

        role.setBlood(remainBoold);

        System.out.println(this.getName()+"打了"+role.getName()+"一下"+"导致"+hurt
                +"点伤害"+role.getName()+"还剩下"+remainBoold+"的血量");

    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getBlood() {
        return blood;
    }
    public void setBlood(int blood) {
        this.blood = blood;
    }
    public char getGender() {
        return gender;
    }
    public void setGender(char gender) {
        this.gender = gender;
    }
    public String getFace() {
        return face;
    }

    public Role(String name,int blood,char gender){
        this.name = name;
        this.blood = blood;
        this.gender = gender;
        setFace(gender);
    }
    public void  showRole(){
        System.out.println("姓名为"+getName());
        System.out.println("血量为"+getBlood());
        System.out.println("性别为"+getGender());
        System.out.println("长相为"+getFace());
    }

}

执行代码

package object;

import java.util.Scanner;

public class Role_pk {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        System.out.println("请输入第一个角色的名字");
        String r1_name = sc.next();
        System.out.println("请输入第一个角色的性别");
        char r1_gender = sc.next().charAt(0);
        System.out.println("请输入第二个角色的名字");
        String r2_name = sc.next();
        System.out.println("请输入第二个角色的性别");
        char r2_gender = sc.next().charAt(0);
        Role r1 = new Role(r1_name,100,r1_gender);
        r1.showRole();
        Role r2 = new Role(r2_name,100,r2_gender);
        r2.showRole();

        while (true){

            r1.attack(r2);
            if(r2.getBlood()==0){
                System.out.println(r2.getName()+"被KO了");
                break;
            }
            r2.attack(r1);

            if(r1.getBlood()==0){
                System.out.println(r1.getName()+"被KO了");
                break;
            }
        }
    }
}

2.2、对象数组

定义数组存储3个商品对象。
商品的属性:商品的id,名字,价格,库存。
创建三个商品对象,并把商品对象存入到数组当中。

package object;

public class Goods {
    private String ID;
    private String name;
    private double price;
    private int number;

    public Goods() {
    }

    public Goods(String ID, String name, double price, int number) {
        this.ID = ID;
        this.name = name;
        this.price = price;
        this.number = number;
    }
    public String getID() {
        return ID;
    }
    public void setID(String ID) {
        this.ID = ID;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public double getPrice() {
        return price;
    }
    public void setPrice(double price) {
        this.price = price;
    }
    public int getNumber() {
        return number;
    }
    public void setNumber(int number) {
        this.number = number;
    }

}
package object;

public class GoodsText {
    public static void main(String[] args) {
        Goods[] arr = new Goods[3];

        Goods good1 = new Goods("Aoo1","小米9",2999.0,100);
        Goods good2 = new Goods("Aoo2","红米k50pro",2999.0,100);
        Goods good3 = new Goods("Aoo3","红米G",5999.0,100);

        arr[0] = good1;
        arr[1] = good2;
        arr[2] = good3;

        for (int i = 0; i < 3; i++) {
            Goods goods = arr[i];
            System.out.println(goods.getID()+","+goods.getName()+","+goods.getPrice()+","+goods.getNumber());
        }
    }
}

2.3、键盘录入的体系

第一套:

//键盘录入
nextInt()//接收整数
nextDouble()//接收小数
next()//接收字符串
next().charAt(0)//接受字符
  • 遇到空格,制表符,回车就停止接受。这些符号后面的数据就不会接受了

第二套

nextLine()//接收字符串

2.4、对象数组2

定义一个长度为3的数组,数组存储1~3名学生对象作为初始数据,学生对象的学号,姓名各不相同。
学生的属性:学号,姓名,年龄。
要求1∶再次添加一个学生对象,并在添加的时候进行学号的唯一性判断。
要求2:添加完毕之后,遍历所有学生信息。
要求3:通过id删除学生信息如果存在,则删除,如果不存在,则提示删除失败。
要求4:删除完毕之后,遍历所有学生信息。
要求5:查询数组id为“heima002”的学生,如果存在,则将他的年龄+1岁

package object;

public class create_array {
    /*定义一个长度为3的数组,数组存储1~3名学生对象作为初始数据,学生对象的学号,姓名各不相同。
    学生的属性:学号,姓名,年龄。
            **要求1**∶再次添加一个学生对象,并在添加的时候进行学号的唯一性判断。
            **要求2**:添加完毕之后,遍历所有学生信息。
            **要求3**:通过id删除学生信息如果存在,则删除,如果不存在,则提示删除失败。
            **要求4**:删除完毕之后,遍历所有学生信息。
            **要求5**:查询数组id为“heima002”的学生,如果存在,则将他的年龄+1岁
*/
        private int number ;
        private String name;
        private int age;
    public create_array() {
    }
    public create_array(int number, String name, int age) {
        this.number = number;
        this.name = name;
        this.age = age;
    }
    public int getNumber() {
        return number;
    }
    public void setNumber(int number) {
        this.number = number;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

}

package object;

public class create_arrayText {
    public static void main(String[] args) {
        create_array[] arr = new create_array[3];

        create_array stu1 = new create_array(001,"xiaoming",18);
        create_array stu2 = new create_array(002,"xiaohong",18);
        create_array stu3 = new create_array(003,"xiaogang",18);

        arr[0] = stu1;
        arr[1] = stu2;
        arr[2] = stu3;

        create_array stu4 = new create_array(004,"xiaoquan",19);

        //唯一性判断
        //已存在--不用添加
        //不存在-- 就可以把学生对象添加进数组

        boolean flag=  contains(arr,stu4.getNumber());

        if(flag){
            //已存在,不用添加
            System.out.println("当前ID重复,请修复后重新进行添加");

        }else{
            int count  = getcount(arr);
            if(count == arr.length){
                //已经存满
                //创建一个新的数组,长度 = 老数组的长度 +1;
                //把老数组的元素,拷贝到新数组里
                create_array [] newArr = creatNewArr(arr);

                newArr[count] = stu4;
                printarr(newArr);
            }else {
                //没有存满
                //[stu1,stu2,stu3]
                //getcount得到的是2,表示当前数组中已经有了2个元素
                //还有一层,如果下一次要添加数组,就是添加2索引的位置
                arr[count] = stu4;

                printarr(arr);
            }
        }

        int index = getindex(arr,002);

        if(index>=0){
            arr[index]=null;

            printarr(arr);
        }else {
            System.out.println("需要删除的信息不存在");
        }

        int index2 = getindex(arr,003);

        if(index2>=0){
            create_array stu  = arr[index2];
            int newAge = stu.getAge()+1;

            stu.setAge(newAge);
            printarr(arr);
        }else {
            System.out.println("需要修改的信息不存在");
        }
    }

    public static  void printarr(create_array[] arr){

        for (int i = 0; i < arr.length; i++) {
            if (arr[i] != null) {
                System.out.println("学生的学号是:" + arr[i].getNumber() + ",学生的姓名是:" + arr[i].getName() + ",学生的年龄是:" +
                        arr[i].getAge());
            }
        }
    }

    public static create_array[] creatNewArr(create_array[] arr){
        create_array[] newArr = new create_array[arr.length+1];

        for (int i = 0; i < arr.length; i++) {
                newArr[i] = arr[i];

        }
        return newArr;
    }

    public static int getcount(create_array[] arr){
        int count=0;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i]!=null){
                count++;
            }
        }
        return count;

    }
    public static boolean contains(create_array[] arr,int id) {
        for (int i = 0; i < arr.length; i++) {
            create_array stu = arr[i];

            if (stu!=null) {
                int sid = stu.getNumber();
                if (sid == id) {
                    return true;
                }
            }
            }
        return false;
    }

    public static int getindex(create_array[] arr,int id){
        for (int i = 0; i < arr.length; i++) {
            if(arr[i]!=null){
                if(arr[i].getNumber() == id){
                    return i;
                }
            }
        }
        return -1;
    }

}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值