今天是周五,明天就是周末啦,爽哦。这一周把JAVA的基础算是学完了,搞明白了很多之前不懂得东西,嘿嘿嘿,怪我之前不好好学习哦。就这样,不多写了,洗个脸睡觉去,明天恰火锅。

/**
 * 在方法中,使参数引用指向一个新的对象
 *
 * 外面的引用是指向原来的对象?还是新的对象?
 */
public class Hero {

    String name; //姓名

    float hp; //血量

    float armor; //护甲

    int moveSpeed; //移动速度

    public Hero(){

    }

    public Hero(String name,float hp){
        this.name = name;
        this.hp = hp;
    }

    //复活
    public void revive(Hero h){
        //此时方法内的h指向Hero对象,开辟了一块新的内存,并不是teemo所指向的内存
        h = new Hero("提莫",383);
        //h.hp = 383; 这样的话不重新引用对象,对应的方法内直接修改传入参数的属性或者调用方法,参数就传过去了
    }

    public static void main(String[] args) {
        Hero teemo =  new Hero("提莫",383);

        //受到400伤害,挂了
        teemo.hp = teemo.hp - 400;
        //调用方法后内存指向发生变化了
        teemo.revive(teemo);

        System.out.println(teemo.hp);

    }
}
package charactor;

/**
 * 对象属性的初始化有三种方式
 * 故意把初始化块,放在构造方法下面,问题:
 *
 * 这三种方式,谁先执行?谁后执行?
 * (静态变量、静态初始化块)>(变量、初始化块)>构造器
 * 最后执行的是构造器初始化
 */
public class Hero {
    public String name = "声明初始化";

    public Hero(){
        name = "构造器初始化";
    }
    {
        name = "初始化块";
    }

    public static void main(String[] args) {
        Hero hero = new Hero();
        System.out.println(hero.name);
    }
}

饿汉式

package charactor;

/**
 *   1、单例类只能有一个实例。
 *   2、单例类必须自己创建自己的唯一实例。
 *   3、单例类必须给所有其他对象提供这一实例。
 */
public class GiantDragon {
    //私有化构造方法使得该类无法在外部通过new 进行实例化
    private GiantDragon(){

    }
    //饿汉式单例类.在类初始化时,已经自行实例化
    //准备一个类属性,指向一个实例化对象。 因为是类属性,所以只有一个
    public static GiantDragon instance = new GiantDragon();

    //public static 方法,提供给调用者获取定义的对象
    public static GiantDragon getInstance(){
        return instance;
    }

}

package charactor;

public class TestGiantDragon {
    public static void main(String[] args) {
        //通过new实例化会报错
        // GiantDragon g = new GiantDragon();

        //只能通过getInstance得到对象
        GiantDragon dragon1 = GiantDragon.getInstance();
        GiantDragon dragon2 = GiantDragon.getInstance();
        GiantDragon dragon3 = GiantDragon.getInstance();

        System.out.println(dragon1 == dragon2);
        System.out.println(dragon2 == dragon3);

    }
}

懒汉式

package charactor;

/**
 *   1、单例类只能有一个实例。
 *   2、单例类必须自己创建自己的唯一实例。
 *   3、单例类必须给所有其他对象提供这一实例。
 */
public class GiantDragon {
    //私有化构造方法使得该类无法在外部通过new 进行实例化
    private GiantDragon(){
    }

    //准备一个类属性,用于指向一个实例化对象,但是暂时指向null
    private static GiantDragon instance;

    //public static 方法,返回实例对象
    public static GiantDragon getInstance(){
        //第一次访问的时候,发现instance没有指向任何对象,这时实例化一个对象
        if(null==instance){
            instance = new GiantDragon();
        }
        //返回 instance指向的对象
        return instance;
    }

}

package charactor;

public class TestGiantDragon {
    public static void main(String[] args) {
        //通过new实例化会报错
        // GiantDragon g = new GiantDragon();

        //只能通过getInstance得到对象
        GiantDragon dragon1 = GiantDragon.getInstance();
        GiantDragon dragon2 = GiantDragon.getInstance();
        GiantDragon dragon3 = GiantDragon.getInstance();

        System.out.println(dragon1 == dragon2);
        System.out.println(dragon2 == dragon3);

    }
}

单例模式三元素

  1. 构造方法私有化
  2. 静态属性指向实例
  3. public static的 getInstance方法,返回第二步的静态属性
{
    public static void main(String[] args) {
        for (HeroType heroType : HeroType.values()){
            switch (heroType){
                case ASSASSIN:
                    System.out.println(heroType+" 刺客");
                    break;
                case ASSIST:
                    System.out.println(heroType+" 辅助");
                    break;
                case FARMING:
                    System.out.println("打野");
                    break;
                case PUSH:
                    System.out.println("推进");
                    break;
                case RANGED:
                    System.out.println("远程");
                    break;
                case TANK:
                    System.out.println("坦克");
                    break;
                case WARRIOR:
                    System.out.println("近战");
                    break;
                case WIZARD:
                    System.out.println("法师");
                    break;
            }
        }
    }
}

子类转父类(向上转型)
所谓的转型,是指当引用类型和对象类型不一致的时候,才需要进行类型转换
类型转换有时候会成功,有时候会失败(参考基本类型的类型转换)

到底能否转换成功? 教大家一个很简单的判别办法
把右边的当做左边来用,看说得通不

Hero h = new Hero();
ADHero ad = new ADHero();
h = ad;

右边ad引用所指向的对象的类型是 物理攻击英雄
左边h引用的类型是 普通英雄
把物理攻击英雄 当做 普通英雄,说不说得通? 说得通,就可以转

所有的子类转换为父类,都是说得通的。
苹果手机 继承了 手机,把苹果手机当做普通手机使用
怡宝纯净水 继承了 饮品, 把怡宝纯净水 当做饮品来使用

父类转子类(向下转型)
父类转子类,有的时候行,有的时候不行,所以必须进行强制转换。
强制转换的意思就是 转换有风险,风险自担。

对象的转型spring要用到许多,此时暂时不接触。等需要了回头再来看。目前先理解基本的概念,实例等日后再练习。