菜鸡的Java笔记 第十 - java 类与对象
(局部变量需要初始化,全局变量不初始化系统也会帮忙初始化而局部变量系统不会帮忙初始化)
>>>
2.1 类与对象基本概念
在现实生活之中,类指的就是具备某一共性的群体集合。而对象是一种个性的描述。如果要想进行更简单的理解。对象包含的是具体的信息内容,例如:曾公子,李老师,JAVA开发。我需要招聘一个秘书,而秘书是一个标准
对象所能够具备的操作行为实际上是由类来定义的,也就是说要想使用类那么必须有一个具体的描述对象,而对象的操作完全由类来定义。对象是可以明确使用的,而类是不能够直接使用的。
真实存在的可以使用的就是对象,而定义概念的就是类。类是对象的操作标准,而对象是类的操作实例,类中没有定义的操作,对象一定不能够使用
2.2·类与对象的定义(重点)
在开发之中一定要记住,先有类,再有对象。在JAVA中如果要定义类,则可以使用 class 关键字来描述,而在类中的组成主要有两种:属性(变量),方法(此方法不是在主类中定义,不由主方法直接调用,所以不加 static)。
范例:定义一个类
class Person{ // 现在定义了一个类
// 定义类中的两个属性
String name; // 表示人的姓名
int age; // 表示人的年纪
public void tell(){
System.out.println('姓名:' + name + ',年纪:' + age);
}
}
public class TestDemo{
public static void main(Srting args[]){ }
}
类本身不能够直接使用,所有的类必须通过对象才可以使用。由于类属于引用数据类型(内存关系),所以对象的定义语法现在有两种:
声明并实例化对象:类名称 对象名称 = new(妞) 类名称();
分步进行:
声明对象:类名称 对象名称 = null;
实例化对象:对象名称 = new 类名称()。
引用数据类型在使用前必须开辟空间 ,而基本数据类型可以直接赋值,那么开辟空间的关键子就是 new 。
那么一旦有了对象之后,就可以利用对象来实现类中属性和方法的调用,使用原则:
调用属性:实例化对象.属性名称;
调用方法;实例化对象.方法()。
范例:定义对象并使用
class Person{ // 现在定义了一个类
// 定义类中的两个属性
String name; // 表示人的姓名
int age; // 表示人的年纪
public void tell(){
System.out.println('姓名:' + name + ',年纪:' + age);
}
}
public class TestDemo{ // 另一个类
public static void main(Srting args[]){
Person per = new Person(); // 声明并实例化对象
per.name = '张三'; // 对象.属性= 内容
per.age = 30; //
per.tell(); // 通过对象调用类中的方法
}
}
// 返回姓名:张三,年纪:30
整个的代码操作就是根据一个类产生处对象,而后设置对象的属性内容,并且打印信息。
如果此时没有设置属性内容呢?
class Person{ // 现在定义了一个类
// 定义类中的两个属性
String name; // 表示人的姓名
int age; // 表示人的年纪
public void tell(){
System.out.println('姓名:' + name + ',年纪:' + age);
}
}
public class TestDemo{ // 另一个类
public static void main(Srting args[]){
Person per = new Person(); // 声明并实例化对象
// per.name = '张三'; // 对象.属性= 内容
// per.age = 30; //
per.tell(); // 通过对象调用类中的方法
}
}
// 返回姓名:null,年纪:0
没有设置属性内容时出现的就是默认值,String 是引用类型,所以默认值是 null,而 int 是基本数据类型,默认值为0.
2.3对象产生或引用的初步分析
类本身属于引用数据类型,所以对于引用数据类型就必须为其进行内存分析,分析之前,首先给出两块内存空间的定义:
堆内存空间(Heap):保存的是对象中具体属性信息(真正的对象)
栈内存空间(Stack):是保存 堆内存的地址数值,所以现在可以简化一点,假设保存在栈内存中的是对象名称。一个栈内存只能够保存一块对应的堆内存空间地址。
所以现在按照以上的分析,就可以的出如下内存关系图。
范例:分析代码(有个 new 就是开辟空间 )
引用数据使用与C语言是完全一样的,所以这个是JAVA的灵魂存在。
实际上对象的产生格式本次只使用了一种,还有另外一种分步的方式完成。
class Person{ // 现在定义了一个类
// 定义类中的两个属性
String name; // 表示人的姓名
int age; // 表示人的年纪
public void tell(){
System.out.println('姓名:' + name + ',年纪:' + age);
}
}
public class TestDemo{ // 另一个类
public static void main(Srting args[]){
Person per = null; // 声明对象
per = new Person(); //实例化对象
per.name = '张三'; // 对象.属性= 内容
per.age = 30;
per.tell(); // 通过对象调用类中的方法
}
}
注意:关于引用数据类型操作存在的重要问题。
理论上当对象开辟堆内存(实例化对象)那么属性才会进行内存的分配,那么如果说使用了没有实例化的对象呢?
class Person{ // 现在定义了一个类
// 定义类中的两个属性
String name; // 表示人的姓名
int age; // 表示人的年纪
public void tell(){
System.out.println('姓名:' + name + ',年纪:' + age);
}
}
public class TestDemo{ // 另一个类
public static void main(Srting args[]){
Person per = null; // 声明对象
// per = new Person(); //实例化对象
per.name = '张三'; // 对象.属性= 内容
per.age = 30;
per.tell(); // 通过对象调用类中的方法
}
}
相当于此时只是声明了对象,但是并没有进行对象的实例化操作,这个时候程序编译没有任何问题,但是程序执行。
那么此时返回的是“NullPointerException”异常,翻译就是空指向异常,这个异常只有引用数据类型会出现,出现的原因只有一点:使用了没有开辟堆内存空间的引用对象。
现在既然已经可以开辟一个对象了,那么也就可以开辟两个对象。
范例:开辟两个对象操作
class Person{ // 现在定义了一个类
// 定义类中的两个属性
String name; // 表示人的姓名
int age; // 表示人的年纪
public void tell(){
System.out.println('姓名:' + name + ',年纪:' + age);
}
}
public class TestDemo{ // 另一个类
public static void main(Srting args[]){
Person perA = new Person(); // 声明并实例化对象
Person perB = new Person();
perA.name = '张三'; // 对象.属性= 内容
perA.age = 30;
perB.name = '王五';
perB.age = 10;
perA.tell(); // 通过对象调用类中的方法
perB.tell();
}
}
/* 返回
姓名:张三,年纪:30
姓名:王五,年纪:10
*/
2.4·初步分析引用传递
引用传递是在引用数据类型上所用的一个操作定义,其是JAVA的 精髓,其操作的性质与C语言的指针是相同的,进行内存的操作。换到程序中,那么就是一块堆内存空间可以同时被多个栈内存所指向。
范例:
把perA保存的堆内存地址给了perB
以上是采用了声明对象的方式进行引用数据类型的接收,那么如果说此时两个对象都已经明确实例化并设置内容了呢?
范例:观察引用类型
class Person{ // 现在定义了一个类
// 定义类中的两个属性
String name; // 表示人的姓名
int age; // 表示人的年纪
public void tell(){
System.out.println('姓名:' + name + ',年纪:' + age);
}
}
public class TestDemo{ // 另一个类
public static void main(Srting args[]){
Person perA = new Person(); // 声明并实例化对象
Person perB = new Person();
perA.name = '张三'; // 对象.属性= 内容
perA.age = 30;
perB.name = '王五';
perB.age = 10;
perB = perA; // 引用传递
perB.name = '赵六';
perA.tell(); // 通过对象调用类中的方法
}
}
通过以上的分析应该可以发现几点:
使用关键字 new 永恒可以开辟新的堆内存空间,堆内存空间保存的就属性
栈内存只能够保存一块堆内存的使用地址
引用传递的本质在于同一块堆内存空间可以被不同的栈内存所指向
在发生引用传递时,如果操作的栈内存原本有堆内存指向,那么改变堆空间就意味着改变内存指向
如果某一块堆内存没有被任何的栈内存所指向,那么此空间将成为垃圾空间,所有的垃圾空间会自动的被 GC (垃圾收集器,Garbage Collector)回收并释放。由于垃圾回收是不确定的执行时间,所以最好的作法是尽量少产生垃圾空间。
如果要想产生垃圾,除了改变引用之外,也可以设置我为 null( perB = null 那么表示 perB 将放弃原本的指向,变为一个没有指向的栈内存)
>>>>
清楚类与对象的定义格式
熟练掌握对象的内存分配,以及内存图的描述
菜鸡的Java笔记 第十 - java 类与对象的更多相关文章
- 菜鸡的Java笔记 第二十 - java 方法的覆写
1.方法的覆写 当子类定义了与父类中的完全一样的方法时(方法名称,参数类型以及个数,返回值类型)这样的操作就称为方法的覆写 范例:观察方法的覆写 class A{ public void ...
- Java进阶(四十)Java类、变量、方法修饰符讲解
Java进阶(四十)Java类.变量.方法修饰符讲解 Java类修饰符 abstract: 将一个类声明为抽象类,没有实现的方法,需要子类提供方法实现. final: 将一个类生命为最终(即非继承类) ...
- Java中直接输出一个类的对象
例如 package com.atguigu.java.fanshe; public class Person { String name; private int age; public Strin ...
- 菜鸡的Java笔记 第二十八 - java 包的定义
包的主要作用以及定义 包的导入操作 系统常见的开发包 jar 程序命令 包的定义 在任何的操作系统之中都有一个统一的共识:同一个目录下不能够存在有相同的文 ...
- 菜鸡的Java笔记 第二十四 - java 接口的基本定义
1.接口的基本定义以及使用形式 2.与接口有关的设计模式的初步认识 3.接口与抽象类的区别 接口与抽象类相比,接口的使用几率是最高的,所有的 ...
- 菜鸡的Java笔记 第二十二 - java 对象多态性
本次只是围绕着多态性的概念来进行讲解,但是所讲解的代码与实际的开发几乎没有关系,而且多态一定是在继承性的基础上才可以操作的, 而本次将使用类继承的关系来描述多态的性质,实际的开发中不会出 ...
- 菜鸡的Java笔记 第十六 - java 引用传递
referenceDelivery 引用传递是整个java 的精髓,也是所有初学者最难学的地方 引用的本质:同一块堆内存可以被不同的栈内存所指向 下面通过三道程序来进行引用传 ...
- 菜鸡的Java笔记 第十二 - java 构造方法与匿名对象
1.点 构造方法的作用以及定义要求 匿名对象的使用 构造方法: 只要出现()的都表示方法 构造方法就是类构造对象时调用的方法,主要用来实例化对象.> ...
- 菜鸡的Java笔记 第二十三 - java 抽象类的概念
abstractClass 抽象类的概念 1.抽象类的基本定义 2.抽象类的使用原则 不会抽象类与接口,java = 没学 ...
随机推荐
- 讲师征集| .NET Conf China 2021正式启动
最近社区小伙伴们一直在为11月即将在武汉举办的 第三届.NET中国峰会而忙碌,社区活动官网设计和开发工作还在进行,我们在国庆节的前一天晚上向社区正式启动了活动的序幕,也就是我们确定好了举办地点.时间, ...
- sarama的消费者组分析、使用
以前老的sarama版本不支持消费者组的消费方式,所以大多数人都用sarama-cluster. 后来sarama支持了消费者组的消费方式,sarama-cluster也停止维护了,但网上关于sara ...
- Linux基本命令 和 Regex 正则表达式
Linux基本命令 和 Regex 正则表达式 Regex 基本语法 常用匹配规则 [aeiouAEIOU] # 从中随机选择一个 [0-9]{4} # 从中选择4个 .* # 匹配任意字符 \w # ...
- 如何正确使用JMeter性能测试?紧扣面试实际要求
前段时间专门挑了一段时间在准备面试.经过两次面试后,有一些比较深刻的认识.对于企业要求来说,除了对专业理论知识考究之外,对测试工具这块也是看重的. 一.使用JMeter测试快速入门 1.线程组是什么 ...
- python的参数传递是值传递还是引用传递?都不是!
[写在前面] 参考文章: https://www.cnblogs.com/spring-haru/p/9320493.html[偏理论,对值传递和引用传递作了总结] https://www.cnblo ...
- Poetry(2)Poetry的基本使用方式
Poetry的基本使用 准备工作 如果你是在一个已有的项目里使用Poetry,你只需要执行 poetry init 命令来创建一个 pyproject.toml 文件: poetry init 可看到 ...
- 打造专属测试平台4-使用Docker部署Django项目
编写完项目代码后,为了稳定的运行,需要将其部署至服务器.这里我选择了Docker去部署Django后端代码. 首先来看看Runoob对Docker的介绍: Docker 是一个开源的应用容器引擎,基于 ...
- 第六次Alpha Scrum Meeting
本次会议为Alpha阶段第六次Scrum Meeting会议 会议概要 会议时间:2021年5月2日 会议地点:线上会议 会议时长:20min 会议内容简介:本次会议主要由每个人展示自己目前完成的工作 ...
- logstash收集的日志输出到elasticsearch中
logstash收集的日志输出到elasticsearch中 一.需求 二.实现步骤 1.编写pipeline文件 1.`elasticsearch`配置参数解析: 2.可能会报的一个异常 2.准备测 ...
- Ajax配合后端实现Excel的导出
一.需求 在我们的日常开发中,可能经常需要遇到excel的导出,以往excel的导出服务器端都是使用的 GET 方法,但是某些情况下,服务器端只能使用 POST 方法,那么我们有没有好的方法实现exc ...