(局部变量需要初始化,全局变量不初始化系统也会帮忙初始化而局部变量系统不会帮忙初始化)
>>>
    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 类与对象的更多相关文章

  1. 菜鸡的Java笔记 第二十 - java 方法的覆写

    1.方法的覆写    当子类定义了与父类中的完全一样的方法时(方法名称,参数类型以及个数,返回值类型)这样的操作就称为方法的覆写    范例:观察方法的覆写 class A{ public void ...

  2. Java进阶(四十)Java类、变量、方法修饰符讲解

    Java进阶(四十)Java类.变量.方法修饰符讲解 Java类修饰符 abstract: 将一个类声明为抽象类,没有实现的方法,需要子类提供方法实现. final: 将一个类生命为最终(即非继承类) ...

  3. Java中直接输出一个类的对象

    例如 package com.atguigu.java.fanshe; public class Person { String name; private int age; public Strin ...

  4. 菜鸡的Java笔记 第二十八 - java 包的定义

    包的主要作用以及定义    包的导入操作    系统常见的开发包    jar 程序命令        包的定义        在任何的操作系统之中都有一个统一的共识:同一个目录下不能够存在有相同的文 ...

  5. 菜鸡的Java笔记 第二十四 - java 接口的基本定义

    1.接口的基本定义以及使用形式        2.与接口有关的设计模式的初步认识        3.接口与抽象类的区别                 接口与抽象类相比,接口的使用几率是最高的,所有的 ...

  6. 菜鸡的Java笔记 第二十二 - java 对象多态性

    本次只是围绕着多态性的概念来进行讲解,但是所讲解的代码与实际的开发几乎没有关系,而且多态一定是在继承性的基础上才可以操作的,        而本次将使用类继承的关系来描述多态的性质,实际的开发中不会出 ...

  7. 菜鸡的Java笔记 第十六 - java 引用传递

    referenceDelivery    引用传递是整个java 的精髓,也是所有初学者最难学的地方        引用的本质:同一块堆内存可以被不同的栈内存所指向    下面通过三道程序来进行引用传 ...

  8. 菜鸡的Java笔记 第十二 - java 构造方法与匿名对象

    1.点    构造方法的作用以及定义要求    匿名对象的使用    构造方法:        只要出现()的都表示方法        构造方法就是类构造对象时调用的方法,主要用来实例化对象.> ...

  9. 菜鸡的Java笔记 第二十三 - java 抽象类的概念

    abstractClass 抽象类的概念        1.抽象类的基本定义        2.抽象类的使用原则                不会抽象类与接口,java = 没学           ...

随机推荐

  1. SpringBoot入门报错 Whitelabel Error Page的总结

    刚入门SpringBoot,编写helloControl类,去访问本地端口,无缘无故报了这个错误 Whitelabel Error Page 总结了下,目前我碰到的有三种会导致这种情况 1.当你的 S ...

  2. MySQL where子句的使用

    MySQL WHERE 子句 我们知道从 MySQL 表中使用 SQL SELECT 语句来读取数据. 如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句中. 语法 以下是 ...

  3. 设置 SSH 命令行空闲保持会话

    楔子 使用 Mac 或 Linux 原生的命令行 ssh user@ip 方式连接 Linux 闲时会自动断开终端卡死. 为解决这个问题,查了到篇博客翻译下关键步骤记录下来.解决方式可以分服务端设置和 ...

  4. 地心地固坐标系(ECEF)与站心坐标系(ENU)的转换

    目录 1. 概述 2. 原理 2.1. 平移 2.2. 旋转 2.3. 总结 3. 实现 4. 参考 1. 概述 我在<大地经纬度坐标与地心地固坐标的的转换>这篇文章中已经论述了地心坐标系 ...

  5. VulnHub 实战靶场Breach-1.0

    相比于CTF题目,Vulnhub的靶场更贴近于实际一些,而且更加综合考察了知识.在这里记录以下打这个靶场的过程和心得. 测试环境 Kali linux IP:192.168.110.128 Breac ...

  6. C++学习 3 结构体

    结构体基本概念: 结构体属于用户自定义的数据类型,允许用户存储不同的数据类型: 结构体定义和使用: 语法:struct 结构体名 { 结构体成员列表 }: 通过结构体创建变量名的方式有三种:     ...

  7. 洛谷4631 [APIO2018] Circle selection 选圆圈 (KD树)

    qwq纪念AC450 一开始想这个题想复杂了. 首先,正解的做法是比较麻烦的. qwqq 那么就不如来一点暴力的东西,看到平面上点的距离的题,不难想到\(KD-Tree\) 我们用类似平面最近点对那个 ...

  8. Pytorch 实现简单线性回归

    Pytorch 实现简单线性回归 问题描述: 使用 pytorch 实现一个简单的线性回归. 受教育年薪与收入数据集 单变量线性回归 单变量线性回归算法(比如,$x$ 代表学历,$f(x)$ 代表收入 ...

  9. 3.2 Dependencies of the Projects in the Solution 解决方案中项目间的依赖项

    3.2 Dependencies of the Projects in the Solution 解决方案中项目间的依赖项 The diagram below shows the essential ...

  10. BUAA 2020 软件工程 软件分析案例作业

    Author: 17373051 郭骏 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业-软件分析案例 我在这个课程的目标是 学习软件 ...