💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、豆包、星火、月之暗面及文生图、文生视频 广告
# 面向对象 * * * ### 类(class) java中只提供了基本数据类型,字符串,及一些数组,无法表示很多类型数据,比如学生:那么如何在java程序中表示一个Student?我们可以创建一个新的类型就是Student,这就是类的功能 ### 类是一种数据类型 * * * ### 构造器 从类当中实例化出来的个体,我们称之为对象,创建对象的语法为:**类名 对象(实例)名称 = new 构造器();** **构造器的作用** 1.创建对象 2.为对象属性进行初始化 **注意:一个类如果没有写任何构造器,这个类会默认提供一个空的无参构造器,一旦一个类有了任意一个构造器,默认的构造器将不再提供,创建对象时只能调用已经存在的构造器** 通过构造器的重载,可以在实例化对象的时候大大便利我们的开发 Person.java ~~~ public classPerson { String name;//名字 String sex;//性别 int age;//年龄 //构造器:1.创建对象,如果一个类没有写任何构造器,系统会默认提供一个空的无参构造器 //一旦写了有参构造器,默认构造器不再提供 //2.直接给对象属性赋值 public Person() { } public Person(String n,String s) { name = n; sex = s; } public Preson(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); } } ~~~ ### Tect.java ~~~ public class Test { public static void main(String[] args) { //创建对象:类名 对象(实例)名称 = new 构造器(); //Preson p1 = new Person();无参构造器实例化 Preson p1 = Preson("张三","男",16);//有参构造器实例化 //可以用对象调用到对象属性和方法 P1.updateName("hello"); System.out.println(p1.name);![](https://box.kancloud.cn/f1d5d006946d362c76cb96d01b350b5f_854x517.png) } } ~~~ ### 内存模型 ![](https://box.kancloud.cn/f1d5d006946d362c76cb96d01b350b5f_854x517.png) **只有两个引用指向堆区同一块区域,才是同一个对象(上图中p1,p2虽然属性值完全一样,但是因为指向区域不同,所以不是一个对象)** * * * ### 对象作为参数及属性 小练习 **战士PK** Fighter.java 战士类 ~~~ /** *战士类 *@author Administrator */ public class Fighter { String name;//角色名 int hp = 100;//血量 int defent = 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("目标已经死亡,严禁鞭尸"); } } } } } ~~~ 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; } } ~~~