前段时间经历了一段心态浮躁期,这让我想起了自己最初的计划,要提升自己知识体系的广度。前几年一直做的是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. Hello World ! 节日快乐!

    节日快乐! 世界你好,Hello World Java public class HelloWorld{ public static void main(String[] args) { System ...

  2. Halcon一日一练:阈值分割的几个算子

    threshold(Image:Region:MinGray:MaxGray:) 功能:得到灰度值在最小与最大这间的那些部分.其返回仍然是一个区域. MinGray<MaxGray. 这个算子可 ...

  3. linux使用jq工具解析json

    jq类似一个awk或grep一样的神器,可以方便地在命令行操作json 这里我使用海南万宁的天气接口做演示,地址:http://t.weather.sojson.com/api/weather/cit ...

  4. C语言I博客作业05

    内容 答案 这个作业属于哪个课程 C语言程序设计II 这个作业要求在哪里 C语言I作业05 我在这个课程的目标是 更熟练的运用编译函数问题 这个作业在哪个具体方面帮助我实现目标 PTA实验作业 参考文 ...

  5. WPF中的文本度量

    关于WPF中的文本度量,需要了解以下几个问题: WPF中支持一些常用的度量单位:px(device independent pixels).in(inches).cm(centimeters).pt( ...

  6. Vue系列---理解Vue.nextTick使用及源码分析(五)

    _ 阅读目录 一. 什么是Vue.nextTick()? 二. Vue.nextTick()方法的应用场景有哪些? 2.1 更改数据后,进行节点DOM操作. 2.2 在created生命周期中进行DO ...

  7. 现在Java 桌面应用程序能做到什么程度(Spring Boot+JavaFX2开发)

    Spring Boot - JavaFX 2.0应用 很多人对Java开发native程序第一反应还停留在暗灰色单一风格的Java GUI界面,开发方式还停留在AWT或者Swing.本文主要基于Spr ...

  8. java中JVM内存管理(1)

    Java岗位面试,JVM是对程序员基本功考察,通常会问你对JVM了解吗?  可以分几部分回答这个问题,首先JVM内存划分 | JVM垃圾回收的含义  |  有哪些GC算法  以及年轻代和老年代各自特点 ...

  9. Shell进阶精品课程

    课程链接 Shell精品进阶教程:理解Shell的方方面面 课程目标 系统性的掌握shell相关知识,进阶shell脚本能力,对shell各方面了然于心 适用人群 具备shell基础但想深入.系统性掌 ...

  10. Ubuntu18.04系统下安装Pycharm&vim设置自动缩进及默认显示行号

    Ubuntu18.04系统自带python3.6及python2.7,Pycharm是一款非常强大的IDE.目前Pycharm有两个版本:专业版和Community社区,区别是专业版是收费,而且功能更 ...