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 "我的宠物是一只鹰!";
}
}
总结:
抽象类|接口作为方法参数,返回值类型,成员变量==>扩展性强,可以传递任意的子类|实现类对象
本文通过实例展示了在Java中如何使用类(如IDCard)和抽象类(如Animal)作为成员变量,以及接口(如Fly)作为成员变量的用法。这些做法增强了代码的扩展性和多态性,允许使用不同子类或实现类的对象为成员变量赋值。例如,Person类中包含了IDCard和Animal成员,可以根据需求赋值为不同的身份证和宠物对象,或者使用不同的飞行能力实现类。

被折叠的 条评论
为什么被折叠?



