Compare commits

...

8 Commits

17 changed files with 531 additions and 0 deletions

View File

@@ -0,0 +1,28 @@
package com.inmind.class_member_var09;
//防御装类
public class Armor {
private String name;
private int protectNum;//防御值
public Armor(String name, int protectNum) {
this.name = name;
this.protectNum = protectNum;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getProtectNum() {
return protectNum;
}
public void setProtectNum(int protectNum) {
this.protectNum = protectNum;
}
}

View File

@@ -0,0 +1,46 @@
package com.inmind.class_member_var09;
/*
类作为成员变量类型(hero,weapon,armor)
案例:英雄角色,获取武器,获取防御装,闯关
*/
public class Demo07 {
public static void main(String[] args) {
//创建英雄角色对象
Hero hero = new Hero();
hero.setName("德玛西亚");
//打怪,掉落武器
Weapon weapon = new Weapon("屠龙刀", 999);
hero.setWeapon(weapon);
//打怪,掉落防具
Armor armor = new Armor("复活甲", 888);
hero.setArmor(armor);
//打boss
hero.attack();
//boss回击
hero.protect();
System.out.println("BOSS掉落了一本技能书");
Skill skill = new Skill() {
@Override
public void outSkill() {
System.out.println("施放野火燎原技能团队伤害9999");
}
@Override
public String getName() {
return "野火燎原";
}
};
//装备技能
hero.setSkill(skill);
//英雄获取自己的技能,并施放
hero.getSkill().outSkill();
System.out.println("游戏结束");
}
}

View File

@@ -0,0 +1,78 @@
package com.inmind.class_member_var09;
import java.util.ArrayList;
public class Hero {
private String name;
private Weapon weapon;
private Armor armor;
//背包
private ArrayList<Weapon> weapons;
//拥有技能
private Skill skill;
public Skill getSkill() {
return skill;
}
public void setSkill(Skill skill) {
this.skill = skill;
System.out.println("英雄"+this.name+"装备了技能-"+this.skill.getName());
}
public Hero() {
}
public Hero(String name, Armor armor, Weapon weapon) {
this.name = name;
this.armor = armor;
this.weapon = weapon;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Weapon getWeapon() {
return weapon;
}
public void setWeapon(Weapon weapon) {
this.weapon = weapon;
System.out.println("英雄"+this.name+"装备了"+this.weapon.getName());
}
public Armor getArmor() {
return armor;
}
public void setArmor(Armor armor) {
this.armor = armor;
System.out.println("英雄"+this.name+"装备了"+this.armor.getName());
}
public ArrayList<Weapon> getWeapons() {
return weapons;
}
public void setWeapons(ArrayList<Weapon> weapons) {
this.weapons = weapons;
}
//行为
//攻击
public void attack(){
System.out.println(this.name+"使用了-"+this.weapon.getName()+"-武器,输出了"+this.weapon.getHurt()+"伤害");
}
//防御
public void protect(){
System.out.println(this.name+"穿戴了-"+this.armor.getName()+"-防具,抵消了"+this.armor.getProtectNum()+"伤害");
}
}

View File

@@ -0,0 +1,8 @@
package com.inmind.class_member_var09;
public interface Skill {
//施放技能的方法
void outSkill();
String getName();
}

View File

@@ -0,0 +1,28 @@
package com.inmind.class_member_var09;
//武器类
public class Weapon {
private String name;
private int hurt;
public Weapon(String name, int hurt) {
this.name = name;
this.hurt = hurt;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHurt() {
return hurt;
}
public void setHurt(int hurt) {
this.hurt = hurt;
}
}

View File

@@ -0,0 +1,39 @@
package com.inmind.local_innerclass07;
import com.inmind.member_innerclass06.Member_Outer_Class;
/*
局部内部类定义(方法中)
局部内部类的格式:
public class 外部类名{
方法修饰符 返回值类型 成员变量名(参数列表){
class 局部内部类名{
}
}
}
注意:局部内部类是定义在方法中,只能够在该定义方法中使用
*/
public class OuterClass {//外部类
//成员方法
public void method(){
int num = 10;//局部变量
//局部内部类
class InnerClass{
int num = 20;
static int i = 30;
public void innerMethod(){
System.out.println(num);
}
}
InnerClass innerClass = new InnerClass();
System.out.println(innerClass.num);
innerClass.innerMethod();
}
public void method1(){
}
}

View File

@@ -0,0 +1,5 @@
package com.inmind.noname_innerclass08;
public abstract class AbstractClass {
public abstract void method1();
}

View File

@@ -0,0 +1,10 @@
package com.inmind.noname_innerclass08;
public class Animal {
int age;
String name;
public void eat(){
System.out.println("动物要吃吃吃");
}
}

View File

@@ -0,0 +1,93 @@
package com.inmind.noname_innerclass08;
/*
匿名内部类:定义在方法中的一个没有名字的类
之前我们使用的一个类的子类,或者接口的实现类时,必定要先定义.java文件再创建出对象调用方法但是
如果该子类或者实现类只用一次,那么.java文件就有点多余了这时就可以使用匿名内部类
匿名内部类定义:
{
@Override
public void method() {
System.out.println("匿名内部类的method方法被调用了");
}
};
必须跟new 接口名(匿名内部类定义) new 抽象类名匿名内部类定义new 普通类名(匿名内部类定义)后面。
*/
public class Demo06 {
public static void main(String[] args) {
//普通接口的使用
MyInterfaceImpl impl = new MyInterfaceImpl();
impl.method();
//多态的使用:父类引用指向子类对象
MyInterface impl1 = new MyInterfaceImpl();
impl1.method();
//能不能将MyInterfaceImpl.java这个类的定义直接省略掉那就使用匿名内部类
MyInterface impl2 = new MyInterface(){
@Override
public void method() {
System.out.println("匿名内部类中的method方法被调用了");
}
};
impl2.method();
//---------------------------------------------------
//抽象父类的匿名内部类
// 使用AbstractClass但是不定义出它的子类的java文件使用匿名内部类
AbstractClass ac = new AbstractClass(){
@Override
public void method1() {
System.out.println("匿名内部类子类实现了抽象父类的method1方法");
}
};
ac.method1();
//-----------------------------------------------------
//普通类的匿名内部类
Animal dog = new Animal(){
@Override
public void eat() {
System.out.println("狗吃骨头");
}
};
dog.eat();
//匿名内部类和匿名对象
//new Scanner(System.in).nextInt();//匿名对象
/*
new MyInterface(){
@Override
public void method() {
System.out.println("匿名内部类中的method方法被调用了");
}
} 是匿名对象
{
@Override
public void method() {
System.out.println("匿名内部类中的method方法被调用了");
}
}是匿名内部类
*/
new MyInterface(){
@Override
public void method() {
System.out.println("匿名内部类中的method方法被调用了");
}
}.method();
}
public void method(){
}
}

View File

@@ -0,0 +1,5 @@
package com.inmind.noname_innerclass08;
public interface MyInterface {
void method();
}

View File

@@ -0,0 +1,8 @@
package com.inmind.noname_innerclass08;
public class MyInterfaceImpl implements MyInterface{
@Override
public void method() {
System.out.println("MyInterfaceImpl类中的method方法被调用了");
}
}

View File

@@ -0,0 +1,14 @@
package com.inmind.object01;
/*
Object:是所有类的父类,java中所有的类直接或者间接继承自Object
*/
public class Demo01 {
public static void main(String[] args) {
//普通创建对象
Person p = new Person();
Student s = new Student();
//多态创建对象
Person p1 = new Student();
}
}

View File

@@ -0,0 +1,37 @@
package com.inmind.object01;
import java.util.ArrayList;
/*
Object类的toString方法
String toString() 返回对象的字符串表示形式。
Object类的toString的源码
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
注意:在实际开发中,一个对象的地址值对于我们而言,没有太大的帮助,我们程序员希望直接看到
该对象的内容(属性),那怎么办呢???
现在父类Object类的toString功能,不符合子类Person的需求,那么我们就可以在对应的子类中重写toString
总结:今后打印对象时,如果发现打印时输出了地址,但是我们想看属性内容,应该在该对象的类中重写toString
不用手动写alt+insert自动生成即可
*/
public class Demo02 {
public static void main(String[] args) {
Person p = new Person();
p.age = 20;
p.name = "张三";
System.out.println(p);//com.inmind.object01.Person@3b07d329此处调用的是Object的toString方法
ArrayList<Integer> lists = new ArrayList<>();
lists.add(1);
lists.add(2);
lists.add(3);
//为何现在打印对象内容变了因为println(Object):底层调用的是该对象的toString方法并返回但是ArrayList重写了父类的toString方法
System.out.println(lists);//[1, 2, 3]
}
}

View File

@@ -0,0 +1,42 @@
package com.inmind.object01;
import java.util.ArrayList;
/*
Object类
boolean equals(Object obj) 判断2个对象的内容是否相同
在实际开发中,地址值对于我们而言没有太大的作用,比较关心的数据内容,经常将内容相同的
2个对象看作是同一个
对于引用数据类型:
==:比较的是地址值
equals比较的是内容
Object类底层equals源码
public boolean equals(Object obj) {
return (this == obj);
}
如果父类的内容比较功能equals不符合子类需求那就重写equals方法即可
总结每个对象的equals方法继承自Object类默认使用==比较地址值,这个对于我们而言,不满足咱们需求
因此我们会在每个类中重写equals方法不用手动写直接alt+insert自动生成
*/
public class Demo03 {
public static void main(String[] args) {
//引用数据类型
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2);//true 比较的是地址
//引用数据类型Person
Person p1 = new Person("张三", 20);
Person p2 = new Person("张三", 20);
System.out.println(p1 == p2);//false
System.out.println(p1.equals(p2));//true
}
}

View File

@@ -0,0 +1,58 @@
package com.inmind.object01;
import java.util.Objects;
public class Person {//直接继承自Object
String name;
int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
/*@Override
public boolean equals(Object obj) {
//我希望在Person比较时只比较内容(姓名和年龄),而不是地址
//只要姓名和年龄是一致的,那就是同一个人
//先直接判断地址是否相同,如果地址相同,则认为内容相同
if (this == obj) {
return true;
}
//先判断类型,如果类型不一致,则认为内容不同
if (obj instanceof Person) {
//如果是同一个类型,则进行属性的比较
Person p2 = (Person) obj;
Person p1 = this;
*//*if (p1.name.equals(p2.name) && p1.age == p2.age) {
return true;
} else {
return false;
}*//*
return p1.name.equals(p2.name) && p1.age == p2.age;
} else {
return false;
}
}*/
@Override
public boolean equals(Object o) {
if (o == null || this.getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age && Objects.equals(name, person.name);
}
}

View File

@@ -0,0 +1,4 @@
package com.inmind.object01;
public class Student extends Person{//间接继承自Object
}

View File

@@ -0,0 +1,28 @@
package com.inmind.objects02;
import com.inmind.object01.Person;
import java.util.Objects;
/*
4.Objects类的equals方法
static boolean equals(Object a, Object b) 返回 true如果参数相等彼此 false否则。
Objects类的equals方法的作用:在实现判断2个对象是否相同的基础上,有效地避免空指针异常
*/
public class Demo04 {
public static void main(String[] args) {
Person p1 = new Person("张三", 20);
Person p2 = new Person("张三", 20);
//普通的判断写法
System.out.println(p1.equals(p2));//true
//不小心将p1初始化了
// p1 = null;
/*if (p1 != null){
System.out.println(p1.equals(p2));
}*/
System.out.println(Objects.equals(p1, p2));
//请问Objects.equals它本身有比较内容的功能吗没有它使用的是p1对象的equals方法
}
}