🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### 类(class) java中只提供了基本数据类型,字符串,及一些数组,无法表示很多类型数据,比如学生:那么如何在java程序中表示一个Student?我们可以创建一个新的类型是就是Student,这就是类的功能。 **类是一种数据类型** *** ### 构造器 从类当中实例化出来的个体,我们称之为对象,创建对象的语法为:**类名 对象(实例)名称 = new 构造器();** 构造器的作用: 1.创建对象 2.为对象属性进行初始化 #### **注意:一个类如果没有写任何构造器,这个类会默认提供一个空的无参构造器,一旦一个类有了任意一个构造器,默认的构造器将不再提供,创建对象时只能调用已经存在的构造器** 通过构造器的重载,可以在实例化对象的时候大大便利我们的开发 Person.java ~~~ public class Person { String name;// 名字 String sex;// 性别 int age;// 年龄 // 构造器:1.创建对象,如果一个类没有写任何构造器,系统会默认提供一个空的无参构造器 // 一旦写了有参构造器,默认构造器不再提供 // 2.直接给对象属性赋值 public Person() { } public Person(String n,String s) { name = n; sex = s; } public Person(String n,String s,int a) { name = n; sex = s; age = a; } public void updateName(String n) { name = n; } public void updateAge(int a) { if(a > 0) { age = a; }else { System.out.println("error"); } } public void study(String subject) { int num = 20; System.out.println(name+"嗷嗷学"+subject); } } ~~~ Test.java ~~~ public class Test { public static void main(String[] args) { // 创建对象:类名 对象(实例)名称 = new 构造器(); // Person p1 = new Person(); 无参构造器实例化 Person p1 = new Person("张三","男",16);// 有参构造器实例化 // 可以用对象调用到对象属性和方法 p1.updateName("hello"); System.out.println(p1.name); } } ~~~ ### 内存模型 ![](https://box.kancloud.cn/f1d5d006946d362c76cb96d01b350b5f_854x517.png) **只有两个引用指向堆区同一块区域,才是同一个对象(上图中p1,p2虽然属性值完全一样,但是因为指向区域不同,所以不是一个对象)** *** ### 对象作为参数及属性 #### 小练习 **战士PK** Fighter.java 战士类 ~~~ /** * 战士类 * @author Administrator */ public class Fighter { String name;// 角色名 int hp = 100;// 血量 int defend = 8;// 防御力 int level = 1;// 等级 int dps = 10;// 攻击力 Weapon w = new Weapon("乌木剑", 4);// 武器 public Fighter(String n) { name = n; } public Fighter(String n,Weapon w1) { name = n; w = w1; } /** * 攻击方法 * @param fighter 另一个战士对象 */ public void attack(Fighter f) { // 判断当前战士是否有血 if(hp <= 0) { System.out.println("您已经死亡,无法攻击目标"); }else { // 判断对方是否有血 if(f.hp > 0) { // 计算伤害 int damage = 0; if(level + 10 <= f.level || dps + w.dps <= f.defend) { // 对方等级超出自己10级,强制伤害为1点 damage = 1; }else { damage = (int)((dps + w.dps - f.defend)*((1-(f.level - level)*0.1))); } // 暴击 double random = Math.random(); if(random < 0.4) { damage *= 1.5; System.out.print(name+"发动强力一击,"); } System.out.println(name+"手持"+w.name+"对"+f.name+"造成了"+damage+"点伤害"); f.hp = f.hp - damage; if(f.hp < 0) { f.hp = 0; System.out.println(f.name+"阵亡了"); return; } System.out.println(f.name+"还有"+f.hp+"点血"); }else{ System.out.println("目标已经死亡,严禁鞭尸"); } } } /** * 升级 * @param money 充的金币 */ public void Uplevel(int money) { if(money <= 0) { System.out.println("不充钱玩声明游戏"); }else { int num = money/100; level = level + num; dps = dps + num * 8; defend = defend + num * 3; hp = hp + num * 30; System.out.println(name+"升了"+num+"级,能力获得很大提升!!!!!!!"); } } /** * 回复 */ public void drink() { if(hp < 0) { System.out.println("去死,喝不了"); return; } hp = 100 + (level - 1) * 30; System.out.println(name+"满血了,很牛b!"); } } ~~~ Weapon.java 武器类 ~~~ /** * 武器 * @author Administrator * */ public class Weapon { String name; int dps; public Weapon(String n,int d) { name = n; dps = d; } } ~~~ FighterTest.java 测试类 ~~~ public class FighterTest { public static void main(String[] args) { Weapon w1 = new Weapon("擀面杖", 12); Weapon w2 = new Weapon("凳子", 11); Fighter f1 = new Fighter("三季稻",w1); Fighter f2 = new Fighter("李大花"); while(true) { double num = Math.random(); // num小于0.5,f1攻击f2 if(num < 0.5) { double num1 = Math.random(); if(num1 < 0.1) { f1.Uplevel(500); } if(num1 >= 0.1 && num1<= 0.2) { f1.drink(); } f1.attack(f2); }else { double num1 = Math.random(); if(num1 < 0.2) { f2.Uplevel(500); } if(num1 >= 0.2 && num1<= 0.4) { f2.drink(); } f2.attack(f1); } if(f1.hp <= 0 || f2.hp <= 0) { break; } } } } ~~~ *** ### 匿名对象 ~~~ // 匿名对象--只生效一次 new Person().age = 12; ~~~ *** ### 垃圾回收机制(GC) **没有引用指向的对象JVM会视其为垃圾**,JVM会调用这个对象的finalize()释放内存空间 ~~~ // 如下代码,堆区当中始终都只保留一个对象,之前生成的都被回收了 for(int i = 0;i <10000;i++) { Person p = new Person(); } ~~~ *** ### 栈(stack)内存模型--后进先出 先调用的方法,后执行完毕 ![](https://box.kancloud.cn/71a95f46e1e035a9f721afb68b8017c6_447x279.png) *** ### JavaBean(实体类) 1.有无参构造器(必要条件)--与框架相关 2.所有属性私有--保护数据 3.公有的get和set方法--获取修改数据 ~~~ public class JavaBean { private int num; private String name; public int getNum() { return num; } public void setNum(int num) { this.num = num; } public String getName() { return name; } public void setName(String name) { this.name = name; } } ~~~