一、前言

面向对象就是一种组件化的设计思想。

面向对象特性

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

继承性:在已有的程序结构上继续扩充新的功能;

多态性:在某一个概念范围内的满足。

二、类与对象的定义和使用

2.1 定义类

使用 “ class 类名{}” 的语法结构完成:

  • Field(属性 / 成员 / 变量)
  • Method(方法 / 行为)

类的使用 —— 在主类中使用

2.2 定义对象

对象的定义有两种方法:

  • 声明并实例化对象

    类名称 对象名称 = new 类名称();

  • 分步完成

    类名称 对象名称 = null;

    对象名称 = new 类名称();

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

2.3 内存空间

两块内存空间的概念:

  • 堆内存:保存每一个对象的属性内容,需要使用关键字 new 才可以开辟,所有的堆内存空间是有地址的;
  • 栈内存:保存的是一块堆内存的地址。为了分析方便,可以简单的理解栈内存保存的是对象名字。

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

开辟了堆内存的对象称为实例化对象。那么如果使用了没有实例化的对象,如下所示:

Book bk = null;
bk.title = "Java 开发";

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

三、类与对象(对象引用分析)

3.1 引用数据的初步分析

在所有的引用分析里,最关键的是关键字 new,一定要注意的是,每一次 new 都是生成新的堆内存空间,所以如果你的代码里声明了两个对象,并且使用了关键字 new 为每个对象开辟了堆内存空间,那么一定是各自占有各自的堆内存空间,并且不会互相影响。

举例:声明两个对象

Book bookA = new Book();
Book bookB = new Book();
bookA.title = "Java 开发";
bookA.price = "89.8";
bookB.title = "JSP 开发";
bookB.price = "69.8";

引用类型的使用 —— 引用类型的传递举例

Book bookA = new Book();
bookA.title = "Java 开发";
bookA.price = "89.8";
Book bookB = bookA; // 这里就是引用传递。
bookB.price = "69.8";

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

3.2 垃圾

继续观察引用传递

Book bookA = new Book();
Book bookB = new Book();
bookA.title = "Java 开发";
bookA.price = "89.8";
bookB.title = "JSP 开发";
bookB.price = "69.8";
Book bookB = bookA; // 这里就是引用传递。
bookB.price = "100.1";

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

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

3.3 一段总结

1、声明对象指的是未开辟堆内存的对象,如果直接使用此对象会出现“NullPointerException”;

2、对象可以通过关键字 new 来进行堆内存空间的开辟,有了堆内存引用的对象才称为实例化对象;

3、堆内存保存的是对象所有属性的内容,而栈内存保存的是堆内存的地址数值(为简单理解才称栈内存保存的是对象名称);

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

四、封装性

4.1 封装的实现

所有在类中定义的属性都要使用 private 声明,这样属性只能在本类可以访问;如果属性要被外部的类访问,则要定义相应的 setter、getter 方法。

五、构造方法与匿名对象

5.1 构造方法的作用

Book book = new Book();

构造方法的核心作用:在类对象实例化的时候设置属性的内容。

在定义一个类的时候,可以为属性设置默认值,但是这个默认值只有在构造方法执行完成后才会设置。

class Book{
private String title = "Java 开发";
public Book(){}
}

本程序之中,只有在整个构造都完成之后,才会真正将 “Java 开发” 这个字符串的内容赋值给 title,在构造方法执行执行之前,title 都是其对应数据类型的默认值。

5.2 匿名对象的基本使用

没有栈指向的对象就称为匿名对象。

new Book("Java 开发",89.8).getInfo();

​ 但是匿名对象由于没有其他对象对其进行引用,所以只能使用一次,一次使用之后该对象就会成为垃圾,等待被回收。

5.3 一段总结

构造方法的定义要求:方法名称与类名称相同,无返回值声明;

构造方法是在类对象使用关键字 new 实例化的时候被默认调用的,不管代码如何改变,只要有 new 就一定需要构造方法;

一个类中至少会保留一个构造方法,如果没有明确定义,会自动的生成一个无参的什么都不做的默认构造方法;

构造方法的核心功能:在类对象实例化的时候为类中的属性初始化;

构造方法重载时只要求考虑参数类型和个数即可;

匿名对象只能使用1次。

六、示例

开发一个雇员的类。包含有雇员编号、姓名、职位、基本工资。

这种功能的类在开发之中称为简单 Java 类,因为这些类里面不会包含有过于复杂的程序逻辑。

对于简单 Java 类而言,现在给出它的第一种开发要求:

  • 类名称必须存在有意义,例如:Book、Employee;

  • 类之中所有的属性必须用 private 封装,封装后的属性必须提供 setter、getter;

  • 类之中可以提供任意多个构造方法,但是 必须保留有一个无参构造方法

  • 类之中不允许出现任何的输出语句,所有信息的输出必须交给被调用输出;

  • 类之中需要提供一个取得对象完整信息的方法,暂定为:getInfo,而且返回为String类型数据。

    class Employee{
    private int empId;
    private String name;
    private String job;
    private double salary; public Employee(){}
    public Employee(int id, String name, String job,double salary){
    this.empId = id;
    this.name = name;
    this.job = job;
    this.salary = salary;
    }
    public void setEmpNo(int id){
    this.empId = id;
    }
    public void setName(String name){
    this.name = name;
    }
    public void setJob(String job){
    this.job = job;
    }
    public void setSalary(double salary){
    this.salary = salary;
    }
    public int getEmpId(){return this.empId;}
    public String getName(){return this.name;}
    public String getJob(){return this.job;}
    public double getSalary(){return this.salary;} public String getInfo(){
    return "雇员编号: " + this.empId + "\\n" +
    "姓 名: " + this.name + "\\n" +
    "职 位: " + this.job + "\\n" +
    "薪 资: " + this.salary + "\\n";
    }
    }
  • 编写测试程序

    public class EmployeeTest{
    public static void main(String[] args){
    Employee emp = new Employee(456, "jinhua.chen", "test-devloper", 1000.0);
    emp.setJob("QA");
    System.out.println(emp.getInfo());
    }
    }

类中提供的所有 setter、getter 方法可能某些操作不会使用到,但是依然必须提供。所有的 setter 方法除了具备有设置属性的内容之外,也能修改属性的内容。

【1】java之类与对象的更多相关文章

  1. 深入Java虚拟机--判断对象存活状态

    程序计数器,虚拟机栈和本地方法栈 首先我们先来看下垃圾回收中不会管理到的内存区域,在Java虚拟机的运行时数据区我们可以看到,程序计数器,虚拟机栈,本地方法栈这三个地方是比较特别的.这个三个部分的特点 ...

  2. 浅谈Java中的对象和引用

    浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起 ...

  3. Java提高篇——对象克隆(复制)

    假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short, ...

  4. Java的常用对象①②

    Java的常用对象① Java的常用对象有很多,这里只对lang包中常用的Object,Date(Calendar,DateFormat,Math),System,Runtime进行介绍.㈠Objec ...

  5. 【译】Java中的对象序列化

    前言 好久没翻译simple java了,睡前来一篇. 译文链接: http://www.programcreek.com/2014/01/java-serialization/ 什么是对象序列化 在 ...

  6. JVM调优-Java中的对象

    Java对象的大小 基本数据的类型的大小是固定的,这里不做详细说明.对于非基本类型的Java对象,其大小就值得商榷. 在Java中,一个空Object对象的大小是8byte,这个大小只是保存堆中一个没 ...

  7. java中直接打印对象

    java中直接打印对象,会调用对象.toString()方法.如果没有重写toString()方法会输出"类名+@+hasCode"值,hasCode是一个十六进制数 //没有重写 ...

  8. 对Java“一切皆对象”的理念的理解

    在从HelloWorld到面向对象中,我们将int, float, double, boolean等称为基本类型(primitive type),也就是特殊的类.我们可以将一个整数理解称为一个int类 ...

  9. 如何使用java中的对象

    使用java中的对象,分2步: 1.创建一个对象: 2.使用对象的属性和方法. 见下面的示例代码: package com.imooc; //1.定义一个类 public class Telphone ...

  10. Java中String对象的不可变性

    首先看一个程序 package reverse; public class Reverse { public static void main(String[] args) { String c1=n ...

随机推荐

  1. 数据每三位增加一个逗号(即千分符) js

    使用  toLocaleString()  另一种使用场景

  2. VS2022 17.1.6在windows10下打开winform设计器报timed out while connecting to named pipe错误

    .net 6.0的项目,vs2022 17.1.6在windows10下打开winform设计器报timed out while connecting to named pipe错误,同样的项目在wi ...

  3. 【vite+pinia】

    vite 轻量快速热重载,开发环境中不需要打包操作,可以快速冷启动 按需编译,不需要等待整个应用编译完成 pinia 支持vue2和vue3,是vue专属的状态管理库,允许跨组件或者页面 共享状态 与 ...

  4. Unity 使整个UnityUI变成彩色的BUG

    最近接手了一个两年前的老项目,在这个项目里碰到一个BUG ,每次运行到这个场景的时候,整个Unity 的所有UI包括Unity界面都会变成彩色. 后来发现是因为物体丢失,代码修改Image里的图片颜色 ...

  5. js 监听 变量变化

    var o = {};setTimeout(function () { o.abb = '2';}, 4000);Object.defineProperties(o, { abb: { configu ...

  6. react lodash节流this找不到正确用法

    if (!this.throttleLoadDicom) { this.throttleLoadDicom = throttle(this.loadDicomFun, 800, { leading: ...

  7. 01爬取豆瓣网电影数据进行numpy的练习

    level 2:10.案例:编写爬虫爬取豆瓣电影排行榜(电影名称,评分),保存为csv文件 a.用numpy加载csv数据 b.把评分列转换成float64类型 c.计算电影的平均评分 d.求评分最高 ...

  8. NXOpen获取UFUN的tag

    #include <NXOpen/NXObject.hxx>#include <NXOpen/NXObjectManager.hxx> 1 NXObject* nXObject ...

  9. Log4net使用探究

    第一步: 通过Nuget package 搜索Apache Log4net安装 第二步: 在项目Global.asax文件中添加读取 配置文件 第三步: 编写Loghelper 文件 1 public ...

  10. 「DIARY」NOI2021 小结

    这篇就主要说一下个人感悟吧,虽然不是金牌选手,但还是希望多多少少能对后来者提供些帮助 1. 预备 省选到 NOI 的准备,就当讲讲故事. 省选考下来好像不是很行,本来退役记都写了一半了,结果发现省队最 ...