Java类的定义与类的实例化

类的定义

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

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

直接上代码:

  1. package com.my.pac02;
  2. /**
  3. * @author Summerday
  4. * @date 2019/11/26 21:40
  5. */
  6. //类名和文件名一致,且包含main方法
  7. public class CatTest{
  8. //程序入口
  9. public static void main(String[] args) {
  10. //创建对象
  11. Cat cat = new Cat();
  12. //为对象的属性赋值
  13. cat.name = "sink";
  14. cat.isMale = true;
  15. //通过对象调用方法
  16. cat.sleep();
  17. cat.jump();
  18. cat.laughAt("Susan");
  19. System.out.println(cat.isNotMale());
  20. //打印引用变量的值
  21. System.out.println(cat);
  22. //创建一个新的引用变量并指向原先的对象
  23. Cat otherCat = cat;
  24. System.out.println(otherCat);
  25. System.out.println(otherCat.name);//"sink"
  26. //将cat和实际对象之间的引用消除
  27. cat = null;
  28. }
  29. }
  30. //定义一个Cat类
  31. class Cat{
  32. //构造方法
  33. Cat() {
  34. System.out.println("cat is cute.");
  35. }
  36. //成员变量
  37. String name;
  38. int age;
  39. boolean isMale;
  40. String color = "Blue";
  41. //方法
  42. void sleep(){
  43. System.out.println(name+"is sleeping---");
  44. }
  45. public void jump() {
  46. System.out.println(name+"is jumping---");
  47. }
  48. public void laughAt(String otherName)
  49. {
  50. System.out.println(name+"is laughing at "+otherName);
  51. }
  52. //返回boolean类型的方法
  53. boolean isNotMale() {
  54. return !isMale;
  55. }
  56. }

定义一个简单的类

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

定义一个成员变量

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

定义一个方法

  1. [修饰符] 返回值类型 方法名(形参列表)
  2. {
  3. 零条到多条可执行语句组成的方法体...
  4. }
  5. //例如
  6. void sleep(){
  7. System.out.println(name+"is sleeping---");
  8. }
  9. public void jump() {
  10. System.out.println(name+"is jumping---");
  11. }
  12. public void laughAt(String otherName)
  13. {
  14. System.out.println(name+"is laughing at "+otherName);
  15. }
  16. //返回boolean类型的方法
  17. boolean isNotMale() {
  18. return !isMale;
  19. }

定义一个构造器

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

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

类的实例化

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

创建对象及使用对象:

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

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

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

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

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

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

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

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

  1. //把引用变量cat赋值给另一个引用变量otherCat
  2. 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. 深入全面探究有未经处理的异常: 0xC00000FD: Stack overflow(栈溢出)问题!

    这两天一直遇到标题上的问题,我相信很多朋友在执行代码的时候都会遇到这样的问题,我在网上也找了很多的资料解决这个问题,虽然有些方法能解决,但是总觉得总结的不是很全面,这里我自己在相对全面的总结一下,如果 ...

  2. Java11新特性 - Epsilon GC和ZGC

    Java11中新增了两个GC,Epsilon GC和ZGC. Epsilon垃圾收集器 A NoOp Garbage Collector 没有操作的垃圾收集器 JDK上对这个特性的描述是:开发一个处理 ...

  3. fenby C语言 P16

    while先判断,不符合,不执行 dowhile后判断,不符合,执行一次 #include <stdio.h> int main(){ int i=1,sum=0; do{ sum=sum ...

  4. leetcode系列---3Sum C#code

    Function: public static List<int[]> SumSet(int[] array) { List<int[]> result = new List& ...

  5. 数据存储之关系型数据库存储---MySQL存储

    MySQL的存储 利用PyMySQL连接MySQL 连接数据库 import pymysql # 连接MySQL MySQL在本地运行 用户名为root 密码为123456 默认端口3306 db = ...

  6. C/C++ return *this和return this的区别

    首先我们知道~ class Test { public: Test() { return this; //返回的当前对象的地址 } Test&() { return *this; //返回的是 ...

  7. CSPS模拟 62

    婚礼现场系列 T1 $gragh$ 为了方便把边的贡献下放到点,跑一个生成树作为划分依据. T2 $permutation$ 由于在本题中,构造的变换方法保证只能邻项交换 所以如果位置串字典序变小,权 ...

  8. 测试面试题集-测试用例设计:登录、购物车、QQ收藏表情、转账、充值、提现

    以下内容首发于微信公众号[ITester软件测试小栈]: 测试面试题集-2.测试用例设计 大家好 我是coco小锦鲤 上周五给大家分享了测试基础理论题 这个周五给大家分享测试用例设计题 测试用例的考察 ...

  9. 记录一些html5和css3的一部分属性

    html5 标签1 video:视频 属性: src:视频的url autoplay:视频在就绪后马上播放 controls:向用户显示控件2 audio:音频 属性类似于video3 属性:drag ...

  10. 如何在Vue中,当鼠标hover上元素时,给元素加遮罩层

    介绍 当鼠标hover 上元素时,给元素加一层遮罩层. 效果图 使用 import VueHoverMask from 'vue-hover-mask' export default { compon ...