前段时间经历了一段心态浮躁期,这让我想起了自己最初的计划,要提升自己知识体系的广度。前几年一直做的是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. python 可变数量参数 ( 多参数返回求 参数个数,最大值,最大值)

    一. 自定义一串数字求 参数个数,最大值,最大值()---------方法一: def max(*a): m=a[0] p=a[0] n=0 for x in a: if x>m: m=x n+ ...

  2. 百万年薪python之路 -- 小数据池和代码块

    1.小数据池和代码块 # 小数据池 -- 缓存机制(驻留机制) # == 判断两边内容是否相等 # a = 10 # b = 10 # print(a == b) # is 是 # a = 10 # ...

  3. 课堂练习 Word count

    1. 团队介绍 团队成员:席梦寒,胡琦 2. 项目计划 我们选第一.二个功能点进行编程. 具体计划: (1).首先爬取网站内容及网页长度: (2).对爬取的文件内容进行word count操作: 3. ...

  4. 使用 Django 项目中的 ORM 编写伪造测试数据脚本

    作者:HelloGitHub-追梦人物 文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 为了防止博客首页展示的文章过多以及提升加载速度,可以对文章列表进行分页展示.不过这需 ...

  5. [NOI2001]食物链(并查集拓展域)&& [HAOI2006]旅行(Kruskal)

    题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C 中的一种,但是我 ...

  6. unity 基于scrollRect实现翻页显示

    unity 基于scrollRect实现翻页显示,并定为到某一页,而不是某一页的中间方法(第二个脚本采用实际位置计算,并在update里实现平滑过渡): 组场景时,经常需要获取鼠标(或者点击)开始结束 ...

  7. vue cli3.3 以上版本配置vue.config.js

    // vue.config.js 配置说明//官方vue.config.js 参考文档 https://cli.vuejs.org/zh/config/#css-loaderoptions// 这里只 ...

  8. jquery复习

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. 6、pytest -- 临时目录和文件

    目录 1. 相关的fixture 1.1. tmp_path 1.2. tmp_path_factory 1.3. tmpdir 1.4. tmpdir_factory 1.5. 区别 2. 默认的基 ...

  10. LeetCode刷题总结-数组篇(中)

    本文接着上一篇文章<LeetCode刷题总结-数组篇(上)>,继续讲第二个常考问题:矩阵问题. 矩阵也可以称为二维数组.在LeetCode相关习题中,作者总结发现主要考点有:矩阵元素的遍历 ...