📓
Be a Javaer
  • Introduction
  • 第 1 章 Java编程开发入门
    • 第 1 节 Java开发准备
    • 第 2 节 Java基本概念
    • 第 3 节 Java数据类型划分
    • 第 4 节 Java运算符
    • 第 5 节 Java程序逻辑控制
    • 第 6 节 Java方法的定义及使用
  • 第 2 章 Java面向对象编程
    • 第 1 节 类与对象
    • 第 2 节 深入分析类与对象
    • 第 3 节 数组的定义与使用
    • 第 4 节 String类的基本概念
    • 第 5 节 String类的常用方法
    • 第 6 节 this关键字
    • 第 7 节 引用传递
    • 第 8 节 数据表与简单Java类映射
    • 第 9 节 对象比较
    • 第 10 节 static关键字
    • 第 11 节 代码块
    • 第 12 节 内部类
    • 第 13 节 链表的定义与使用
    • 第 14 节 继承性
    • 第 15 节 覆写
    • 第 16 节 数组操作
    • 第 17 节 辅助概念
      • final关键字
      • 多态性
    • 第 18 节 抽象类的定义及使用
    • 第 19 节 接口的定义及使用
    • 第 20 节 Object类
    • 第 21 节 拓展概念
      • 匿名内部类
      • 包装类
    • 第 22 节 包的定义及使用
    • 第 23 节 访问控制权限
      • 单例设计模式
      • 多例设计模式
    • 第 24 节 异常的捕获及处理
    • 第 25 节 Java5新特性
      • 可变参数
      • foreach循环
      • 静态导入
    • 第 26 节 泛型
    • 第 27 节 枚举
    • 第 28 节 Annotation
    • 第 29 节 Java7新特性
      • AutoCloseable
      • Try-with-resources
    • 第 30 节 Java8新特性
      • 接口定义增强
      • Lambda表达式
      • 方法引用
      • 函数式接口
  • 第 3 章 Java高级编程
    • 第 1 节 Java多线程基础实现
    • 第 2 节 线程常用操作方法
    • 第 3 节 线程的同步与死锁
    • 第 4 节 生产者与消费者
    • 第 5 节 Java基础类库
      • StringBuffer
      • Runtime
      • System
      • finalize
      • Cleaner
      • 对象克隆
    • 第 6 节 数字操作类
      • Math类
      • Random类
      • 大数字操作类
    • 第 7 节 日期处理类
      • Date类
      • 日期格式化
      • Calendar类
    • 第 8 节 比较器
    • 第 9 节 正则表达式
      • 常用的正则标记
      • String类对正则的支持
      • java.util.regex包支持
    • 第 10 节 反射机制
    • 第 11 节 动态代理
    • 第 12 节 反射与Annotation
    • 第 13 节 国际化程序实现
    • 第 14 节 开发支持类库
      • Arrays类
      • UUID类
      • Optional类
      • ThreadLocal类
      • 定时器
      • Base64加密工具
    • 第 15 节 文件操作
    • 第 16 节 字节流与字符流
    • 第 17 节 IO辅助概念
      • 字符编码
      • 内存流
      • 管道流
      • RandomAccessFile
    • 第 18 节 打印流
    • 第 19 节 System类对IO的支持
    • 第 20 节 对象序列化
    • 第 21 节 IO高级应用
      • 缓冲输入流
      • Scanner
    • 第 22 节 网络编程
    • 第 23 节 类集框架
    • 第 24 节 List集合
    • 第 25 节 集合输出
    • 第 26 节 Map集合
    • 第 27 节 Set集合
    • 第 28 节 集合工具类
      • Stack
      • Queue
      • Properties
      • Collections工具类
    • 第 29 节 数据流Stream
    • 第 30 节 JDBC简介
    • 第 31 节 Statement接口
    • 第 32 节 PreparedStatment接口
    • 第 33 节 批处理与事务处理
  • 第 4 章 Oracle数据库基础
    • 第 1 节 Oracle简介
    • 第 2 节 Oracle安装与配置
    • 第 3 节 SQLPlus命令
    • 第 4 节 SQL简介与数据表分析
    • 第 5 节 SQL简单查询
    • 第 6 节 SQL限定查询
    • 第 7 节 查询排序
    • 第 8 节 综合练习:基础查询
    • 第 9 节 单行函数
    • 第 10 节 多表查询
    • 第 11 节 分组统计查询
    • 第 12 节 子查询
    • 第 13 节 综合案例:复杂查询
    • 第 14 节 数据更新操作
    • 第 15 节 事务处理
    • 第 16 节 数据伪列
    • 第 17 节 数据表的创建与管理
    • 第 18 节 约束的创建与管理
    • 第 19 节 综合案例:数据表操作
    • 第 20 节 序列的定义与使用
  • 第 5 章 JavaWeb基础
  • 第 6 章 走向单体地狱
  • 第 7 章 GitFlow工作流指南
    • 版本控制
    • Git
    • 集中式工作流
    • 功能分支工作流
    • GitFlow 工作流
    • Forking 工作流
    • Pull Requests
  • 第 8 章 微服务入门
    • 第 1 节 微服务简介
    • 第 2 节 Linux
    • 第 3 节 Docker
    • Docker 仓库
    • Ubuntu 安装 Docker
    • Docker 镜像加速器
    • 第 4 节 Docker Compose
    • 第 5 节 GitLab
    • 第 6 节 Nexus
    • 第 7 节 Harbor
  • 第 9 章 再谈微服务
  • 第 10 章 Spring Boot
  • 第 11 章 Spring Cloud Netflix
  • 第 12 章 Apache Dubbo Zookeeper
  • 第 13 章 Spring Cloud Alibaba
  • 第 14 章 Vue
  • 第 15 章 Kubernetes
  • 第 16 章 Spring Security oAuth2
  • 第 17 章 Flutter
  • Redis
    • Redis 入门
    • Redis 的数据类型
    • Redis 事务
    • Jedis
    • Spring Boot 整合 Redis
    • Redis 配置文件
    • Redis 持久化
    • Redis 发布/订阅
    • Redis 主从复制
    • Redis Sentinel
    • Redis 缓存故障
  • Glossary
由 GitBook 提供支持
在本页
  • 认识类与对象
  • 类与对象的基本定义
  • 引用数据的初步分析
  • 总结

这有帮助吗?

  1. 第 2 章 Java面向对象编程

第 1 节 类与对象


面向过程:指的是针对某一个问题单独提出解决方案以及代码开发。

面向对象:以一种组件化的形式进行代码的设计,这样开发出来的代码最大的好处就是可以重用。

在面向对象的程序里面包含有如下的几个特征:

  • 封装性:保护内部的定义结构安全性;

  • 继承性:在已有的程序结构上继续扩充新的内容;

  • 多态性:指的是在某一个概念范围上的满足

而对于面向对象开发分为三个步骤:OOA(Object-Oriented Analysis,面向对象分析)、OOD(Object-Oriented Design,面向对象设计)、OOP(Object Oriented Programming,面向对象编程)。

认识类与对象

类与对象是整个面向过程之中最为基础的组成单元,所有的类实际上都是用来描述对象的结构,例如:每一个人的姓名、年龄、身高等一系列的因素。某一类的共性的集合对象,除了具备以上的特征(属性)之外,实际上还包括许多的行为(功能),所有根据此类产生出的对象都具备有相同的行为。对象所能够操作的行为都是由类类决定的,超过类的范畴的操作是不能够使用的。

类实际上是对象操作的模板,但是类不能够直接使用,必须通过实例对象来使用。

类与对象的基本定义

如果要在程序之中定义类可以使用“ class 类名称 {} ”的语法结构完成, 而类之中的组成主要有两点:

  • FIeld(属性、变量、成员),就是一堆变量的集合;

  • Method(方法、行为),之前见到的方法,但是此处的方法是由对象调用的。

范例: 定义类

class Book { //定义一个新的类
    String title; //书的名字
    double price; //书的价格
    public void getInfo() { //此方法将由对象调用
        System.out.println("图书名称:" + title + ",价格:" + price);
    }
}

类现在虽然已经诞生了,但是如果要想使用类必须要有对象,对象的定义格式有如下两种:

  • 声明并实例化对象:类名称 对象名称 = new 类名称();

  • 分步完成:

    • 声明对象:类名称 对象名称 = null;

    • 实例化对象:对象名称 = new 类名称();

引用数据类型与基本数据类型最大的不同在于需要内存的开辟及使用,所以new关键字的主要功能就是开辟内存空间,即:只要是引用数据类型想使用,就必须使用new来开辟内存空间。

当一个对象实例化之后就可以使用如下的方式利用对象来操作类 结构:

  • 对象.属性:表示要操作类中的属性内容;

  • 对象.方法():表示要调用类中的方法。

范例: 使用类 —— 在主类中使用Book类

class Book { //定义一个新的类
    String title; //书的名字
    double price; //书的价格
    public void getInfo() { //此方法将由对象调用
        System.out.println("图书名称:" + title + ",价格:" + price);
    }
}
public class MainClass {
    public static void main(String[] args) {
        Book bk = new Book();    //声明并实例化对象
        bk.title = "Java基础入门";    //操作属性内容
        bk.price = 89.9;        //操作属性内容
        bk.getInfo();            //调用类中的getInfo()方法
    }
}

如果想要对以上的程序进行内存分析,可以首先给出两块内存空间的概念:

  • 堆内存:保存每一个对象的属性内容,对内存需要用关键字new才可以开辟;

  • 栈内存:保存的是一块堆内存的地址,但是为了方便分析,可以简单地理解栈内存保存的是对象名字;

对象除了可以利用一行语句定义之外,也可以分步完成。

范例: 分步的方式实例化对象

class Book { //定义一个新的类
    String title; //书的名字
    double price; //书的价格
    public void getInfo() { //此方法将由对象调用
        System.out.println("图书名称:" + title + ",价格:" + price);
    }
}
public class MainClass {
    public static void main(String[] args) {
        Book bk = null;            //声明对象
        bk = new Book();        //实例化对象(开辟堆内存)
        bk.title = "Java基础入门";    //操作属性内容
        bk.price = 89.9;        //操作属性内容
        bk.getInfo();            //调用类中的getInfo()方法
    }
}

任何情况下只要有关键字new,都表示要开辟新的堆内存空间,一旦堆内存空间开辟了,里面就一定会有有所有类重定义的属性内容,当然所有的属性诶荣都是其对应数据类型的默认值。

以上的代码是分为两步的方式实现了对象的实例化(开辟了堆内存的对象称为实例化对象),若果使用了没有实例化的对象。

class Book { //定义一个新的类
    String title; //书的名字
    double price; //书的价格
    public void getInfo() { //此方法将由对象调用
        System.out.println("图书名称:" + title + ",价格:" + price);
    }
}
public class MainClass {
    public static void main(String[] args) {
        Book bk = null;            //声明对象
        bk.title = "Java基础入门";    //操作属性内容
        bk.price = 89.9;        //操作属性内容
        bk.getInfo();            //调用类中的getInfo()方法
    }
}

此时由于使用了没有实例化的Book类实例对象,所以程序在运行的时候出现了“ NullPointerException ”(空指针异常),此类异常只要是引用数据类型都有可能出现。

引用数据的初步分析

引用是整个Java开发之中的核心精髓所在,即:只有掌握了引用这一基础概念之后才可以继续向后面的课程深入学习。引用类似于C/C++中的指针概念,但是要比指针更加简单。

在所有的引用分析里面,最关键的还是在于关键字“ new ”,一定要注意的是,每一次使用关键字new都一定会开辟新的堆内存空间,所以如果代码中声明了两个对象,并且使用了关键字new为两个对象分别进行对象的实例化操作,那么一定是各自占有各自的堆内存空间,并且不会相互影响。

范例: 声明两个对象

class Book { //定义一个新的类
    String title; //书的名字
    double price; //书的价格
    public void getInfo() { //此方法将由对象调用
        System.out.println("图书名称:" + title + ",价格:" + price);
    }
}
public class MainClass {
    public static void main(String[] args) {
        Book bookA = new Book();
        Book bookB = new Book();
        bookA.title = "Java基础入门";
        bookA.price = 89.9;
        bookB.title = "操作系统";
        bookB.price = 58.8;
        bookA.getInfo();
        bookB.getInfo();
    }
}

范例: 对象引用传递

class Book { //定义一个新的类
    String title; //书的名字
    double price; //书的价格
    public void getInfo() { //此方法将由对象调用
        System.out.println("图书名称:" + title + ",价格:" + price);
    }
}
public class MainClass {
    public static void main(String[] args) {
        Book bookA = new Book();    //声明并实例化对象
        Book bookB = null;            //声明对象
        bookA.title = "Java基础入门";
        bookA.price = 89.9;
        bookB = bookA;                //引用传递
        bookB.price = 58.8;
        bookA.getInfo();
        bookB.getInfo();
    }
}

严格来讲bookA和bookB里面保存的是对象的地址信息,所以以上的引用过程就属于将bookA的地址给了bookB。

由于此时两个对象指向的是同一块堆内存空间,所以任何一个对象修改了堆内存中的数据后,都会影响到其他对象在引用的操作过程中,一块堆内存可以同时被多个栈内存所指向,但是一块栈内存只能保存一块堆内存空间的地址。

范例: 继续观察引用传递

class Book { //定义一个新的类
    String title; //书的名字
    double price; //书的价格
    public void getInfo() { //此方法将由对象调用
        System.out.println("图书名称:" + title + ",价格:" + price);
    }
}
public class MainClass {
    public static void main(String[] args) {
        Book bookA = new Book();    //声明并实例化对象
        Book bookB = null;            //声明对象
        bookA.title = "Java基础入门";
        bookA.price = 89.9;
        bookB.title = "操作系统";
        bookB.price = 58.8;
        bookB = bookA;                //引用传递
        bookB.price = 108.8;
        bookA.getInfo();
        bookB.getInfo();
    }
}

通过内存的分析可以发现,在引用数据类型关系里面,一块没有任何栈内存指向的堆内存空间就将成为垃圾,所有的垃圾会不定期的被垃圾收集器(GC)进行回收,回收后会释放掉其所占用的空间。

虽然在Java里面支持了自动的垃圾收集处理,但是在代码的开发过程之中应该尽量的减少垃圾空间的产生。

总结

1、类描述的是公共特征,类必须通过对象才可以使用;

2、声明对象指的是未开辟堆内存的对象,如果直接使用此对象会出现“NullPointerException”异常;对象可以通过关键字new来进行堆内存空间的开辟,有了堆内存引用的对象才称为实例化对象;

3、堆内存保存的是对象中所有属性的内容,而栈内存保存的是堆内存的地址数值;

4、垃圾空间指的是没有任何栈内存指向的堆内存空间,会被GC不定期进行回收。

上一页第 2 章 Java面向对象编程下一页第 2 节 深入分析类与对象

最后更新于5年前

这有帮助吗?

这个时候给出的代码,是声明并实例化对象,用一行语句完成的,观察引用类型的使用。