今天周一,昨天周日啥也没干睡了一天的觉,嘿嘿,就不写了。今天没什么特别的,学习了一下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);
}
}
京公网安备 11010502036488号