菜鸡的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 = 没学 ...
随机推荐
- 由于坏块导致DG的mrp0进程中断
由于坏块导致DG的mrp0进程中断1.Environment11.2.0.4 ADG 2.SymptomsDG的mrp0进程中断,重启后,还是卡住.查看alert,在1.47存在报错,进一步查看trc ...
- 教你轻松构建基于 Serverless 架构的小程序
前言 自 2017 年第一批小程序上线以来,越来越多的移动端应用以小程序的形式呈现.小程序触手可及.用完即走的优点,大大降低了用户的使用负担,也使小程序得到了广泛的传播.在阿里巴巴,小程序也被广泛地应 ...
- 高级爬虫面试题测试题 v1.3
Python Web高级爬虫工程师测试题 (请本文件发送到: SpiderTestQuestion@163.com 并附带简历) 1. 用yield写一个斐波那契数列的生成器函数. 2. 放一段scr ...
- 题解 CF468C Hack it!
题目传送门 Description 设 \(f(i)\) 表示 \(i\) 的数码只和,给出 \(a\),求出 \(l,r\) 使得 \(\sum_{i=l}^{r} f(i)\equiv 0\pmo ...
- 这么多TiDB负载均衡方案总有一款适合你
[是否原创]是 [首发渠道]TiDB 社区 前言 分布式关系型数据库TiDB是一种计算和存储分离的架构,每一层都可以独立地进行水平扩展,这样就可以做到有的放矢,对症下药. 从TiDB整体架构图可以看到 ...
- [技术博客]Django框架-后端的搭建
目录 Django框架-后端的搭建 前言 环境的部署 项目的创建 app的使用 创建app 修改配置文件 app中数据表的构建 前端接口 接口的路径 运行服务器 验证后端 Django框架-后端的搭建 ...
- BUAA2020软工作业(一)——谈谈我和计算机的缘分
项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 第一次作业-热身! 我在这个课程的目标是 进一步提高自己的编码能力,工程能力 这个作业在哪个具体方 ...
- hystrix的配置说明
在我们的日常开发中,有些时候需要和第三方系统进行对接操作,或者调用其他系统的 api 接口,但是我们不能保证这些第三方系统的接口一定是稳定的,当系统中产生大量的流量来访问这些第三方接口,这些第三方系统 ...
- NOIP模拟22
T1d 一道垃圾贪心,写个堆优化或者桶就行 1 #include<bits/stdc++.h> 2 #define int long long 3 using namespace std; ...
- C语言基础资料,可以看看哦
C语言程序的结构认识 用一个简单的c程序例子,介绍c语言的基本构成.格式.以及良好的书写风格,使小伙伴对c语言有个初步认识. 例1:计算两个整数之和的c程序: #include main() { in ...