JavaSE(6) - 面向对象-1

发布时间 2023-09-23 15:13:38作者: 大宝贝94106

JavaSE(6) - 面向对象-1

p82 类和对象

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

在java中, 必须先设计类, 才能获得对象.

  1. 如何得到对象
public class 类名{
    1.成员变量(代表属性的,一般是名词)
    2.成员方法(代表行为的,一般是动词)
}
类名 对象名 = new 类名();
  1. 拿到对象后能做什么?
对象.成员变量;
对象.成员方法(...)

类的定义

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

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

类调用的补充注意事项

  • 类的首字母建议大写, 需要见名知意, 大驼峰模式. 并不能用关键字.
  • 一个java文件中可以定义多个class类, 且只能一个类是public修饰, 而且public修饰的类名必须成为代码文件名.实际开发中建议还是一个文件定义一个class类.
  • 成员变量的完整定义格式是 : 修饰符 数据类型 变量名 = 初始化值;,一般无需指定初始化值, 存在默认值.

小技巧 : 按住alt+左键 或者 滚轮+左键竖着多选

p83 封装

  1. 什么是封装

    • 告诉我们, 任何正确设计对象的属性和方法.
    • 原则 : 对象代表什么, 就得封装对应的数据, 并提供数据对应的行为.
  2. 理解封装思想的好处

    • 让编程变得简单, 有生命事, 找对象, 调用方法就行.
    • 降低我们的学习成本, 可以少学,少记,或者压根不用学,不用记对象有哪些方法, 有需要的时候去找就行.

private关键字

  1. private关键字是一个权限修饰符

  2. 可以修饰成员(成员变量和成员方法)

  3. 被private修饰的成员只能在本类中才能访问

  4. 针对private修饰的成员变量, 如果需要被其它类使用, 得提供相应的操作

  5. 提供" setXxx(参数)" 方法, 给成员变量赋值, 方法用public修饰

  6. 提供" getXxx(参数)" 方法, 获取成员变量的值, 方法用public修饰

p84 就近原则和this关键字

  1. 就近原则 :

    • System.out.println(age); - 先在局部找(方法内部),如果找不到就到类中(成员位置)找
    • System.out.println(this.age); - 不会到局部去找,只会在类中(成员位置)去找
  2. this的作用

    • 可以区别成员变量和局部变量

p85 构造方法

作用 : 在创建对象的时候,由虚拟机自动调用,给成员变量初始化(赋值)

格式 :

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

构造方法有两种:

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

执行时机 :

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

构造方法的注意事项

  1. 构造方法的定义

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

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

    • 无论是否使用, 都手动书写无参构造方法, 和带全部参数的构造方法.
package Basic.Constructor;
//构造方法和get/set方法的写法
public class student {
    private String name;
    private int age;
    public student(){}//空参构造方法

    //带参构造方法
    public student(String name,int age){
        this.name = name;
        this.age = age;
    }
    //
    public void setName(String name){
        this.name = name;
    }
    public void setAge(int age){
        this.age = age;
    }
    public String getName(){
        return name;
    }
    public int getAge(){
        return age;
    }
    public void study(){
        System.out.println("study!");
    }
    public void eat(){
        System.out.println("eat!");
    }
}
//==========在测试类中定义===============================
package Basic.Constructor;
public class Demo {
    public static void main(String[] args) {
        //根据构造方法的参数给对象赋值
        student s = new student("George",8);
//        s.setAge(10);//用set方法给对象赋值
//        s.setName("George");
        //调用属性和方法
        System.out.print(s.getName()+" is "+s.getAge()+", He likes to ");
        s.study();
    }
}

p86 标准的JavaBean类

标准的JavaBean类

  1. 类名需要见名知意,大驼峰命名

  2. 成员变量使用private修饰

  3. 提供至少两个构造方法

    • 无参构造方法
    • 带全部参数的构造方法
  4. 成员方法

    • 提供每一个成员变量对应的 setXxx() / getXxx()
    • 如果还有其它行为, 也需要写上

自动生成构造方法,get / set 方法

快捷键 : alt + insert , alt + Fn + insert 在窗口中 CTRL + A 或者 shift + 左键 全选

**插件PTG 可以一秒生成标准JavaBean **

p87 对象的内存图

创建一个对象并加载的内存图

student s = new student();
  1. 加载class文件(student类的字节码文件)到方法区
  2. 声明局部变量(student s)
  3. 在堆内存中开辟一个空间(new关键字创建对象)
  4. 初始化(默认初始化) (显示初始化) (构造方法初始化)
  5. 把这个空间的地址值赋值给局部变量(s)

两个对象的内存图(创建两个空间)

如果出现两个new就会在堆内存中开辟两个内存空间,并且是独立,互不影响的.

两个引用指向同一个对象的内存图

只要有一个变量对对象发生了改变, 其它对象访问时也是改变了的.

p88 基本数据类型和引用数据类型

基本数据类型就是在本身的空间里的数据(加载方法的栈空间).

特点: 赋值给其它变量, 赋的是真实的值.

引用数据类型中存的是其它空间的地址值, "引用,引用" 就是拿别的空间里的数据来使用(指堆内存空间).

特点: 赋值给其它变量, 赋的是地址值(指向其它空间的地址).

p89 this的内存原理

this的作用 : 区分局部变量和成员变量.

this的本质 : 所在方法调用者的地址值.

p90 成员和局部

成员变量 : 类中方法外的变量

局部变量: 方法中的变量或者方法声明中(方法形参)

区别 变量 成员局部变量
初始化 有默认初始化值 没有,使用前要赋值
内存位置 堆的对象内存 栈的方法内存
生命周期 随对象的创建和消失 随着方法的调用和结束
作用域 这个类中有效 当前方法中有效

面向对象1- 综合练习

p91文字格斗游戏
需求: 两个角色(role)pk,回合制,角色都有,名字name,血量hp,在选定人物时候(new对象的时候),这些信息就应该被确定下来.
控制台: a 攻击了 b , 造成了XXX点伤害, b还剩下XXX点血.
a 打败了 b.

使用技巧

printf
System.out.printf("hello%s",world) -> helloworld
System.out.printf("%shello%s",哈哈,world) -> 哈哈helloworld
%s 是占位符, 后面的参数是填充的数据.没有换行效果.

步骤:1. 先写一个JavaBean类 role(角色) 属性:name,hp.构造方法,get/set方法
攻击方法attack: 谁攻击谁,方法的调用者攻击参数.
造成的伤害为1~20(随机)damage, 修改挨打人的血量remainHp,用三元控制一下remainHp,不能为负数.
真正修改挨打人的血量.

  1. 在测试类中,创建两个对象, 在循环中调用攻击方法,再判断谁的hp为0,谁就被打败.

  2. 升级版 ,name属性不同(鸣人,佐助) 会有不同的招式
    根据随机伤害不同 : -200,020,2040,4080.四种解说

  3. 数据的伤害不同会有不同的招式解说:
    (鸣人)
    "%s发动攻击,%s使出了'影分身'.%s的攻击打中了分身"-20~0
    "%s使出了'飞踢攻击'打中了%s", 0~20
    "%s使出了'手里剑攻击'打中了%s" 20~40
    ,"%s使出了'螺旋丸攻击'打中了%s" 40~80

​ (佐助)
​ "%s发动攻击,%s使出了'须佐能乎'.%s的攻击被防御了"-20~0
​ "%s使出了'重拳攻击'打中了%s", 0~20
​ "%s使出了'草薙剑攻击'打中了%s" 20~40
​ ,"%s使出了'千鸟攻击'打中了%s", 40~80

p92 对象数组练习
1.定义数组存储3个商品对象
商品属性:id,名字,价格,库存 . 创建三个对象 , 把商品对象存入数组中.打印对象属性.

  1. 定义数组存储3部汽车对象, 属性,品牌(brand),价格(price),颜色(color). 创建3个汽车对象, 数据通过键盘录入而来. 再把数据存入数组.并输出数据.

  2. 定义数组存储3手机对象, 属性,品牌(brand),价格(price),颜色(color). 要求, 计算三部手机的平均价格.

  3. 定义数组存储4个女朋友的对象, 属性, 姓名,年龄,性别,爱好. 要求1:计算出平均年龄,要求2:统计年龄比平均年龄低的女朋友有几个,并把他们的所有信息打印出来.

  4. 定义一个长度为3的数组, 存储1~3名学生对象作为初始数据, 学生对象的学号, 姓名各不相同. 属性: 学号, 姓名, 年龄.

    需求1:再次添加一个学生对象, 并在添加的时候进行学号的唯一性判断.

    需求2:添加完毕后, 遍历所有学生信息.

    需求3:通过ID删除学生信息, 如果存在就删除,如果不存在则提示删除失败.

    需求4:删除完毕之后, 遍历所有学生信息

    需求5:查询数组ID为"002"的学生, 如果存在,则将他的年龄+1岁