引用类型的使用(2)

本文通过实例展示了在Java中如何使用类(如IDCard)和抽象类(如Animal)作为成员变量,以及接口(如Fly)作为成员变量的用法。这些做法增强了代码的扩展性和多态性,允许使用不同子类或实现类的对象为成员变量赋值。例如,Person类中包含了IDCard和Animal成员,可以根据需求赋值为不同的身份证和宠物对象,或者使用不同的飞行能力实现类。

4.类名作为成员变量
我们每个人(Person)都有一个身份证(IDCard) , 为了表示这种关系 , 就需要在Person中定义一个IDCard的成员变量。定义Person类时,代码如下:

class Person {
    String name;//姓名
    int age;//年龄
    IDCard idCard;//身份证信息
}

​ 使用String 类型表示姓名 , int 类型表示年龄。其实,String本身就是引用类型,我们往往忽略了它是引用类型。如果我们继续丰富这个类的定义,给Person 增加身份证号 , 身份证签发机关等属性,我们将如何编写呢?这时候就需要编写一个IDCard类了

定义IDCard(身份证)类,添加身份证号(id) , 签发地(authority)等属性:

package com.itheima.demo06Test;

/*
    定义一个描述身份证的类
 */
public class IDCard {
    //身份证号
    private String idNum;
    //身份证签发地
    private String authority;

    public IDCard() {
    }

    public IDCard(String idNum, String authority) {
        this.idNum = idNum;
        this.authority = authority;
    }

    @Override
    public String toString() {
        return "IDCard{" +
                "idNum='" + idNum + '\'' +
                ", authority='" + authority + '\'' +
                '}';
    }

    public String getIdNum() {
        return idNum;
    }

    public void setIdNum(String idNum) {
        this.idNum = idNum;
    }

    public String getAuthority() {
        return authority;
    }

    public void setAuthority(String authority) {
        this.authority = authority;
    }
}

修改Person类:

package com.itheima.demo06Test;

public class Person {
    //姓名
    private String name;
    //年龄
    private int age;
    //身份证信息(使用类名作为成员变量)
    private IDCard iDCard;

    public Person() {
    }

    public Person(String name, int age, IDCard iDCard) {
        this.name = name;
        this.age = age;
        this.iDCard = iDCard;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", iDCard=" + iDCard +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public IDCard getiDCard() {
        return iDCard;
    }

    public void setiDCard(IDCard iDCard) {
        this.iDCard = iDCard;
    }
}

测试类:

package com.itheima.demo06Test;

public class Demo01 {
    public static void main(String[] args) {
        //使用Person的空参数构造方法创建对象
        Person p = new Person();
        p.setName("胡歌");
        p.setAge(18);
        IDCard idCard = new IDCard("110110200404041111","北京市公安局");
        //给引用数据类型的成员变量赋值,创建对象赋值
        p.setiDCard(idCard);
        System.out.println(p);//Person{name='胡歌', age=18, iDCard=IDCard{idNum='110110200404041111', authority='北京市公安局'}}

        //使用Person的满参数构造方法创建对象
        Person p2 = new Person("刘亦菲",
                18,new IDCard("120120200404048888","上海市公安局"));
        System.out.println(p2);//Person{name='刘亦菲', age=18, iDCard=IDCard{idNum='120120200404048888', authority='上海市公安局'}}
    }
}

类作为成员变量时,对它进行赋值的操作,实际上,是赋给它该类的一个对象。同理 , 接口也是如此.

5.抽象类作为成员变量

  • 抽象类作为成员变量——为此成员变量赋值时,可以是任何它的子类对象
package com.itheima.demo07Test;

public class Person {
    private String name;
    private int age;
    /*
        定义一个成员变量,类型使用Animal
        多态:可以创建Animal任意的子类对象,给成员变量赋值
            private Animal animal = new Cat();
            private Animal animal = new Dog();
     */
    private Animal animal;

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", animal=" + animal +
                '}';
    }

    public Person() {
    }

    public Person(String name, int age, Animal animal) {
        this.name = name;
        this.age = age;
        this.animal = animal;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Animal getAnimal() {
        return animal;
    }

    public void setAnimal(Animal animal) {
        this.animal = animal;
    }
}
package com.itheima.demo07Test;

public class Demo01 {
    public static void main(String[] args) {
        //创建Person对象
        Person p1 = new Person();
        p1.setName("蔡徐坤");
        p1.setAge(20);
        p1.setAnimal(new Cat());
        System.out.println(p1);//Person{name='蔡徐坤', age=20, animal=我的宠物是一只猫!}

        Person p2 = new Person("杨洋",20,new Dog());
        System.out.println(p2);//Person{name='杨洋', age=20, animal=我的宠物是一只狗!}
    }
}
package com.itheima.demo07Test;

public abstract class Animal {
}
package com.itheima.demo07Test;

public class Cat extends Animal {
    @Override
    public String toString() {
        return "我的宠物是一种猫!";
    }
}
package com.itheima.demo07Test;

public class Dog extends Animal {
    @Override
    public String toString() {
        return "我的宠物是一只狗!";
    }
}

6.接口作为成员变量

  • 接口类型作为成员变量——可以给接口变量赋值不同的实现类对象
package com.itheima.demo08Test;

public class Person {
    private String name;
    private int age;
    /*
        使用接口作为成员变量
        多态:可以创建Fly接口任意的实现类对象,给成员变量赋值
        private Fly fly = new Niao();
        private Fly fly = new Ying()
     */
    private Fly fly;

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", fly=" + fly +
                '}';
    }

    public Person() {
    }

    public Person(String name, int age, Fly fly) {
        this.name = name;
        this.age = age;
        this.fly = fly;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Fly getFly() {
        return fly;
    }

    public void setFly(Fly fly) {
        this.fly = fly;
    }
}
package com.itheima.demo08Test;

public class Demo01 {
    public static void main(String[] args) {
        //创建Person对象
        Person p1 = new Person();
        p1.setName("隔壁老王");
        p1.setAge(20);
        p1.setFly(new Niao());
        System.out.println(p1);//Person{name='隔壁老王', age=20, fly=我的宠物是一只小麻雀!}

        Person p2 =  new Person("楼上老宋",30,new Ying());
        System.out.println(p2);//Person{name='楼上老宋', age=30, fly=我的宠物是一只鹰!}
    }
}
package com.itheima.demo08Test;

public interface Fly {

}
package com.itheima.demo08Test;

public class MaQue implements Fly {
    @Override
    public String toString() {
        return "我的宠物是一只小麻雀!";
    }
}
package com.itheima.demo08Test;

public class Ying implements Fly {
    @Override
    public String toString() {
        return "我的宠物是一只鹰!";
    }
}

总结:

抽象类|接口作为方法参数,返回值类型,成员变量==>扩展性强,可以传递任意的子类|实现类对象

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旭子在努力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值