区分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); }
}

Java面向对象



学习笔记--区分Java中类与对象的更多相关文章

  1. 【学习笔记】Java中生成对象的5中方法

    概述:本文介绍以下java五种创建对象的方式: 1.用new语句创建对象,这是最常用的创建对象的方式. 2.使用Class类的newInstance方法 3.运用反射手段,调用java.lang.re ...

  2. 学习笔记之Java程序设计实用教程

    Java程序设计实用教程 by 朱战立 & 沈伟 学习笔记之JAVA多线程(http://www.cnblogs.com/pegasus923/p/3995855.html) 国庆休假前学习了 ...

  3. 学习笔记:Javascript 变量 包装对象

    学习笔记:Javascript 变量 包装对象 如下代码,可以输出字符的长度. var str = "Tony"; str.length; 这时再试试以下代码,返回是 undefi ...

  4. Java中类,对象,方法的内存分配

    Java中类,对象,方法的内存分配 以下针对引用数据类型: 在内存中,类是静态的概念,它存在于内存中的CodeSegment中. 当我们使用new关键字生成对象时,JVM根据类的代码,去堆内存中开辟一 ...

  5. Java 学习笔记 ------第四章 认识对象

    本章学习目标: 区分基本类型与类类型 了解对象与参考的关系 从打包器认识对象 以对象观点看待数组 认识字符串的特性 一."=" 和 "==" 当=用于基本类型时 ...

  6. JavaScript学习笔记(十四)——对象

    在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...

  7. 学习笔记:java线程安全

    首先得明白什么是线程安全: 线程安全是编程中的术语,指某个函数 (计算机科学).函数库在多线程环境中被调用时,能够正确地处理各个线程的局部变量,使程序功能正确完成. 这是维基百科里的资料,看完后还不是 ...

  8. JavaScript学习笔记(十五)——对象之Date,RegExp

    在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...

  9. Redis学习笔记一:数据结构与对象

    1. String(SDS) Redis使用自定义的一种字符串结构SDS来作为字符串的表示. 127.0.0.1:6379> set name liushijie OK 在如上操作中,name( ...

  10. (转)《深入理解java虚拟机》学习笔记2——Java内存溢出实例

    通过简单的小例子程序,演示java虚拟机各部分内存溢出情况: (1).java堆溢出: Java堆用于存储实例对象,只要不断创建对象,并且保证GC Roots到对象之间有引用的可达,避免垃圾收集器回收 ...

随机推荐

  1. IDEA使用——快捷键修改

    刚转入IDEA的小伙伴都知道,如果将IDEA的快捷键设置为Eclipse模式也会有相当多常用快捷键不一样,下面链接的配置文件是博主自己IDEA配置的导出文件.我将Eclipse常用的快捷键都做了同步, ...

  2. Android OpenMAX(七)OMX Service

    上一篇文章我们分析了Android使用OMXStore来管理平台上的软件和硬件编解码组件,这一篇我们再向上一层了解应用层是如何获取调用OMXStore管理组件的.本篇文章代码参考自: framewor ...

  3. Android 13 - Media框架(7)- NuPlayer::Source

    关注公众号免费阅读全文,进入音视频开发技术分享群! Source 在播放器中起着拉流(Streaming)和解复用(demux)的作用,Source 设计的好坏直接影响到播放器的基础功能,我们这一节将 ...

  4. 将.net core api 部署成windows服务

    将.net core api 部署成windows服务   参考 https://blog.csdn.net/qq_38762313/article/details/103311944 将NSSM解压 ...

  5. Qt-FFmpeg开发-打开本地摄像头(6)

    音视频/FFmpeg #Qt Qt-FFmpeg开发-打开本地摄像头[软解码+ OpenGL显示YUV] 目录 音视频/FFmpeg #Qt Qt-FFmpeg开发-打开本地摄像头[软解码+ Open ...

  6. CH57x/CH58x/CH59x获取从机广播信息

    有时需要通过主机设备(MCU非手机)获取从设备的广播信息例如广播包,MAC地址,扫描应答包等 以下的程序片段及功能实现是在WCH的CH59X的observer例程上实现的: 1.获取广播包 所有的函数 ...

  7. kettle从入门到精通 第三十三课 再谈 kettle 表输出 分区/分片

    1.之前第九章有讲过kettle 表输出步骤,里面有简单的提到过表输出步骤里面的表分区设置,这里详细介绍下. 表分区数据:选择此选项可根据"分区"字段中指定的日期字段的值将数据拆分 ...

  8. C#.NET AES CBC 加密

    重点: 1. KEY 和 IV 转 byte[] 时的编码. 2.要加密的字符串转 byte[] 时的编码. 3.AES 的PADDING,MODE. 4.加密后的byte[] 转字符串时的编码. 先 ...

  9. 590. N 叉树的后序遍历 | Javascript 递归实现

    题目 题目链接:590. N 叉树的后序遍历 解题思路 递归后续遍历,正常的思路 然后有一个要注意的地方就是如果js定义了全局变量来存储结果,每次调用函数之前一定要记得清空,否则答案会带上之前的结果. ...

  10. Python数据类型(数字,字符串,[列表],(元组),{字典:字典值},{列表,列表2})

    Python数据类型(数字,字符串,[列表],(元组),{字典:字典值},{列表,列表2}) # 1. # Python3 数字(Number) # Python 数字数据类型用于存储数值. # 数据 ...