> 文章列表 > Java笔记_6(面向对象)

Java笔记_6(面向对象)

Java笔记_6(面向对象)

Java笔记_6

  • 一、面向对象
    • 1.1、设计对象并使用
    • 1.2、封装
    • 1.3、就近原则和this关键字
    • 1.4、构造方法
    • 1.5、标准的JavaBean类
    • 1.6、对象内存图
    • 1.7、基本数据类型和引用数据类型
    • 1.8、this的内存原理
    • 1.9、成员和局部
  • 二、面向对象(综合练习)
    • 2.1、文字版格斗游戏
    • 2.2、对象数组
    • 2.3、键盘录入的体系
    • 2.4、对象数组2

一、面向对象

1.1、设计对象并使用

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

在Java中,必须先设计类,才能获得对象。
Java笔记_6(面向对象)
定义类的补充注意事项

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

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

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

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

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

对象的成员变量的默认值规则:
Java笔记_6(面向对象)
开发中类的设计

一般分为属性行为

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

1.2、封装

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

封装的好处

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

理解封装思想的好处

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

private关键字

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

1.3、就近原则和this关键字

成员变量和局部变量
Java笔记_6(面向对象)

  • 当成员变量和局部变量重名时会按照就近原则取值,这是如果加上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. 将堆内存中的地址值赋值给左边的局部变量

两个对象的内存图
Java笔记_6(面向对象)
两个引用指向同一个对象的内存图
Java笔记_6(面向对象)

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

基本数据类型

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

引用数据类型
例如对象:
Java笔记_6(面向对象)

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

1.8、this的内存原理

this的作用:区分局部变量和成员变量
this的本质:所在方法调用者的地址值
Java笔记_6(面向对象)

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;}}