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中,必须先设计类,才能获得对象。
定义类的补充注意事项
-
用来描述一类事物的类,专业叫做: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{
修饰符 类名(参数){
方法体;
}
}
特点:
- 方法名与类名相同,大小写也要一致
- 没有返回值类型,连void都没有
- 没有具体的返回值(不能由retrun带回结果数据)
执行时机:
- 创建对象的时候由虚拟机调用,不能手动调用构造方法
- 每创建一次对象,就会调用一次构造方法
构造方法注意事项:
- 构造方法的定义
- 如果没有定义构造方法,系统将给出一个默认的无参数构造方法
- 如果定义了构造方法,系统将不再提供默认的构造方法
- 构造方法的重载
- 带参构造方法,和无参数构造方法,两者方法名相同,但是参数不同,这叫做构造方法的重载
- 推荐的使用方式
- 无论是否使用,都手动书写无参数构造方法,和带全部参数的构造方法
构造方法的种类以及作用:
- 无参数构造方法:初始化的对象时,成员变量的数据均采用默认值。
- 有参数构造方法:在初始化对象的时候,同时可以为对象进行赋值。
构造方法概述:
创造对象的时候,虚拟机会自动调用构造方法,作用是给成员变量进行初始化的。
1.5、标准的JavaBean类
- 类名需要见名知意
- 成员变量使用private修饰
- 提供至少两个构造方法
- 无参构造方法
- 带全部参数的构造方法
- 成员方法
- 提供每一个成员变量对应的setXxx()/getXxx()
- 如果还有其他行为,也需要写上
1.6、对象内存图
一个对象的内存图
Student s = new Student()
- 加载class文件
- 申明局部变量
- 在堆内存中开辟一个空间
- 默认初始化
- 显示初始化
- 构造方法初始化
- 将堆内存中的地址值赋值给左边的局部变量
两个对象的内存图
两个引用指向同一个对象的内存图
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;
}
}