学习笔记--区分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);
}
}
Java面向对象
- 初识Java面向对象
- 区分Java中类与对象
- 面向对象的封装性
- Java构造方法
- Java中this关键字
- Java中static关键字
- Java面向对象的继承
- Java中final关键字
- package和import
学习笔记--区分Java中类与对象的更多相关文章
- 【学习笔记】Java中生成对象的5中方法
概述:本文介绍以下java五种创建对象的方式: 1.用new语句创建对象,这是最常用的创建对象的方式. 2.使用Class类的newInstance方法 3.运用反射手段,调用java.lang.re ...
- 学习笔记之Java程序设计实用教程
Java程序设计实用教程 by 朱战立 & 沈伟 学习笔记之JAVA多线程(http://www.cnblogs.com/pegasus923/p/3995855.html) 国庆休假前学习了 ...
- 学习笔记:Javascript 变量 包装对象
学习笔记:Javascript 变量 包装对象 如下代码,可以输出字符的长度. var str = "Tony"; str.length; 这时再试试以下代码,返回是 undefi ...
- Java中类,对象,方法的内存分配
Java中类,对象,方法的内存分配 以下针对引用数据类型: 在内存中,类是静态的概念,它存在于内存中的CodeSegment中. 当我们使用new关键字生成对象时,JVM根据类的代码,去堆内存中开辟一 ...
- Java 学习笔记 ------第四章 认识对象
本章学习目标: 区分基本类型与类类型 了解对象与参考的关系 从打包器认识对象 以对象观点看待数组 认识字符串的特性 一."=" 和 "==" 当=用于基本类型时 ...
- JavaScript学习笔记(十四)——对象
在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...
- 学习笔记:java线程安全
首先得明白什么是线程安全: 线程安全是编程中的术语,指某个函数 (计算机科学).函数库在多线程环境中被调用时,能够正确地处理各个线程的局部变量,使程序功能正确完成. 这是维基百科里的资料,看完后还不是 ...
- JavaScript学习笔记(十五)——对象之Date,RegExp
在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...
- Redis学习笔记一:数据结构与对象
1. String(SDS) Redis使用自定义的一种字符串结构SDS来作为字符串的表示. 127.0.0.1:6379> set name liushijie OK 在如上操作中,name( ...
- (转)《深入理解java虚拟机》学习笔记2——Java内存溢出实例
通过简单的小例子程序,演示java虚拟机各部分内存溢出情况: (1).java堆溢出: Java堆用于存储实例对象,只要不断创建对象,并且保证GC Roots到对象之间有引用的可达,避免垃圾收集器回收 ...
随机推荐
- php的下载与安装
一,进入到php的官方网站 https://www.php.net/ ,进入到下载页面: 选择 PHP 7.2.30 的Windows版本 具体的下载页面版本区分: 下载后,得到如下压缩包到如 ...
- 【C# wpf】个人网盘练习项目总结
采用 .net frameowrok 4.5.2 未写持久层代码,不可保存运行时的数据状态.分服务端,客户端,采用tcp通讯,使用了supersocket组件.服务端用winform ,客户端用wpf ...
- QGIS开发笔记(三):Windows安装版二次开发环境搭建(下):将QGis融入QtDemo,添加QGis并加载tif遥感图的Demo
前言 使用QGis的目的是进行二次开发,或者说是融入我们的应用(无人车.无人船.无人机),本片描述搭建QGis二次基础开发环境,由于实在是太长了,进行了分篇: 上半部分:主要是安装好后,使用QtC ...
- itest work 开源接口测试&敏捷测试管理平台 9.5.0 GA_u1,优化及修复关键 BUG
(一)itest work 简介 itest work (爱测试) 一站式工作站让测试变得简单.敏捷,"好用.好看,好敏捷" ,是itest wrok 追求的目标.itest w ...
- 使用swiper完成轮播图
swiper:https://www.swiper.com.cn/usage/index.html 安装swiper cnpm i -S swiper 在功能组件中定义Swiper组件并设置好插槽 & ...
- SMB3.0多通道叠加双网卡提速
SMB3.0多通道叠加双网卡提速 (双网卡.多网卡,NAS,局域网共享速度) WIN8及以上是默认开启的.(WIN10.WIN11 默认开启) 只需要同规格的网卡,比如你一张是1Gbps的,另一张网卡 ...
- 修改 WIN10 WIN11 操作系统启动菜单名称
修改 WIN10 WIN11 操作系统启动菜单名称 一块硬盘装双系统后,自动更新的启动菜单名称可能无法区分WIN10.WIN11,需要通过"卷2"."卷3"字样 ...
- springmvc组件说明
DispatcherServlet:前端控制器,也称为中央控制器,它是整个请求响应的控制中心,组件的调用由它统一调度. HandlerMapping:处理器映射器,它根据用户访问的 URL 映射到对应 ...
- mongodb QuickStart Demo
import com.mongodb.client.MongoClient; import com.mongodb.client.MongoClients; import com.mongodb.cl ...
- 哎,被这个叫做at least once的玩意坑麻了。
你好呀,我是歪歪. 前几天遇到一个生产问题,同一个数据在数据库里面被插入了两次,导致后续处理出现了一些问题. 当时我们首先检讨了自己,没有做好幂等校验.甚至还发现了一个低级错误:对应的表,针对订单号, ...