今天周一,昨天周日啥也没干睡了一天的觉,嘿嘿,就不写了。今天没什么特别的,学习了一下JAVA的基础知识,也快学完了呢。哎,还是烦,到底啥时候能帮上忙呢,菜的抠脚啊,坐着干着急可不行。在公司里坐着总想摸鱼,也是因为太闲了?哈哈哈,给点事情做就好了。就这样,准备睡觉了,困死。对了,那个谁还说单位给介绍对象,有点酸啊,危机感来了。好好学然后跳回家吧,不然啥也捞不着了
类的多态条件
要实现类的多态,需要如下条件
父类(接口)引用指向子类
对象调用的方法有重写
package charactor; import Interface.Mortal; /** * 1. 设计一个接口 * 接口叫做Mortal,其中有一个方法叫做die * 2. 实现接口 * 分别让ADHero,APHero,ADAPHero这三个类,实现Mortal接口,不同的类实现die方法的时候,都打印出不一样的字符串 * 3. 为Hero类,添加一个方法,在这个方法中调用 m的die方法。 * * public void kill(Mortal m) * * * 4. 在主方法中 * 首先实例化出一个Hero对象:盖伦 * 然后实例化出3个对象,分别是ADHero,APHero,ADAPHero的实例 * 然后让盖伦 kill 这3个对象 */ public class Hero{ public static void main(String[] args) { Hero garen = new Hero(); Mortal hero1 = new ADHero(); garen.kill(hero1); Mortal hero2 = new APHero(); garen.kill(hero2); Mortal hero3 = new ADAPHero(); garen.kill(hero3); } public void kill(Mortal m){ m.die(); } }
Hero h =new ADHero();
h.battleWin(); //battleWin是一个类方法
h是父类类型的引用
但是指向一个子类对象
h.battleWin(); 会调用父类的方法?还是子类的方法?
调用父类的方法
super关键字的应用
Hero.java package charactor; import property.Item; public class Hero{ String name; //姓名 float hp; //血量 float armor; //护甲 int moveSpeed; //移动速度 public void useItem(Item i){ System.out.println("hero use item"); i.effect(); } public Hero(){ System.out.println("Hero的无参的构造方法 "); } public Hero(String name){ System.out.println("Hero的有一个参数的构造方法 "); this.name = name; } public static void main(String[] args) { new Hero(); } } ADHero.java package charactor; import Interface.AD; import Interface.Mortal; public class ADHero extends Hero implements AD , Mortal { @Override public void physicAttack() { System.out.println("进行物理攻击"); } @Override public void die() { System.out.println("ADHero died"); } public ADHero(String name) { //super显式调用父类带参的构造方法,将Hero中的name调用了 //创建子类对象时,默认会先调用父类无参的构造方法 //可以通过super关键字指定调用父类的构造方法 super(name); System.out.println("AD Hero的构造方法"); } public static void main(String[] args) { new ADHero("tan jin ji"); } }
/** * 测试this关键字的作用,当我们new一个动物cat时,让cat去调用eat方法,结果显示的却是老鼠在吃; * 也就是说当存在同名的成员变量与局部变量时,在方法的内部访问的是局部变量, * 那是因为Java采取的是就近原则访问的,要解决这个问题就需要使用this关键字; */ public class JudgeIsLeapYear { public static void main(String[] args) { //此时在内存中存在两份name数据 Animal dog = new Animal("狗","白色"); Animal cat = new Animal("猫","黑色"); cat.eat(); } } class Animal { String name; String color; public Animal(String n, String c) { name = n; color = c; } public void eat() { String name = "老鼠"; //this关键字代表了所属函数的调用者对象 System.out.println(this.name + "在吃……"); } }
package charactor; import Interface.AD; /** * 通过super调用父类的moveSpeed属性 * ADHero也提供了属性moveSpeed */ public class ADHero extends Hero implements AD { int moveSpeed=400; //移动速度 @Override public void physicAttack() { System.out.println("进行物理攻击"); } public int getMoveSpeed(){ return this.moveSpeed; } public int getMoveSpeed2(){ return super.moveSpeed; } public static void main(String[] args) { ADHero h = new ADHero(); System.out.println(h.getMoveSpeed()); System.out.println(h.getMoveSpeed2()); } }
public boolean equals(Object o){ //instanceof关键字表示判断o是不是Hero类型 if(o instanceof Hero){ //对象转型,将Object类型的引用o转型为Hero类型,h也指向了o所指向的对象 Hero h = (Hero) o; //this关键字指向当前对象,判断当前对象o的hp是否和h的hp相等 return this.hp == h.hp; } return false; }
抽象类和接口的区别
区别1:
子类只能继承一个抽象类,不能继承多个
子类可以实现多个接口
区别2:
抽象类可以定义
public,protected,package,private
静态和非静态属性
final和非final属性
但是接口中声明的属性,只能是
public 静态 final的
即便没有显式的声明
抽象类和接口都可以有实体方法。接口中的实体方法,叫做默认方法
非静态内部类 BattleScore “战斗成绩”
非静态内部类可以直接在一个类里面定义
战斗成绩只有在一个英雄对象存在的时候才有意义
所以实例化BattleScore 的时候,必须建立在一个存在的英雄的基础上
语法: new 外部类().new 内部类()
作为Hero的非静态内部类,是可以直接访问外部类的private实例属性name的
package charactor; public class Hero { private String name; // 姓名 float hp; // 血量 float armor; // 护甲 int moveSpeed; // 移动速度 // 非静态内部类,只有一个外部类对象存在的时候,才有意义 // 战斗成绩只有在一个英雄对象存在的时候才有意义 class BattleScore { int kill; int die; int assit; public void legendary() { if (kill >= 8) System.out.println(name + "超神!"); else System.out.println(name + "尚未超神!"); } } public static void main(String[] args) { Hero garen = new Hero(); garen.name = "盖伦"; // 实例化内部类 // BattleScore对象只有在一个英雄对象存在的时候才有意义 // 所以其实例化必须建立在一个外部类对象的基础之上 BattleScore score = garen.new BattleScore(); score.kill = 9; score.legendary(); } }
package charactor; public abstract class Hero { String name; //姓名 float hp; //血量 float armor; //护甲 int moveSpeed; //移动速度 public abstract void attack(); public static void main(String[] args) { ADHero adh=new ADHero(); //通过打印adh,可以看到adh这个对象属于ADHero类 adh.attack(); System.out.println(adh); //匿名类,实例化一个抽象类 Hero h = new Hero() { //当场实现抽象方法 @Override public void attack() { System.out.println("新的进攻手段"); } }; h.attack(); //通过打印h,可以看到h这个对象属于Hero$1这么一个系统自动分配的类名 System.out.println(h); } }