前言


  Java语言是一种面向对象的语言。面向对象的思想是在七十年代的时候由IBM的SmallTalk语言最先推广。那什么是面向对象呢?面向对象指的是一种开发模式。早期的计算机编程使用的是面向过程的方法,面向过程的特点是针对某一问题单独提出解决方案以及代码开发。而面向对象是一种以组件化的形式进行代码设计,因为是组件化的所以重用性高,维护也比较方便。

下面将介绍:

  • Java面向对象的特征(简要概述)

  • Java的类和对象

    • 类和对象的关系

    • 类和对象的定义结构

    • 对象的内存分配

0x00 Java面向对象的特征


面向对象有三大特性:

封装性:

通过合并特征和行为来创建新的数据类型,并且保护内部定义结构的安全性。

继承性

在已有的程序结构上继续扩充新的功能。

多态性

通过分离做什么和怎么做,将对外的接口和实现分开,使得消除类型之间的耦合关系。

对于从同一基类导出的类的对象做同一操作从而表现出不同的效果,就是多态的体现。




0x10 Java的类和对象


0x11 类和对象之间的关系


类和对象是面向对象当中最为基础的组成单元。

类是对现实世界的事物的一种抽象,将现实的实体的特征抽象成数据并将这些数据封装形成的新类型。

万物皆对象,对象是具有类类型的变量。

可以说是类是用来描述对象结构,类是用来操作对象的模板,类不能被直接使用,使用类创建的对象可以被操作。




0x12 类和对象的定义结构


类的定义:

Java中类的定义使用关键字Class

Class 类名称{
...
}

可以在类中定义两种类型的元素:Filed和Method

  • Filed(字段/属性/成员/变量):表示特性的变量的集合
  • Method(方法/行为/成员函数):表示可以做某些事情

对象的定义:

对象的定义有两种方式:

  1. 声明并实例化对象: 类名称 对象名称=new 类名称();

  2. 分步完成

    声明对象:类名称 对象名称=null;

    实例化对象:对象名称=new 类名称;

Java中的数据类型分为引用数据类型。这里对象名称是引用数据类型等同于C语言中的指针。关键字new的主要功能是开辟内存空间(不同于C++中的new,C++中的new完成了两个功能开辟空间和初始化对象)。new后面的类名称()完成对象属性的初始化。





0x13 对象的内存分配


程序运行时,对象是怎么进行放置安排的呢?尤其是内存空间是如何安排的呢?我们需要先了解再计算机中,有以下五个地方可以存储数据:

  1. 寄存器

    是最快的存储区,位于处理器内部,数量有限,一般不能被直接控制。

  2. 堆栈

    位于通用RAM(随机访问存储器)中。堆栈指针通过向下移动可以分配内存,向上移动可以释放内存。这种快速分配内存的效率仅次与寄存器。创建程序时,Java系统必须知道存储在堆栈内所有项的确切生命周期,以便上下移动堆栈指针。这一约束限制了程序的灵活性,但是Java中的对象引用是存储在堆栈中的



  3. 一种通用的内存池(也是位于RAM区),用于存放所有的Java对象。堆不同栈的好处是:编译器不需要知道存储的数据在堆里的存活时间是多少。因此,在堆里分配会具有很大的灵活性。虽然灵活但是也有代价,在堆里清除过期对象的花费会比清除栈中的要高。

  4. 常量存储

    常量值通常直接存放在程序代码内部,永远不会被改变。

  5. 非RAM存储

    如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。其中两个基本的例子便是:流对象和持久化对象。“流对象”:对象被转换为字节流,发送给另一台机器。“持久化对象”:对象被放于磁盘上。因此,即使程序终止,它们也可以保持自己的状态。

回到Java对象在内存分配的问题上。堆内存保存着每一个对象的属性内容。在使用new关键字时就是在堆上开辟了一个新空间。栈内存中保存着是存储对象引用其值便是指向对应存储了属性值的堆空间地址。

需要注意:

一块没有被任何栈内存指向的堆空间就会成为垃圾空间,所有的垃圾会不定期地被垃圾收集器GC进行回收,回收后会释放其所占用空间。
虽然,Java有自动垃圾回收机制,但是在代码的开发过程中还是要尽量减少垃圾空间的产生。




总结


面向对象有三大特性即封装、继承和多态。

类和对象是面向对象的基础,类是对对象操作的抽象,对象是通过类被实例化的。

Java中对象的引用是存储于栈中,对象本身的值存储于堆中,栈中的引用存储对象值所在堆中的地址。

Java——类和对象的更多相关文章

  1. Java类和对象初始化

    类的生命周期: Java类的初始化: 本阶段负责为类变量赋正确的初始值.(类变量即静态变量) Java编译器把所有的类变量初始化语句和静态初始化器通通收集到<clinit>方法中,该方法只 ...

  2. java类和对象之间的差

    java类和对象之间的差别是一个普遍的问题,刚开始学习java当它来到与类和对象接触.今天就来总结一下它们之间的差异. 先说说class和object差异.事实上,词:object是全部class的父 ...

  3. 危险代码:如何使用Unsafe操作内存中的Java类和对象

    危险代码:如何使用Unsafe操作内存中的Java类和对象—Part1 危险代码:如何使用Unsafe操作内存中的Java类和对象—Part2 危险代码:如何使用Unsafe操作内存中的Java类和对 ...

  4. [Java初探08]__简单学习Java类和对象

    前言 在前面的学习中,我们对面向对象的编程思想有了一个基本的了解,并且简单的了解了类和对象的定义.那么类和对象在Java语言中是如何表现的,这次,就从实际出发,学习一下一下类和对象在Java语言中的使 ...

  5. java类和对象

    类是对象的抽象 对象是类的一个实例类 对象 = new 类();拿对象可以操作这个类里的方法 java类与对象的区别是个老生常谈的问题,刚开始学java的时候就开始接触类和对象,今天来总结一下他们之间 ...

  6. 解析Java类和对象的初始化过程

    类的初始化和对象初始化是 JVM 管理的类型生命周期中非常重要的两个环节,Google 了一遍网络,有关类装载机制的文章倒是不少,然而类初始化和对象初始化的文章并不多,特别是从字节码和 JVM 层次来 ...

  7. JAVA类和对象课后作业

    1.使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数.请写一个类,在任何时候都可以向它查询"你已经创建了多少个对象?" 代码: //显示类 //YiMingLai 2 ...

  8. Java类与对象的基础学习

    1. 请输入并运行以下代码,得到什么结果? public class Test{ public static void main(String args[]){ Foo obj1=new Foo(); ...

  9. JAVA类与对象作业——动手动脑以及课后实验性问题

    一: 1.源代码 //MAO2015.10.6 //foo class Foo { int value; public Foo(int initValue) { value = initValue; ...

  10. JAVA类与对象(九)------多态

    多态是同一个行为具有多个不同表现形式或形态的能力.多态性是对象多种表现形式的体现. 多态存在的三个必要条件: 继承 重写 父类引用指向子类对象 例:Parent p = new Child(); 当使 ...

随机推荐

  1. 洛谷 质因子分 p2043

    #include <iostream>#include <algorithm>#include <cstring>using namespace std; cons ...

  2. jmeter+ant+jenkins接口自动化环境搭建

    一.准备   1.安装jdk  --->点击查看安装教程 2.安装jmeter  ,官网下载jmeter解压,配置jmeter环境: JMETER_HOME (解压jdk路径) Path (;% ...

  3. 20145232韩文浩 《网络对抗技术》 Web安全基础实践

    问题回答 SQL注入攻击原理?如何防御? 原理:SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,使 ...

  4. Hadoop-2.0 目录简介

    Hadoop-2.0 目录简介 一.目录结构 将下载的压缩包解压: 解压后文件夹如下: 二.各文件夹目录结构 1.bin:Hadoop2.0的最基本管理脚本和使用脚本所在目录.这些脚本是sbin目录下 ...

  5. 可参数化的带优先级的数据选择器的FPGA实现方式探讨

    在FPGA设计中,大部分情况下我们都得使用到数据选择器.并且为了设计参数化,可调,通常情况下我们需要一个参数可调的数据选择器,比如M选1,M是可调的参数. 如果,数据选择器是不带优先级的,我们可以使用 ...

  6. Python基础理论 - 函数

    函数是第一类对象:可以当做数据来传 1.  可以被引用 2.  可以作为函数参数 3.  可以作为函数返回值 4.  可以作为容器类型的元素 小例子: def func1(): print('func ...

  7. 英语演讲稿——Get Along with Fear

    Hi. My name is Zhang Meng. I’m an engineer at Keysight. Today I’m not going to introduce my birthpla ...

  8. 剑指offer面试题15:链表中倒数第K个节点

    题目:输入一个链表,输出该链表的倒数第K个节点.为了符合大多数人的习惯,本题从1开始计数,即链表尾节点是倒数第一个节点. 解题思路: 解法一:一般情况下,单向链表无法从后一个节点获取到它前面的节点,可 ...

  9. Docker应用:Kubernetes(容器集群)

    阅读目录: Docker应用:Hello World Docker应用:Docker-compose(容器编排) Docker应用:Kubernetes(容器集群) 前言: 终于出第三篇了,上个月就已 ...

  10. C/C++中宏定义#pragma once与 #ifndef的区别

    为了避免同一个文件被include多次,我们可以通过以下两种方式来进行宏定义: 1. #ifndef方式2. #pragma once方式 在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两 ...