前段时间经历了一段心态浮躁期,这让我想起了自己最初的计划,要提升自己知识体系的广度。前几年一直做的是web前端这一块的工作,但我希望通过自己在学习Java这样的过程来提升自己的知识广度。

面向对象概述

  Java语言是一种面向对象的程序设计语言,不同于JavaScript(以下都简称为JS),它属于强类型语言。面向对象思想是一种更符合我们思考习惯的思想,它可以将复杂的事情简单化,并将我们从执行者变成了指挥者。

类与对象的关系

  在JS中面向对象设计中有两个重要的概念:对象、实例,但是Java中对应的是:类、对象。及Java中的类类似于JS当中对象,Java中对象类似于JS中实例。

  类是对一类事物的描述,是抽象的。对象是一类事物的实例,是具体的。类是对象的模板,对象是类的实体。

战机模板(类)

战机实物(对象)

Java类的特征及基本定义

1.类的特征

  Java中的类,包含了四大基本特征,即抽象性、封装性、继承性和多态性。是属性和行为的集合。

  抽象性,从上面的第一张图就可以看出来,类似于具有公共特性和行为的一张模板,不是实际的事物。封装、继承、多态性会在在后面逐一讲解。

2.类的基本定义

  public class ClassName {

    //成员变量--->属性

    //成员方法--->行为

  }

3.成员变量的默认值

数据类型

数据类型

默认值

基本类型

整数(byte,short,int,long)

0

浮点数(float,double)

0.0

字符(char)

'\u0000'

布尔(boolean)

false

引用类型

数组,类,接口...

null

对象的基本使用方式

1.创建对象:

  类名 对象名 = new 类名(参数列表);

2.访问成员:

  对象名.成员变量;

  对象名.成员方法(参数列表);

3.对象内存图

  为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。

  JVM的内存划分:

内存区域名称

作用

寄存器

给CPU使用,和我们开发无关。

本地方法栈

JVM在使用操作系统功能的时候使用,和我们开发无关。

方法区

存储可以运行的class文件。存储.class相关信息,包含方法的信息。

堆内存

存储对象或者数组,new来创建的,都存储在堆内存。

堆内存中的每小块都有一个16进制的地址值。

堆内存里面的变量都有一个默认值。

方法栈

方法运行时使用的内存,比如main方法运行,进入方法栈中执行。

  • 实例化一个对象的内存图

  如上图所示,当写好的程序编译后,会把程序中对应的模块放入到对应的内存区域中。当程序执行的时候首先进入到中 main 方法(栈是先进后出,后进先出的执行方式)。遇到 Phone p ,这时候 p 保存的是 new Phone() 的地址,然后去堆内存中找对应的地址的内存小块,并执行下面的赋值操作,这时候遇到 p.sendMessage() 就会把放入到栈内存中执行(其实也是保存的是一个地址,通过这个地址去堆内存当中找到对应的代码执行相关操作)。

  • 实例化多对象内存图

  如果类中包含了一个方法,如果在创建多个对象的时候必然会包含这个这个方法信息,那么如果每个对象都保存一份这个方法的话必然会导致内存浪费,因此如何解决这个问题呢?请看下图:

  因此对象调用方法时,根据对象中方法标记(地址值),去类中寻找方法信息。这样哪怕是多个对象,方法信息只保存一份,节约内存空间。

  • 将对象作为参数传递到方法中的内存图

  对象作为一种引用类型,引用类型作为参数传递的都是地址值。如果你直接输出这个p你会发现打印的事一个十六进制的数据,这个数据就是所对应的地址值。

成员变量和局部变量

  类中的变量我们可以根据所定义的位置不同来区分什么是成员变量和局部变量。如下所示:

public class Person {
String name; // 成员变量
public void sayHello(){
int age = 20; // 局部变量
System.out.println("我的名字"+name+"和年龄"+age)
}
}

成员变量和局部变量区别如下:

1.在类中的位置不同

  成员变量:类中,方法外

  局部变量:方法中或者方法声明上(形式参数)

2.作用范围不一样

  成员变量:类中

  局部变量:方法中

3.初始化值的不同

  成员变量:有默认值

  局部变量:没有默认值。必须先定义,赋值,最后使用

4.在内存中的位置不同

  成员变量:堆内存

  局部变量:栈内存

5.生命周期不同

  成员变量:随着对象的创建而存在,随着对象的消失而消失

  局部变量:随着方法的调用而存在,随着方法的调用完毕而消失

6.就近原则

  当方法的局部变量和类的成员变量重名的时候,根据“就近原则”,优先使用局部变量。

  如果需要访问本类当中的成员变量,需要使用格式:this.成员变量名

public class Person {

    String name; // 成员变量

    public void sayHello(String name) { // 参数name局部变量
System.out.println(name + ",你好。我是" + this.name);
} }

【Java】面向对象初探的更多相关文章

  1. Java 面向对象 初探

    public class test { public static void main(String[] args) { // 利用new关键字创建了一个Person对象 Person p = new ...

  2. 【Java学习笔记之十三】初探Java面向对象的过程及代码实现

    理解Java面向对象的重要知识点: 一. 类,对象 类?首先举一个例子:小李设计了一张汽车设计图,然后交给生产车间来生产汽车,有黑色的.红色的.白色的... 这里,汽车设计图就是我们说的类(class ...

  3. JAVA面向对象

    JAVA面向对象 对象   我们生活中能看到能摸到的一切事物都是对象.在程序中模拟出生活中的所有东西万物皆对象   只要是对象--属性和行为(方法)   属性   对象有什么   例如:学生有姓名.学 ...

  4. 理解JAVA - 面向对象(object) - 属性,方法

    理解JAVA - 面向对象(object) - 属性,方法 多态的体现:    向上造型,父类接收子类对象:向上造型:    从父类角度看不到子类独有的方法:面向对象,人类认知世界的方式:生活中每天都 ...

  5. Java面向对象㈠ -- 封装

    Java的面向对象有三大特征:封装.继承.多态.这里主要对封装进行讲解. 封装可以理解为隐藏一个类的成员变量和成员函数,只对外提供需要提供的成员函数. Java的封装主要通过访问权限控制符:priva ...

  6. 谈谈Java面向对象的三大特性

    Java面向对象的三大特性就是指封装.继承.多态了. 一.封装: 概念:封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式. (举例:笔记本电脑就是一个封装体,Java语言中最小的封装体就是函数 ...

  7. Java面向对象:接口

    Java面向对象之接口 什么是接口:接口是一种规范和标准,他们可以约束类的行为,是一些方法特征的集合 语法: [修饰符] interface 接口名 extends 父接口1,夫接口2....... ...

  8. 实验二 Java面向对象程序设计

    实验二 Java面向对象程序设计 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计 ...

  9. java基础1.0::Java面向对象、面向对象封装、抽象类、接口、static、final

    一.前言 一直以来都是拿来主义,向大神学习,从网上找资料,现在就把自己在工作中和学习中的所理解的知识点写出来,好记星不如烂笔头,一来可以作为笔记自己温习,二来也可以给走在求学之路的同学们一点参考意见, ...

  10. 20145212《Java程序设计》实验报告二 《 Java面向对象程序设计》

    20145212 实验二< Java面向对象程序设计> 实验内容 单元测试 三种代码 伪代码 百分制转五分制: 如果成绩小于60,转成"不及格" 如果成绩在60与70之 ...

随机推荐

  1. Angular/Vue多复选框勾选问题

    此页面效果以Angular实现,Vue也可按照其大致流程实现,其核心本质没有改变. 功能效果为:页面初始化效果为要有所有角色的复选框,要求初始化默认勾选的角色要显示勾选,之后,能按照最终勾选的状态提交 ...

  2. opencv::基本阈值操作

    图像阈值(threshold) 阈值 是什么?简单点说是把图像分割的标尺,这个标尺是根据什么产生的,阈值产生算法?阈值类型.(Binary segmentation) 阈值类型一阈值二值化(thres ...

  3. HDU 6112 今夕何夕 (预处理 枚举)

    中文题意都看的懂啦~ 思路很简单,就是通过前一天推出当天是星期几,直接枚举所有2017-9999年的每一天就好了.ㄟ( ▔, ▔ )ㄏ 代码: #include <cstdio> #def ...

  4. 共轭梯度法求解协同过滤中的 ALS

    协同过滤是一类基于用户行为数据的推荐方法,主要是利用已有用户群体过去的行为或意见来预测当前用户的偏好,进而为其产生推荐.能用于协同过滤的算法很多,大致可分为:基于最近邻推荐和基于模型的推荐.其中基于最 ...

  5. 玩转OneNET物联网平台之MQTT服务② —— 远程控制LED

    1.理论基础     参考博主线上博文: 玩转PubSubClient MQTT库 玩转OneNET物联网平台之简介 玩转OneNET物联网平台之MQTT服务① 2.远程控制LED 2.1 实验材料 ...

  6. 基于docker的mysql8的主从复制

    基于docker的mysql8的主从复制 创建mysql的docker镜像 构建docker镜像,其中数据卷配置内容在下面,结构目录如下 version: '3.7' services: db: # ...

  7. CheckBox多选

    前台: <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center"> & ...

  8. 关于到美国学习cs的亲身感受,希望对你们有所帮助

    1.能否向各位寄托天下的朋友们简单介绍一下你自己?比如你国内的学校(或者什么档次),哪年申请出国的,什么专业,硕士还是博士,在美国的学校(或者什么档次),以及留学经历(毕业时间),现在状态(学生?博后 ...

  9. 【Java】遍历List/Set/Map集合的一些常用方法

    /* * 遍历List/Set/Map集合的一些常用方法 */import java.util.ArrayList;import java.util.HashMap;import java.util. ...

  10. javascript获取坐标/滚动/宽高/距离

    坐标(鼠标/触摸) event.screenX 鼠标/触摸,相对于显示屏的X坐标 event.screenY 鼠标/触摸,相对于显示屏的Y坐标 event.clientX 鼠标/触摸,相对于浏览器视口 ...