Java笔记_05(面向对象)

一、面向对象

1.1、设计对象并使用

  • 类和对象是什么
    • 类(设计图):是共同特征的描述
    • 对象:是真实存在的具体事例
  • 如何得到对象
public class 类名 {
    1.成员变量(代表属性的,一般是名词)
    2.成员方法(代表行为的,一般是动词)    
}
类名 对象名 = new 类名();
  • 拿到对象后能做什么
    • 对象.成员变量;
    • 对象.成员方法(…)

定义类的补充注意事项

  • 用来描述一类事物的类,专业叫做:Javabean类。
    在Javabean类中,是不写main方法的
  • 在以前,编写main方法的类,叫做测试类
    我们可以在测试类中创建javabean类的对象并进行赋值调用
  • 类名首字母建议大写,而且要见名知意,驼峰模式
  • 一个Java文件中可以定义多个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. 没有具体的返回值(不能由return带回结果数据)

执行时机

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

构造方法注意事项

①构造方法的定义

  • 如果没有定义构造方法,系统将给出一个默认的无参数构造方法
  • 如果定义了构造方法,系统将不再提供默认的构造方法

②构造方法的重载

  • 带参构造方法,和无参数构造方法,两者方法名相同,但是参数不同,这叫做构造方法的重载

③推荐的使用方式

  • 无论是否使用,都手动书写无参数构造方法,盒带全部参数的构造方法

构造方法的种类和作用

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

1.5、标准JavaBean

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

快捷键:ait + Fn + insert

1.6、对象内存图

一个对象的内存图

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

基本数据类型:

  • 数据值是存储在自己的空间中
  • 特点:赋值给其他变量,也是赋的真实的值

引用数据类型

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

this的内存原理

  • 作用:区分局部变量和成员变量
  • 本质:所在方法调用者的地址值

1.7、成员变量和局部变量的区别

在这里插入图片描述

二、面向对象(综合案例)

2.1、文字版格斗游戏

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

import java.util.Random;

public class Role {
    //定义基本属性
    private String name;
    private int blood;

    //空参
    public Role() {
    }

    //
    public Role(String name, int blood) {
        this.name = name;
        this.blood = blood;
    }

    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 void attack (Role role){
        Random r = new Random();
        int hurt = r.nextInt(20) + 1;
        int remainBlood = role.getBlood() - hurt;
        remainBlood = remainBlood < 0 ? 0 : remainBlood;
        role.setBlood(remainBlood);


        System.out.println(this.getName() + "举起拳头,攻击了" + role.getName() + "一下,造成了" + hurt + "点伤害,"
                + role.getName() + "还剩" + remainBlood + "血量");
    }

}

执行代码

public class RoleGameTest {
    public static void main(String[] args) {

    //创建两个对象
    Role r1 = new Role("喜洋洋",100);
    Role r2 = new Role("沸羊羊",100);
    //
    while(true) {
        r1.attack(r2);
        if (r2.getBlood() == 0) {
            System.out.println(r1.getName() + "KO了" + r2.getName());
            break;
        }
        r2.attack(r1);
        if (r1.getBlood() == 0) {
            System.out.println(r2.getName() + "KO了" + r1.getName());
            break;
        }
    }

    }
}

补充souf输出语句

  • 两部分参数
  • 第一部分参数:要输出的内容%s(占位)
  • 第二部分参数:填充的数据

2.2、对象数组练习

键盘录入

  • 第一套体系:
    • nextInt();接收整数
    • nextDouble();接收小数
    • next();接收字符串
    • 遇到空格,制表符,回车就停止接收。这些符号后面的数据就不会接收了
  • 第二套体系:
    • nextLine();接收字符串
    • 可以接收空格,制表符,遇到回车才停止接收数据
  • 键盘录入的两套体系不能混用
  • 弊端:先用nextInt,再用nextLine会导致下面的nextLine接收不到数据

练习

  • 定义数组存储3部汽车对象
  • 汽车的属性:品牌,价格,颜色。
  • 创建三个汽车对象,数据通过键盘录入而来,并把数据存入到数组当中
public class Car {
    private String brand;
    private int price;
    private String color;

    public Car() {
    }

    public Car(String brand, int price, String color) {
        this.brand = brand;
        this.price = price;
        this.color = color;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }
}
import java.util.Scanner;

public class CarTest {
    public static void main(String[] args) {
        //创建一个数组用来存三个汽车对象
        Car[] arr = new Car[3];
        //创建汽车对象,数据来自于键盘录入
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < arr.length; i++) {
            Car c = new Car();
            //汽车品牌
            System.out.println("请输入第" + (i + 1) + "辆车的品牌");
            String brand = sc.next();
            c.setBrand(brand);
            //汽车价格
            System.out.println("请输入第" + (i + 1) + "辆车的价格");
            int price = sc.nextInt();
            c.setPrice(price);
            //汽车颜色
            System.out.println("请输入第" + (i + 1) + "辆车的颜色");
            String color = sc.next();
            c.setColor(color);
            //将创建的对象存入数组
            arr[i] = c;
        }
        //遍历数组
        for (int i = 0; i < arr.length; i++) {
            Car car = arr[i];
            System.out.println(car.getBrand() + "," + car.getPrice() + "," + car.getColor());
        }
    }
}

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值