【Java】面向对象初探
前段时间经历了一段心态浮躁期,这让我想起了自己最初的计划,要提升自己知识体系的广度。前几年一直做的是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】面向对象初探的更多相关文章
- Java 面向对象 初探
public class test { public static void main(String[] args) { // 利用new关键字创建了一个Person对象 Person p = new ...
- 【Java学习笔记之十三】初探Java面向对象的过程及代码实现
理解Java面向对象的重要知识点: 一. 类,对象 类?首先举一个例子:小李设计了一张汽车设计图,然后交给生产车间来生产汽车,有黑色的.红色的.白色的... 这里,汽车设计图就是我们说的类(class ...
- JAVA面向对象
JAVA面向对象 对象 我们生活中能看到能摸到的一切事物都是对象.在程序中模拟出生活中的所有东西万物皆对象 只要是对象--属性和行为(方法) 属性 对象有什么 例如:学生有姓名.学 ...
- 理解JAVA - 面向对象(object) - 属性,方法
理解JAVA - 面向对象(object) - 属性,方法 多态的体现: 向上造型,父类接收子类对象:向上造型: 从父类角度看不到子类独有的方法:面向对象,人类认知世界的方式:生活中每天都 ...
- Java面向对象㈠ -- 封装
Java的面向对象有三大特征:封装.继承.多态.这里主要对封装进行讲解. 封装可以理解为隐藏一个类的成员变量和成员函数,只对外提供需要提供的成员函数. Java的封装主要通过访问权限控制符:priva ...
- 谈谈Java面向对象的三大特性
Java面向对象的三大特性就是指封装.继承.多态了. 一.封装: 概念:封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式. (举例:笔记本电脑就是一个封装体,Java语言中最小的封装体就是函数 ...
- Java面向对象:接口
Java面向对象之接口 什么是接口:接口是一种规范和标准,他们可以约束类的行为,是一些方法特征的集合 语法: [修饰符] interface 接口名 extends 父接口1,夫接口2....... ...
- 实验二 Java面向对象程序设计
实验二 Java面向对象程序设计 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计 ...
- java基础1.0::Java面向对象、面向对象封装、抽象类、接口、static、final
一.前言 一直以来都是拿来主义,向大神学习,从网上找资料,现在就把自己在工作中和学习中的所理解的知识点写出来,好记星不如烂笔头,一来可以作为笔记自己温习,二来也可以给走在求学之路的同学们一点参考意见, ...
- 20145212《Java程序设计》实验报告二 《 Java面向对象程序设计》
20145212 实验二< Java面向对象程序设计> 实验内容 单元测试 三种代码 伪代码 百分制转五分制: 如果成绩小于60,转成"不及格" 如果成绩在60与70之 ...
随机推荐
- Ubuntu 16.04 集成安装Apache+PHP+Kerberos+LDAP+phpLDAPadmin
一.安装Apache 1.1.安装Apache apt-get update apt-get install apache2 过程如下: root@duke01:~# apt-get update命中 ...
- 异步IO实例
#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> ...
- POJ 3295 Tautology(构造法)
题目网址:http://poj.org/problem?id=3295 题目: Tautology Time Limit: 1000MS Memory Limit: 65536K Total Su ...
- Flink实战| Flink+Redis实时防刷接口作弊
随着人口红利的慢慢削减,互联网产品的厮杀愈加激烈,大家开始看好下沉市场的潜力,拼多多,趣头条等厂商通过拉新奖励,购物优惠等政策率先抢占用户,壮大起来.其他各厂商也紧随其后,纷纷推出自己产品的极速版,如 ...
- 聊聊面试-NoClassDefFoundError 和 ClassNotFoundException 区别
(上图是圣卡塔利娜岛,美国南加州的一个小岛,也是 mac OS 10.15 版本的官方默认壁纸) ___ 概述 Hello,大家好,我们又来讲面试中的基础题了,今天这是一道很经典又很猥琐的题 说猥琐是 ...
- 百万年薪python之路 -- JS的BOM与DOM对象
BOM对象 location对象 location.href 获取URL location.href="URL" // 跳转到指定页面 location.reload() 重新加载 ...
- 百万年薪python之路 -- 基础数据类型的补充练习
1.看代码写结果 v1 = [1,2,3,4,5] v2 = [v1,v1,v1] v1.append(6) print(v1) print(v2) [1,2,3,4,5,6] [[1,2,3,4,5 ...
- JAVA aio简单使用
使用aio,实现客户端和服务器 对一个数进行轮流累加 //服务器端 public class Server { private static ExecutorService executorServi ...
- InitializingBean,spring 初始化bean
springframework的提供接口,InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的 ...
- Pandas文本数据处理
先初始化数据 import pandas as pd import numpy as np index = pd.Index(data=["Tom", "Bob" ...
