一、面向对象简述

面向对象是一种现在最为流行的程序设计方法,几乎现在的所有应用都以面向对象为主了,最早的面向对象的概念实际上是由IBM提出的,在70年代的Smaltalk语言之中进行了应用,后来根据面向对象的设计思路,才形成C++,而由C++产生了Java这门面向对象的编程语言。

但是在面向对象设计之前,广泛采用的是面向过程,面向过程只是针对于自己来解决问题。面向过程的操作是以程序的基本功能实现为主,实现之后就完成了,也不考虑修改的可能性,面向对象,更多的是要进行子模块化的设计,每一个模块都需要单独存在,并且可以被重复利用,所以,面向对象的开发更像是一个具备标准的开发模式。

在面向对象定义之中,也规定了一些基本的特征:
(1)封装:保护内部的操作不被破坏;
(2)继承:在原本的基础之上继续进行扩充;
(3)多态:在一个指定的范围之内进行概念的转换。

对于面向对象的开发来讲也分为三个过程:OOA(面向对象分析)、OOD(面向对象设计)、OOP(面向对象编程)。

二、类与对象的基本概念

类与对象时整个面向对象中最基础的组成单元。

:是抽象的概念集合,表示的是一个共性的产物,类之中定义的是属性和行为(方法);
对象:对象是一种个性的表示,表示一个独立的个体,每个对象拥有自己独立的属性,依靠属性来区分不同对象。

可以一句话来总结出类和对象的区别:类是对象的模板,对象是类的实例。类只有通过对象才可以使用,而在开发之中应该先产生类,之后再产生对象。类不能直接使用,对象是可以直接使用的。

三、类与对象的定义和使用

在Java中定义类,使用关键字class完成。语法如下:

class 类名称 {属性 (变量) ;行为 (方法) ;
}

范例:定义一个Person类

class Person {     // 类名称首字母大写String name ;int age ;public void tell() {        // 没有staticSystem.out.println("姓名:" + name + ",年龄:" + age) ;}
}

类定义完成之后,肯定无法直接使用。如果要使用,必须依靠对象,那么由于类属于引用数据类型,所以对象的产生格式(两种格式)如下:

(1)格式一:声明并实例化对象

类名称 对象名称 = new 类名称 () ;

(2)格式二:先声明对象,然后实例化对象:

类名称 对象名称 = null ;
对象名称 = new 类名称 () ;

引用数据类型与基本数据类型最大的不同在于:引用数据类型需要内存的分配和使用。所以,关键字new的主要功能就是分配内存空间,也就是说,只要使用引用数据类型,就要使用关键字new来分配内存空间。

当一个实例化对象产生之后,可以按照如下的方式进行类的操作:
对象.属性:表示调用类之中的属性;
对象.方法():表示调用类之中的方法。

范例:使用对象操作类

package com.wz.classandobj;class Person { String name ;int age ;public void get() {System.out.println("姓名:" + name + ",年龄:" + age);}
}public class TestDemo {public static void main(String args[]) {Person per = new Person() ;// 声明并实例化对象per.name = "张三" ;//操作属性内容per.age = 30 ;//操作属性内容per.get() ;//调用类中的get()方法}
}

运行结果:

姓名:张三,年龄:30

以上完成了一个类和对象的操作关系,下面换另外一个操作来观察一下:

package com.wz.classandobj;class Person { String name ;int age ;public void get() {System.out.println("姓名:" + name + ",年龄:" + age);}
}public class TestDemo {public static void main(String args[]) {Person per = null;//声明对象per = new Person() ;//实例化对象per.name = "张三" ;//操作属性内容per.age = 30 ;//操作属性内容per.get() ;//调用类中的get()方法}
}

运行结果:

姓名:张三,年龄:30

那么,问题来了,以上两种不同的实例化方式有什么区别呢?
我们从内存的角度分析。首先,给出两种内存空间的概念:
(1)堆内存:保存对象的属性内容。堆内存需要用new关键字来分配空间;
(2)栈内存:保存的是堆内存的地址(在这里为了分析方便,可以简单理解为栈内存保存的是对象的名字)。

任何情况下,只要看见关键字new,都表示要分配新的堆内存空间,一旦堆内存空间分配了,里面就会有类中定义的属性,并且属性内容都是其对应数据类型的默认值。

于是,上面两种对象实例化对象方式内存表示如下:

两种方式的区别在于①②,第一种声明并实例化的方式实际就是①②组合在一起,而第二种先声明然后实例化是把①和②分步骤来。

另外,如果使用了没有实例化的对象,结果如何?
如下:

package com.wz.classandobj;class Person { String name ;int age ;public void get() {System.out.println("姓名:" + name + ",年龄:" + age);}
}public class TestDemo {public static void main(String args[]) {Person per = null;//声明对象//per = new Person() ;//实例化对象per.name = "张三" ;//操作属性内容per.age = 30 ;//操作属性内容per.get() ;//调用类中的get()方法}
}

运行结果:

Exception in thread "main" java.lang.NullPointerExceptionat com.wz.classandobj.TestDemo.main(TestDemo.java:15)

此时,程序只声明了Person对象,但并没有实例化Person对象(只有了栈内存,并没有对应的堆内存空间),则程序在编译的时候不会出现任何的错误,但是在执行的时候出现了上面的错误信息。这个错误信息表示的是“NullPointerException(空指向异常)”,这种异常只要是应用数据类型都有可能出现。

四、对象引用传递初步分析

引用传递的精髓:同一块堆内存空间,可以同时被多个栈内存所指向,不同的栈可以修改同一块堆内存的内容。

下面通过若干个程序,以及程序的内存分配图,来进行代码的讲解。

我们来看一个范例:

class Person {     String name ;int age ;public void tell() {        System.out.println("姓名:" + name + ",年龄:" + age) ;}
}
public class TestDemo {public static void main(String args[]) {Person per1 = new Person() ;         // 声明并实例化对象per1.name = "张三" ;per1.age = 20 ;Person per2 = per1 ;  // 引用传递per2.name = "李四" ;per1.tell() ;}
}

对应的内存分配图如下:

再来看另外一个:

class Person {String name ;int age ;public void tell() {System.out.println("姓名:" + name + ",年龄:" + age) ;}
}
public class TestDemo {public static void main(String args[]) {Person per1 = new Person() ;         // 声明并实例化对象Person per2 = new Person() ;per1.name = "张三" ;per1.age = 20 ;per2.name = "李四" ;per2.age = 30 ;per2 = per1 ;// 引用传递per2.name = "王五" ;per1.tell() ;}
}

对应的内存分配图如下:

垃圾:指的是在程序开发之中没有任何对象所指向的一块堆内存空间,这块空间就成为垃圾,所有的垃圾将等待GC(垃圾收集器)不定期的进行回收与空间的释放。

未完待续。。。

Java类和对象 详解(一)相关推荐

  1. Java 类和对象详解(二)——static关键字

    文章目录 1.static关键字 为何会引入这个static 变量? final 和 static 的区别 static 修饰方法 1.static关键字 看见static,本能反应,和对象无关 st ...

  2. 深入理解Java虚拟机之Java类加载机制,Java类实例化过程详解。

    目录 Java类加载机制 类加载过程 加载(Loading) 连接(Linking) 初始化(Initialzation) 使用(Useing) 卸载(Unloading) 引言 什么情况下开始类加载 ...

  3. Scala 类和对象详解

    Scala 类和对象 类是对象的抽象,而对象是类的具体实例.类是抽象的,不占用内存,而对象是具体的,占用存储空间.类是用于创建对象的蓝图,它是一个定义包括在特定类型的对象中的方法和变量的软件模板. 我 ...

  4. java中Class对象详解

     java中把生成Class对象和实例对象弄混了,更何况生成Class对象和生成instance都有多种方式.所以只有弄清其中的原理,才可以深入理解.首先要生成Class对象,然后再生成Instanc ...

  5. java中Class对象详解和类名.class, class.forName(), getClass()区别

     一直在想.class和.getClass()的区别,思索良久,有点思绪,然后有网上搜了搜,找到了如下的一篇文章,与大家分享. 原来为就是涉及到Java的反射----- Java反射学习 所谓反射 ...

  6. 九 Python 类与对象详解,这是软件工程师的分水岭

    目录 1 为什么要面向对象编程 2 核心思想 3 初次体验 4 初始化方法 5 类专用的方法 6 继承(有点像生物的基因传递) 7 灵活的Python,属性自由 8 一切皆是对象 9 OOP的设计方法 ...

  7. python类和对象详解_Python公开课 - 详解面向对象

    前言 在C语言中,单纯通过结构化的函数也可以实现很好的软件,顺序思路比较好理解:而C++则以面向对象的思维来进行代码组织,通过定义对象.成员变量.成员函数.以封装.继承和多态等方式来更灵活处理业务逻辑 ...

  8. 【C++学习笔记一】C++类和对象详解

    类定义是以关键字class开头,后面跟类的名称.主体是包含在一对花括号中.类定义后必须跟着一个分号或一个声明列表. 类的对象的公共数据成员可以使用直接成员访问运算符.来访问.需要注意的是,私有的成员和 ...

  9. Android中使用Intent进行窗体切换,并且传值和自定义类的对象详解

    在Android中,Intent对象负责各个Activity窗口之间的切换,同时他更担负起数据传输重任. 一般情况下,使用Intent对象进行简单窗口切换的代码如下: Intent i=new Int ...

  10. Scala类和对象详解

    一.类定义.创建对象 Scala和Java一样,用class关键字来创建类,eg: class Student{ var score:Int=0 } 利用javap -private Student命 ...

最新文章

  1. linux内核中的每cpu变量
  2. DL之LSTM:基于tensorflow框架利用LSTM算法对气温数据集训练并回归预测
  3. 天地图专题一:加载天地图
  4. python顺序查找的递归算法_Python实现查找算法
  5. linux 停止路由转发策略_Linux静态路由
  6. 论文阅读笔记——拥塞控制算法PCC
  7. 招聘笔试行测题之图形推理题解题思路汇总
  8. python 内存不足_python内存不够
  9. 爬虫笔记——urllib实战之淘宝零食板块爬取
  10. sqli-labs(29-31)
  11. 专业技能与职业素养报告计算机,职业技能与职业素养的心得体会
  12. python打开方式包括_运行Python程序有两种方式:________和________。
  13. 空指针异常 NullPointException
  14. 无约束优化问题(一)
  15. ftp服务器备份手机文件,ftp服务器文件自动备份
  16. ImportError: libpython3.8.so.1.0: cannot open shared object file: No such file 【Docker 容器root用户方法总结】
  17. 趋高智能注塑件表面视觉检测之机器视觉的缺陷检测方案
  18. Lammps 源代码解析
  19. IIC(I2C)协议详解
  20. This is very likely to create a memory leak. Stack trace of thread 错误分析

热门文章

  1. 麦腾股份正式挂牌新三板,创业孵化市场或将深度洗牌
  2. Spring核心原理
  3. RGB颜色查询对照表
  4. NISP第一讲信息安全和网络空间安全
  5. javascript实现有序map
  6. 心理学在计算机方面的应用,浅析计算机在心理学研究中的应用
  7. 沉迷游戏在心理学怎么解释
  8. DSP实验报告四:GMSK 调制与解调
  9. CNN实现手写数字识别
  10. 3dmax2022序列号 附使用说明