从这里开始,我的目标改变了,不再是学会java,而是看懂后端的代码,想要学习编写java的小伙伴可以不用往下看了,都是理论性的东西。
1.类和对象
前置知识:
类(设计图): 是对象共同特征的描述(就像洗衣服用洗衣机,类就是洗衣机的设计图)
对象: 是真实存在的具体东西(实例)真正可以帮我们做事的(对象就是洗衣机,要洗衣服的时候,调用洗衣机)。
在Java中,必须先设计类,才能获得对象
1.1设计对象并使用
1.定义类 2.获得类的对象并赋值,使用
1.2类的补充注意事项
1.2.1类的种类
- Javabean类:用来描述一类事物的类,在Javabean类中,是不写main方法的。
- 测试类:在以前,编写main方法的类,我们可以在测试类中创建javabean类的对象并进行赋值调用
1.2.2 注意点
1. 定义类的建议
- 类名首字母建议大写,需要见名知意,驼峰模式,
- 一个java文件,建议只写一个class类(一个java文件中可以定义多个class类,且只能一个类是public修饰,而且public修饰的类名必须成为代码文件名)
2.成员变量的格式和特点
- 成员变量的完整定义格式是:修饰符 数据类型 变量名称=初始化值;
一般无需指定初始化值,存在默认值,如下图。
一个Javabean类就是一个类别,像老师 里面存老师的属性和行为(属性:老师的姓名,教学的科目。行为:修改,编辑,删除等)
2.封装
面向对象的3大特征: 封装,继承,多态
封装的原则:对象代表什么,就得封装对应的数据,并提供数据对应的行为
例:人关门
门的状态数据在门的方法里,所以,修改这个状态的行为,也要放在门的方法中
封装的好处:
让编程变得很简单,有事--找对象,调方法就行。
降低学习成本,不用记对象有哪些方法,有需要时去找就行。
2.2 private关键字
是一个权限修饰符: 可以修饰成员(成员变量和成员方法)
被private修饰的成员只能在本类中才能访问
私有化后,即使赋值正确也无法赋值。
想要校验赋值是否合法,我们需要在GirlFriend中对每一个私有化的变量进行校验(get和set方法),校验通过,才赋值,不通过不赋值
注意:此时赋值,需要调用方法 gf2.setAge(18); 不再是gf2.age = 18;
获取,System.out.println(gf2.getAge());
private关键字总结:
1.private关键字是一个权限修饰符
2.可以修饰成员(成员变量和成员方法)
3.被private修饰的成员只能在本类中才能访问
4.针对private修饰的成员变量,如果需要被其他类使用,提供相应的操作5.提供“setXxx(参数)”方法,用于给成员变量赋值,方法用public修饰
6.提供“getXxx()”方法,用于获取成员变量的值,方法用public修饰
2.3 成员变量和局部变量
定义在类里面是成员变量,定义在方法里是局部变量
当成员变量和局部变量重名时,age打印出来是10,还是null呢?
答:就近原则,用离得近的
如果在方法里想用成员变量,需要用到,this指向
2.4 this
this的作用:区别局部变量和成员变量,使用this时,用的就是成员变量
3.构造方法
是什么? 构造方法也叫作构造器、构造函数。
作用: 在创建对象的时候给成员变量进行赋值(初始化)的。
我们之前 student s1=new student(); 的小括号中,什么都不写。表示调用空参的构造方法
带参构造后,自动赋值,不需要在调用时手动挨个赋值
总结:
1.构造方法作用
创造对象的时候,由虚拟机自动调用,给成员变量进行初始化的。
2.构造方法的种类,各自的作用
无参数构造方法:初始化的对象时,成员变量的数据均采用默认值有参数构造方法:在初始化对象的时候,同时可以为对象进行赋值
3.构造方法注意事项
任何类定义出来,默认就自带了无参数构造器,写不写都有一旦定义了有参数构造器,无参数构造器就没有了,此时就需要自己写无参数构造器了
建议在任何时候都手动写上空参和带全部参数的构造方法
4.标准的javabean
1.类名需要见名知意
2.成员变量使用private修饰
3.提供至少两个构造方法
无参构造方法
带全部参数的构造方法4.成员方法
提供每一个成员变量对应的setXxx()/getXxx()如果还有其他行为,也需要写上
5.综合练习
练习1:格斗游戏
格斗游戏,每个游戏角色的姓名,血量,都不相同,在选定人物的时候(new对象的时候),这些信息就应该被确定下来。
package com.itheima.test1;
import java.util.Random;
public class Role { //1.定义role类,提供该类的属性(姓名,血量)
private String name;
private int blood;
//2.提供有参,无惨构造方法
public Role () {};
public Role (String name,int blood) {
this.name = name;
this.blood = blood;
};
//3.提供get和set方法
//使用了private,就必须提供get和set方法
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;
}
//4.定义攻击别人的方法
// 问题:谁攻击谁,方法写在哪里?
// 创建角色对象1,Role r1 = new Role();
// 创建角色对象2,Role r2 = new Role();
// 如果是r1 攻击 r2 r1.攻击(r2)也就是方法的调用者攻击传进来的参数
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;// 当挨揍人血量<0时,不能再扣了
role.setBlood(remainBlood);
// 输出伤害语句
System.out.println(this.getName()+ "举起拳头,打了"+role.getName()+"一下,造成了"+ hurt +"点伤害,"+ role.getName() +"还剩下了"+ remainBlood +"点血");
}
}
package com.itheima.test1;
public class GameTest {
public static void main(String[] args) {
//1.创建角色
Role r1 = new Role("白骨精",100); //第一个角色
Role r2 = new Role("二郎神",100); //第二个角色
//2.开始格斗,回合制
while (true) {
r1.attack(r2); //首先r1攻击r2,如果r2的血量=0了,退出循环
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;
}
}
}
}
游戏优化,内容如下