Java类的定义与类的实例化

类的定义

面向对象的程序设计中,类可以看作是我们自定义的数据类型,那么,如何能更加优美,更加高效地定义它就显得尤为重要。

类中的成员有很多,每一部分都是十分关键的,毕竟“面向对象”在Java学习中真的很重要,许许多多的Java开发者定义出来的类等待着我们去使用,加油!攻克它!

直接上代码:

package com.my.pac02;
/**
* @author Summerday
* @date 2019/11/26 21:40
*/
//类名和文件名一致,且包含main方法
public class CatTest{
//程序入口
public static void main(String[] args) {
//创建对象
Cat cat = new Cat();
//为对象的属性赋值
cat.name = "sink";
cat.isMale = true;
//通过对象调用方法
cat.sleep();
cat.jump();
cat.laughAt("Susan");
System.out.println(cat.isNotMale());
//打印引用变量的值
System.out.println(cat);
//创建一个新的引用变量并指向原先的对象
Cat otherCat = cat;
System.out.println(otherCat);
System.out.println(otherCat.name);//"sink"
//将cat和实际对象之间的引用消除
cat = null;
}
}
//定义一个Cat类
class Cat{
//构造方法
Cat() {
System.out.println("cat is cute.");
}
//成员变量
String name;
int age;
boolean isMale;
String color = "Blue";
//方法
void sleep(){
System.out.println(name+"is sleeping---");
}
public void jump() {
System.out.println(name+"is jumping---");
}
public void laughAt(String otherName)
{
System.out.println(name+"is laughing at "+otherName);
}
//返回boolean类型的方法
boolean isNotMale() {
return !isMale;
}
}

定义一个简单的类

[修饰符] class 类名
{
(零个到多个)构造器...
(零个到多个)成员变量(属性)...
(零个到多个)方法...
}
  • [修饰符]修饰类时可以是上面代码中的public,或者final,abstract,也可以省略不写,但不建议使用private和protected。参考:Java的外部类为什么不能使用private、protected进行修饰
  • 类名命名规范:要见名知义,意思是需要多个有意义的英文单词组成,每个单词首字母大写,规范这种东西,建议遵守!养成好习惯。
  • 上面三种成员(构造器,成员变量,方法)都可以定义零个或多个,但是都是零个就变成了空类,没啥意义。

定义一个成员变量

[修饰符] 类型 成员变量名 [=默认值];
//例如
boolean isMale;
String color = "Blue";
  • 成员变量包括实例变量和类变量static修饰的成员变量称作类变量,关于static之后再细讲。

定义一个方法

[修饰符] 返回值类型 方法名(形参列表)
{
零条到多条可执行语句组成的方法体...
}
//例如
void sleep(){
System.out.println(name+"is sleeping---");
}
public void jump() {
System.out.println(name+"is jumping---");
}
public void laughAt(String otherName)
{
System.out.println(name+"is laughing at "+otherName);
}
//返回boolean类型的方法
boolean isNotMale() {
return !isMale;
}

定义一个构造器

[修饰符] 构造器名 (形参列表)
{
(零条到多条可执行语句组成的构造器执行体...
}
//例如
//构造方法
Cat() {
System.out.println("cat is cute.");
}
  • 构造器用于构造类的实例,也就是创建某个类的对象时会自动调用构造方法,之后会讨论。
  • 构造器名一定要和类名相同!
  • 没有定义构造器的话,系统会提供默认的构造器。

设计类时的具体细节,接下来将会一一展开,还有未涉及到的内部类代码块部分,之后将会进行学习,暂且从这三个部分展开探究。

类的实例化

通过类构造属于该类对象的过程就叫做类的实例化。对象是具体存在的事物,也称作实例,可以调用类中定义的实例变量以及方法。(不考虑static修饰变量的情况下)

创建对象及使用对象:

//使用Cat类创建了Cat类型的对象
//并调用Cat类的构造器,返回Cat的实例,赋值给变量cat
Cat cat = new Cat();
//访问cat的实例变量name和isMale,并为他们赋值
cat.name = "sink";
cat.isMale = true;
//调用cat的方法
cat.sleep();
cat.jump();
cat.laughAt("Susan");
//输出isNotMale()方法的返回值
System.out.println(cat.isNotMale());
  • 如果访问权限允许的情况下(访问权限涉及到private等关键字,暂且不谈),类中定义的方法和成员变量都可以通过类或实例来调用。
  • 创建对象:类型 实例名 = new 类型(参数列表);例如:Cat cat = new Cat();
  • 调用类成员变量或方法:类.类变量或类.方法实例.实例变量或实例.方法,类变量涉及static关键字,也是暂且放一边,之后继续回顾。

    可以这么理解:定义类就是为了创建许许多多该类的实例,这些实例具有相同的特征。

创建对象的过程在内存中的表现

类是一种引用数据类型:也就是说,在栈内存里的引用变量并不是真正存储对象的成员变量,而是它的引用,实际的成员变量藏在堆内存中,这一点类似于前面提到过的数组类型。而且,可以知道,栈内存中存储的是实际对象在堆内存中的地址值,可以直接打印引用变量cat的值验证。

  • 创建对象
//创建对象,并初始化
Cat cat = new Cat();

  • 访问实例变量
//访问实例变量
cat.name = "sink";
cat.isMale = true;

Java不允许直接访问堆内存中的对象,只能通过该对象的引用操作该对象。

另外,堆内存中的同一个对象可以由栈内存中多个引用变量所指向。例如:

//把引用变量cat赋值给另一个引用变量otherCat
Cat otherCat = cat;

这时,cat和otherCat都在栈内存中被创建,且他们都指向了原先cat所指向的那块堆内存,所以他们操作的是同一个实际对象。

堆内存的对象没有任何变量指向时,就会在一段时间内作为“垃圾”被Java的垃圾回收机制回收,释放对象所占用的内存区。

所以想让他提前释放,直接给引用变量赋值为null。

参考书籍:《疯狂Java讲义》

Java类的定义与类的实例化的更多相关文章

  1. 关于PHP面向对象中—类的定义与对象的实例化操作以及构造、析构函数的特殊用法

    类的定义与对象的实例化操作 <?php //类里面的成员是属于对象的class Hero{    public $name;//成员变量    //成员属性(存在于强类型语言中)    prot ...

  2. Java初学者作业——编写 Java 程序,定义 Employee 类以及 HR 类,实现 HR 为 Employee 加薪的功能。

    返回本章节 返回作业目录 需求说明: 编写 Java 程序,定义 Employee 类以及 HR 类,实现 HR 为 Employee 加薪的功能. 实现思路: 定义 Employee 类,并定义属性 ...

  3. JAVA nio 2 定义 Path 类

    一旦确认了文件系统上的一个文件或目录,那么就可以定义一个 Path 类来指向它.定义 Path 类可以使用绝对路径.相对路径.路径中带有一个点号“.”(表示当前目录).路径中带有两个点“..”(表示上 ...

  4. Java初学者作业——定义客户类(Customer),客户类的属性包括:姓名、年龄、电话、余额、账号和密码;方法包括:付款。

    返回本章节 返回作业目录 需求说明: 定义客户类(Customer),客户类的属性包括:姓名.年龄.电话.余额.账号和密码:方法包括:付款. 实现思路: 定义 Customer 类,并添加姓名.余额. ...

  5. 编写Java程序,定义士兵类(Soldiers)并初始化5个士兵对象。

    返回本章节 返回作业目录 需求说明: 创建士兵类(Soldiers),定义有一个String类型参数name,代表士兵的姓名,两个int类型变量x和y,分别表示士兵所在的坐标位置,x代表横坐标,y代表 ...

  6. Java初学者作业——定义英雄类(Hero),英雄类中的属性包括:姓名、攻击力、防御力、生命值和魔法值;方法包括:攻击、介绍。

    返回本章节 返回作业目录 需求说明: 定义英雄类(Hero),英雄类中的属性包括:姓名.攻击力.防御力.生命值和魔法值:方法包括:攻击.介绍. 实现思路: 分析类的属性及其变量类型. 分析类的方法及其 ...

  7. Java初学者作业——定义管理员类(Admin),管理员类中的属性包括:姓名、账号、密码、电话;方法包括:登录、显示自己的信息。

    返回本章节 返回作业目录 需求说明: 定义管理员类(Admin),管理员类中的属性包括:姓名.账号.密码.电话:方法包括:登录.显示自己的信息. 实现思路: 分析类的属性及其变量类型. 分析类的方法及 ...

  8. 虚基类——(1)定义人员类Person: 公有成员:姓名(Name); 保护成员:性别(Gender),年龄(Age); 构造函数和析构函数

    题目描述: (1)定义人员类Person: 公有成员:姓名(Name): 保护成员:性别(Gender),年龄(Age): 构造函数和析构函数 (2) 从人员类Person派生学生记录类Student ...

  9. 【BigData】Java基础_定义工具类,对ArrayList排序并且求最大值、最小值、平均值

    需求描述 编写一个工具类,对ArrayList实现以下功能: ① 排序 ② 求最大值 ③ 求最小值 ④ 求平均值 需求实现 实现代码 package cn.test.logan.day04; impo ...

随机推荐

  1. 解析 Microsoft.Extensions.DependencyInjection 2.x 版本实现

    项目使用了 Microsoft.Extensions.DependencyInjection 2.x 版本,遇到第2次请求时非常高的内存占用情况,于是作了调查,本文对 3.0 版本仍然适用. 先说结论 ...

  2. JVM(6) 字节码执行引擎

    编译器(javac)将Java源文件(.java文件)编译成Java字节码(.class文件). 类加载器负责加载编译后的字节码,并加载到运行时数据区(Runtime Data Area) 通过类加载 ...

  3. fenby C语言 P13

    开关语句switch(变量) switch(weekday) ↓ 数字 default:异常处理 case-break #include <stdio.h> int main() { in ...

  4. Https 与 iOS 信息安全

    转载自:swift-cafe 什么是 Https 咱们从最直观的说起. 我们平时在用电脑访问网页的时候,有时候会在地址栏的左边多出一个小锁的图标,就像这样: 这是大多数主流浏览器的一个通用做法,当我们 ...

  5. 面经-VIVO

    面试时间:2019.09.26 现场面试 面试岗位:广告推荐算法工程师/一面/正式批 面试时长:50Min 面试内容: 自我介绍 阶乘与阶乘和(复杂度高) 文本-视频论文讲解 视频排序讲解 概率题(2 ...

  6. C++学习笔记7_多态

    1. 类与类之间的关系class A{ public: int a; void funcA() {}}包含: class B { public: void funcB(){} A a; }//如果类B ...

  7. MIT线性代数:16.投影矩阵和最小二乘

  8. CSS(5)---通俗讲解盒子模型

    CSS(5)---盒子模型 盒子模型四个关键字:内容(content).填充(padding).边框(border).边界(margin), CSS盒子模式都具备这些属性. 一.概念 1. 概念 盒子 ...

  9. Mybaits 源码解析 (十)----- 全网最详细,没有之一:Spring-Mybatis框架使用与源码解析

    在前面几篇文章中我们主要分析了Mybatis的单独使用,在实际在常规项目开发中,大部分都会使用mybatis与Spring结合起来使用,毕竟现在不用Spring开发的项目实在太少了.本篇文章便来介绍下 ...

  10. js内容溢出用省略号(...)表示

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