(局部变量需要初始化,全局变量不初始化系统也会帮忙初始化而局部变量系统不会帮忙初始化)
>>>
    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. 突破GD渲染的图片马

    <?php /* The algorithm of injecting the payload into the JPG image, which will keep unchanged aft ...

  2. Cookie实现是否第一次登陆/显示上次登陆时间

    Cookie实现是否第一次登陆/显示上次登陆时间 最近刚好看到Cookie这方面知识,对Servlet部分知识已经生疏,重新翻出已经遗弃角落的<JavaWeb开发实战经典>,重新温习了Co ...

  3. 屏幕截图小工具的制作过程问题记录 python PIL pynput pyautogui pyscreeze

    最近想做一个脚本小工具,方便写一些操作说明文档,它的功能很简单,就是把脚本打开之后,鼠标进行操作点击时,会在点击后进行截图,并在图上标记出点击的位置,有点类似于录屏软件的图片版,这样的话,如果要想用文 ...

  4. 数值计算:粒子群优化算法(PSO)

    PSO 最近需要用上一点最优化相关的理论,特地去查了些PSO算法相关资料,在此记录下学习笔记,附上程序代码.基础知识参考知乎大佬文章,写得很棒! 传送门 背景 起源:1995年,受到鸟群觅食行为的规律 ...

  5. 构建idea父工程

    构建idea父工程 首先通过idea新建一个Maven项目: 选择本地Maven版本: 工程名称: 选择字符编码:utf-8 file -> Settings -> Editor -> ...

  6. MSSQL还原数据库,更改用户登陆权限

    有的时候还原完数据库后,使用账号登陆不进去,报告没有这个用户的时候,可以使用以下sql解决: sp_change_users_login 'update_one','username','userna ...

  7. 《手把手教你》系列技巧篇(二十五)-java+ selenium自动化测试-FluentWait(详细教程)

    1.简介 其实今天介绍也讲解的也是一种等待的方法,有些童鞋或者小伙伴们会问宏哥,这也是一种等待方法,为什么不在上一篇文章中竹筒倒豆子一股脑的全部说完,反而又在这里单独写了一篇.那是因为这个比较重要,所 ...

  8. Tomcat各种日志的关系与catalina.out文件的分割

    Tomcat 各日志之间的关系 一图胜千言! 其他日志如localhost.{yyyy-MM-dd}.log.localhost-access.{yyyy-MM-dd}.log是context的名称, ...

  9. 面试官:Java从编译到执行,发生了什么?

    面试官:今天从基础先问起吧,你是怎么理解Java是一门「跨平台」的语言,也就是「一次编译,到处运行的」? 候选者:很好理解啊,因为我们有JVM. 候选者:Java源代码会被编译为class文件,cla ...

  10. mysql select语句查询流程是怎么样的

    select查询流程是怎么样的 mysql select查询的数据是查询内存里面,如果没有查询的数据没有在内存,就需要mysql的innodb引擎读取磁盘,将数据加载的内存后在读取.这就体现了,mys ...