学习笔记--区分Java中类与对象

区分Java中类与对象

你能接受 String 吗?

如果能,以下内容可进行类比

  • 编写 User
public class User{

    // 用户编号
    // int 是一种基础数据类型
    // id 是一个实例变量
    int id;

    // 用户名
    // String 是一种引用数据类型
    // name 是一个实例变量
    // name 是一个引用
    String name;

    // 家庭住址
    // Address 是一种引用数据类型
    // addr 是一种实例变量
    // addr 是一个实例变量
    Address addr;
}
  • 编写 Address
public class Address{

    // 以下也都是是实例变量

    // 城市
    String city;

    // 街道
    String street;

    // 邮编
    String zipcode;
}
  • 测试类
public class OOTest02{

    public static void main(String[] args){

        // 创建一个User对象,或者说是User的实例
        // 数据类型 变量名 = new 类();
        // u 是一个局部变量
        // u 保存的内存地址指向堆内存的User对象,或者说是User的实例
        User u = new User();

        // 输出User对象中的实例变量的值
        System.out.println(u.id);   // 0
        System.out.println(u.name); // null
        System.out.println(u.addr); // null


        // 修改User对象内部实例变量的值

        u.no = 110;
        // "jack" 是一个Java对象,u.name 保存的内存地址指向堆内存的String对象
        u.name = "jack";
        //u.addr 保存的内存地址指向堆内存的Address对象
        u.addr = new Address();


        // 目前在main方法当中只能看到一个引用 "u"
        // 一切都是只能通过u进行访问
        System.out.println(u.name + "居住在哪个城市:" + u.addr.city);
        System.out.println(u.name + "居住在哪个街道:" + u.addr.street);
        System.out.println(u.name + "的邮编:" + u.addr.zipcode);

        // 修改类似上面

        u.addr.city = "成都";
        u.addr.street = "XXX";



    }
}
  • 另一个测试类

    强调:引用时,变量中保存的只是【实例/对象】的内存地址

public class OOtest03{

    // u 是引用
    // u 是局部变量
    User u = new User();

    // 在 OOTest 中编写的是
    // u.addr = new Address()

    // a 是引用
    // a 是局部变量
    Address a = new Address();  // a 保存的内存地址指向堆内存的Address对象
    u.addr = a; // 将 a 中保存的 内存地址 赋值给 u.addr


    // 注意:下面两个 System.out.println(u.addr.city);

    System.out.println(u.addr.city);    // null

    a.city = "成都";

    System.out.println(u.addr.city);
}

注意:实例变量不能直接通过类名访问,需要通过实例或者说对象进行访问

类和类

  • 先写两个类
// 丈夫类
public class Husband{

    // 名字
    String name;

    // 丈夫对象当中含有妻子引用
    Wife w;
}
// 妻子类
public class Wife{

    // 名字
    String name;

    // 妻子对象当中含有丈夫引用
    Huband h;
}
  • 测试类
public class OOTest04{

    public static void main(String[] args){

        // 创建一个丈夫对象
        Husband boy = new Husband();
        boy.name = "jock";

        // 创建一个妻子对象
        Wife girl = new Wife();
        girl.name = "rose";

        // 建立两个对象的关系【关联关系】:A has a B; A中含有B的引用
        boy.w = girl;
        girl.h = boy;

        //得到 boy 都妻子名称
        //区分以下两句

        System.out.println(boy.name + "妻子的名称:" + girl.name);
        // girl.name 是 girl 的名称,不符合题
        System.out.println(boy.name + "妻子的名称:" + boy.w.name);
        // boy.w.name 是 boy 妻子的名称,符合题

        // 如果没有建立两个对象的关系上面两句是 不同的

    }
}

空引用异常


// 工人类
public class Worker{

    // 工号
    int id;
}

测试程序

public class OOTest05{

    public static void main(String[] args){

        Worker c = new Wocker();
        System.out.println(c.id);   // 0    没有赋值,所以是默认值

        c = null;

        // 以下程序可以编译通过,因为符合语法
        // 运行会出现空指针异常
        // 空引用访问  “实例” 相关的数据  一定会出现空指针异常
        // java.lang.NullPointerException
        System.out.println(c.id);

    }
}



上一篇:IDAPython使用


下一篇:《TCP/IP网络编程》第21章