类和对象

一-

类:class 

比如Hero是一个类

对象:new Hero()即创建了一个新对象,指向同一个类Hero

Hero h = new Hero();也就是将h指向这个新创建的对象

//创建一个对象
        new Hero();
         
        //使用一个引用来指向这个对象
        Hero h = new Hero();
操作过程是这样的,先创建对象,然后再指向于h

不同时间点写new Hero(),指向的对象并不相同

那么同一时间点的创建的那个对象是固定的,这样我创建一个后,拿无数个去指向都是一样的

比如

Hero h1 = new Hero();
        Hero h2 = h1;  //h2指向h1所指向的对象
        Hero h3 = h1;
        Hero h4 = h1;
        Hero h5 = h4;
         
        //h1,h2,h3,h4,h5 五个引用,都指向同一个对象

         


Hero garen =  new Hero();
           garen =  new Hero();

但这样,garen指向的对象就从对象一变成了对象二

Hero h1 =  new Hero();
           Hero h2 =  new Hero();
           Hero h3;
           Hero h4;
           h3 = h1;
           h4 = h3;

上列h1,3,4是一样的,都指向对象一

二-

继承

一个class的类会具有多种属性,比如Hero有护甲,生命等

当我们要创建一个野怪时也会有这些属性,还会额外多加一个属性(虽然貌似没有)

这时就可以使用继承extends

public class Weapon extends Item{
    int damage; //攻击力//通过继承也有name于price
     
    public static void main(String[] args) {
        Weapon infinityEdge = new Weapon();
        infinityEdge.damage = 65//damage属性在类Weapon中新设计的
         
        infinityEdge.name = "无尽之刃";//name属性,是从Item中继承来的,就不需要重复设计了
        infinityEdge.price = 3600;
         
    }
     
}

三-方法重载

一个方法(函数)可以有多个参数,但方法名相同

当调用方法时自动根据提供的实际参数选择对应的方法

public class While阶乘 extends Hero {
public void attack() {
        System.out.println(name + " 进行了一次攻击 ,但是不确定打中谁了");
    }
 
    public void attack(Hero h1) {
        System.out.println(name + "对" + h1.name + "进行了一次攻击 ");
    }
 
    public void attack(Hero h1, Hero h2) {
        System.out.println(name + "同时对" + h1.name + "和" + h2.name + "进行了攻击 ");
    }
 
    public static void main(String[] args) {
        While阶乘 bh = new While阶乘();
        bh.name = "赏金猎人";
 
        Hero h1 = new Hero();
        h1.name = "盖伦";
        Hero h2 = new Hero();
        h2.name = "提莫";
 
        bh.attack(h1);
        bh.attack(h1, h2);
    }

}

但当我们这样一次增加一个太麻烦了,遵循规律可这样写一个统一性的

public class While阶乘 extends Hero {

public void attack() {

        System.out.println(name + " 进行了一次攻击 ,但是不确定打中谁了");

    }

 

    public void attack(Hero... heros) {

    System.out.print(name+"攻击了");

        for (int i = 0; i < heros.length; i++) {

            System.out.print(heros[i].name);

 

        }

        System.out.println("\n");

    }

 

    public static void main(String[] args) {

        While阶乘 bh = new While阶乘();

        bh.name = "赏金猎人";

 

        Hero h1 = new Hero();

        h1.name = "盖伦";

        Hero h2 = new Hero(),h3 = new Hero();

        h2.name = "提莫";

        h3.name = "石头";

 

        bh.attack(h1);

        bh.attack(h1, h2,h3);

    }

}

Hero...heros 

heros表示这样一个名字的数组存储Hero这个类的对象

注意上述代码中print的使用,这样就不会换行

四-

构造方法

构造方法在创建类时给出

比如一个Hero有了生命攻击等各种属性

数值为多少呢?除了在main中用Hero.hp = 100得到可不可以在创建new Hero()时直接得到呢?

这时就可以构造方法

前面的都是默认使用的无参系统自带,代码中可以略过

构造方法是用于创建时初始化对象属性,与名字和类名字一样


public class Hero {
       
    String name; //姓名
       
    float hp; //血量
       
    float armor; //护甲
       
    int moveSpeed; //移动速度
       
    //带一个参数的构造方法
    public Hero(String heroname){ 
        name = heroname;
    }
     
    //带两个参数的构造方法
    public Hero(String heroname,float herohp){ 
        name = heroname;
        hp = herohp;
    }
       
    public static void main(String[] args) {
        Hero garen =  new Hero("盖伦"); 
        Hero teemo =  new Hero("提莫",383);
    }
     
}
当然也可以使用方法的重载

四-

方法中的参数可以是一个变量也可以是一个类

public void attack(Hero hero, int damage) {
        hero.hp = hero.hp - damage;
    }
 
    public static void main(String[] args) {
        Hero teemo = new Hero("提莫"383);
        Hero garen = new Hero("盖伦"616);
        garen.attack(teemo, 100);

阴影两行,通过garen调用方法传递teemo作为实参

另外,方法中的形参改变不会传递出去

因为他是作为局部临时变量的存在

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 = new Hero("提莫",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); 输出多少? 怎么理解?
         
    }
      
}

比如这里,仍然为-17,teemo调用revive函数,将teemo作为实参传递进去作为形参 Hero h类的引用

在方法里使实参teemo指向一个新的对象,在这个方法里拥有了新的生命与名字,即使名字是相同的

但是对于外部变量(对象)Teemo,他的属性并没有因此而改变

在C语言中,要想使传递的参数改变,要么使用指针,要么使用return,不能直接改变,java也类似


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值