类和对象的概念

类的定义

类是一种用户自定义的数据类型,它是创建对象的蓝图,定义了一组属性(称为“字段”)和方法(称为“函数”)。类是面向对象编程的基本构建块,它封装了数据和行为。

在 Java 中编写一个类需要遵循一定的结构和语法规则。以下是一个基本的 Java 类的结构示例以及它所包含的部分:

// 包声明,用于组织类
package com.example; // 导入语句,用于导入其他包中的类或接口
import java.util.List; // 类的声明,关键字 class 后跟类名
public class MyClass {
// 类的属性(成员变量)
private int id;
private String name; // 类的构造函数
public MyClass(int id, String name) {
this.id = id;
this.name = name;
} // 类的方法
public void displayInfo() {
System.out.println("ID: " + id + ", Name: " + name);
} // getter 和 setter 方法
public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} // 类可以包含其他方法、内部类、枚举、注解等 // 主方法(如果类是一个应用程序的入口)
public static void main(String[] args) {
// 创建 MyClass 的实例
MyClass myObject = new MyClass(1, "Example"); // 调用方法
myObject.displayInfo();
}
}

写一个类要包含以下部分(类的结构):

  1. 包声明(Package Declaration)

    • 使用 package 关键字声明,用于组织类和接口。
  2. 导入语句(Import Statements)

    • 使用 import 关键字导入其他包中的类或接口。
  3. 类声明(Class Declaration)

    • 使用 class 关键字后跟类名。
  4. 访问修饰符(Access Modifiers)

    • public, protected, private 等,定义类或类的成员的可见性。
  5. 类属性(Class Fields)

    • 定义类的成员变量,可以是任何数据类型。
  6. 构造函数(Constructor)

    • 类的构造函数用于创建类的实例。
  7. 方法(Methods)

    • 类的行为通过方法实现,可以包含业务逻辑。
  8. getter 和 setter 方法(Accessors and Mutators)

    • 提供访问和更新类属性的方式。
  9. 主方法(Main Method)(如果类是应用程序的入口):

    • 使用 public static void main(String[] args) 作为程序的入口点。
  10. 文档注释(Documentation Comments)

    • 使用 /** ... */ 为类和方法提供文档注释。
  11. 代码注释(Code Comments)

    • 使用 ///* ... */ 为代码添加注释,提高代码可读性。
  12. 异常处理(Exception Handling)

    • 使用 try, catch, finally, throw, throws 等关键字进行异常处理。
  13. 内部类(Inner Classes)

    • 如果需要,类可以包含内部类定义。
  14. 枚举(Enums)注解(Annotations)

    • 类内部可以定义枚举类型和使用注解。

编写类时,应确保遵循良好的编程实践,如使用有意义的命名、保持方法的单一职责、确保代码的可读性和可维护性。

对象的创建

对象是类的实例,它是类的具体化。对象具有类定义的属性(字段)和方法(函数),并且可以访问和修改这些属性。通过“new”关键字创建对象。

成员变量(属性)

成员变量是类的属性,它们可以是静态变量(静态成员变量)或非静态变量(非静态成员变量)。

/*类的定义和对象的创建*/
// 类的定义
public class MyClass {
// 成员变量
private int myVar;
// 构造器(无参)
public MyClass() {
this.myVar = 0;
} // 构造器(有参)
public MyClass(int var) {
this.myVar = var;
} // 成员方法
public int getMyVar() {
return myVar;
} public void setMyVar(int var) {
this.myVar = var;
}
}
// 对象的创建(无参)
MyClass obj1 = new MyClass(); // 对象的创建(有参)
MyClass obj2 = new MyClass(10);
  • 静态变量:静态变量属于类,而不是特定的对象。它们在类加载时创建,而不是在创建对象时创建。静态变量可以使用类名直接访问。

  • 非静态变量:非静态变量属于类的实例,而不是类。它们在创建对象时创建,而不是在类加载时创建。要访问非静态变量,需要创建类的实例并使用实例名访问。

    // 类的定义
    public class MyClass {
    // 静态变量
    private static int staticVar;
    // 非静态变量
    private int nonStaticVar; // 构造器
    public MyClass(int var) {
    this.nonStaticVar = var;
    } // 静态方法(获取静态变量)
    public static int getStaticVar() {
    return staticVar;
    } // 静态方法(设置静态变量)
    public static void setStaticVar(int var) {
    staticVar = var;
    } // 非静态方法(获取非静态变量)
    public int getNonStaticVar() {
    return nonStaticVar;
    } // 非静态方法(设置非静态变量)
    public void setNonStaticVar(int var) {
    this.nonStaticVar = var;
    }
    } // 访问静态变量
    int staticVarValue = MyClass.getStaticVar(); // 访问非静态变量
    MyClass obj = new MyClass(10);
    int nonStaticVarValue = obj.getNonStaticVar();

成员方法(函数、方法)

成员方法是类的函数,它们可以静态方法(静态成员方法)或非静态方法(非静态成员方法)。

  • 静态方法:静态方法属于类,而不是特定的对象。它们可以直接使用类名调用,而不需要创建类的实例。静态方法通常用于操作静态变量或执行与对象无关的操作。

  • 非静态方法:非静态方法属于类的实例,而不是类。要调用非静态方法,需要创建类的实例并使用实例名调用。非静态方法通常用于操作对象的属性和执行与对象相关的操作。

    // 类的定义
    public class MyClass {
    // 静态方法
    public static void staticMethod() {
    System.out.println("This is a static method.");
    } // 非静态方法
    public void nonStaticMethod() {
    System.out.println("This is a non-static method.");
    } } // 调用静态方法
    MyClass.staticMethod(); // 创建对象
    MyClass obj = new MyClass(); // 调用非静态方法
    obj.nonStaticMethod();

对象的实例化

构造器

构造器是一种特殊的方法,用于在创建对象时初始化对象。构造器的名称与类名相同,没有返回类型,并且通常包含对成员变量的初始化。

构造器的使用

使用“new”关键字创建对象,并在括号中传递参数(如果有)。例如:

MyClass obj = new MyClass(param1, param2);

构造器重载

构造器重载是指在同一个类中定义多个构造器,每个构造器具有不同的参数列表。这允许创建具有不同初始状态的对象。

构造器链(Constructor Chaining)

  • 构造器可以通过this()调用同一类中的另一个构造器,这称为构造器链。
  • this()调用必须是构造器中的第一条语句。

私有构造器

  • 构造器可以是私有的(private),这意味着它不能被外部类直接访问。

  • 私有构造器常用于单例模式(Singleton Pattern)或枚举类型(Enums)

  • 示例

    public class Person {
    private String name;
    private int age; // 无参构造器
    public Person() {
    this.name = "Unknown";
    this.age = 0;
    } // 带参数的构造器
    public Person(String name, int age) {
    this.name = name;
    this.age = age;
    } // 构造器链
    public Person(String name) {
    this(name, 0); // 调用带两个参数的构造器
    }
    }
    • 构造器用于初始化对象的状态。
    • 构造器名称必须与类名相同,并且没有返回类型。
    • 可以通过构造器重载提供多种对象初始化方式。
    • 默认情况下,如果没有显式定义构造器,Java会提供一个默认无参构造器。
    • 构造器可以通过this()实现链式调用。
    • 构造器可以是私有的,用于控制对象的创建

匿名对象

匿名对象是不具有名称的对象,它们通常用于一次性使用。例如,当传递一个对象作为参数,但不需要该对象在其他地方使用时,可以使用匿名对象。例如:

someFunction(new MyClass(param1, param2));
如何识别匿名对象

要识别一个对象是否是匿名对象,可以查看代码中是否有类似以下的语法结构:

new ClassName().methodName(); //第一种方式
new ClassName().fieldName; //第二种方式

这里,ClassName是类名,methodName是方法名,fieldName是字段名。这种语法表示创建了一个ClassName的实例,并且立即调用了其上的方法或访问了其上的字段,而没有将这个实例赋给任何变量。

示例

假设有一个Person类,其中有一个方法sayHello

public class Person {
public void sayHello() {
System.out.println("Hello, I am an anonymous object.");
}
}

以下是如何使用匿名对象调用sayHello方法的示例:

new Person().sayHello(); // 创建一个Person的匿名对象,并调用其sayHello方法

注意

  • 匿名对象因为没有引用名称,所以只能使用一次。一旦完成了对其方法或属性的访问,就无法再次使用这个对象。
  • 匿名对象适用于轻量级操作,尤其是当对象的创建成本不高,并且确信不需要多次复用这个对象时。

总结

  • 匿名对象是没有被显式赋给变量的对象。
  • 可以通过检查代码中是否有new ClassName().methodName()new ClassName().fieldName的语法结构来识别匿名对象。
  • 匿名对象特别适合于一次性使用场景。

Java中对象的销毁

在Java中,当一个对象不再被引用时,它将被垃圾回收器(GC)销毁。垃圾回收器会自动检测不再使用的对象,并释放其内存。

总结

类是一种用户自定义的数据类型,用于创建具有属性和行为的对象。对象是类的实例,它们具有类定义的属性和方法。成员变量是类的属性,可以是静态变量或非静态变量。成员方法是类的函数,可以是静态方法或非静态方法。

对象通过构造器进行实例化,构造器用于初始化对象的属性。可以对构造器进行重载以创建具有不同初始状态的对象。在Java中,当一个对象不再被引用时,它将被垃圾回收器销毁。

匿名对象是不具有名称的对象,它们通常用于一次性使用。

JavaSE-类和对象的更多相关文章

  1. JavaSE——面向对象与面向过程、类与对象、(属性、方法、构造器)等

    一:面向对象与面向过程 二者都是一种思想,面向对象是相对于面向过程而言的. 面向过程: 1.面向过程思想强调的是过程(动作). 2.在面向过程的开发中,其实就是面向着具体的每一个步骤和过程,把每一个步 ...

  2. JavaSE基础知识(5)—面向对象(5.1类和对象概念、创建及内存分配)

    一.类和对象的相关概念 1.面向对象和面向过程的理解 面向对象和面向过程都属于解决问题的思考方式.面向过程:以执行者的角度思考问题,侧重于“怎么做”,比较适合解决小型项目面向对象:以指挥者的角度思考问 ...

  3. [javase学习笔记]-6.2 类与对象的关系

    这一节我们来看一下类与对象之间的关系. 我们学习java语言,目的就是用java语言对现实生活中的事物进行描写叙述.那么我们如何来描写叙述呢.这就引出了类,我们在实际实现时,是通过类的形式来体现的. ...

  4. 类与对象 - Java学习(二)

    弄清楚类与对象的本质与基本特征,是进一步学习面向对象编程语言的基本要求.面向对象程序设计与面向过程程序设计在思维上存在着很大差别,改变一种思维方式并不是一件容易的事情. 一.面向对象程序设计 程序由对 ...

  5. java 类与对象基础整理

    之前学习javaSE的时候,没有针对性地对对类与对象的一些基础进行整理,下面这些内容是笔记内容整理后的,希望以后自己可以通过这些博客时常复习! 一.类and对象的基础 类似于类的生命啊,类与对象的关系 ...

  6. 【JAVA】笔记(2)---面向过程与面向对象;类,对象;实例变量,引用;构造方法;

    面向过程与面向对象: 1.面向过程思想的典型栗子是C语言,C语言实现一个程序的流程是:在主函数中一步一步地罗列代码(定义子函数来罗列也是一样的道理),以此来实现我们想要的效果: 2.面向对象思想的典型 ...

  7. Java编程里的类和对象

    像我们搞计算机这块的,都知道这么一件事,当前的计算机编程语言主要分为两大块,一为面向过程,二为面向对象.Java就是一门纯面向对象的语言.学习了一个月左右的Java,在下对于Java当中的类和对象有了 ...

  8. Python - 类与对象的方法

    类与对象的方法

  9. C++基础知识(5)---类和对象

    终于把C++中的基础在前面的几篇博客中总结完了,可能还有一些语法还没有总结到,没关系,以后用到了再查资料就好.类是C++中的一个非常重要的概念,这是区别你使用的C++到底是面向过程还是面向对象的一个重 ...

  10. 简述JavaScript对象、数组对象与类数组对象

    问题引出 在上图给出的文档中,用JavaScript获取那个a标签,要用什么办法呢?相信第一反应一定是使用document.getElementsByTagName('a')[0]来获取.同样的,在使 ...

随机推荐

  1. WPF 的 await Application.Current.Dispatcher.InvokeAsync,Func 如果是Task , 等待赋值可能存在没有等待执行完成的问题

    最近在检查我们组内的代码,发现好多用到 await Application.Current.Dispatcher.InvokeAsync 相信好多WPF的开发都会用到 该方法做UI线程切换.但是细看里 ...

  2. 「Log」2023.8.28 小记

    序幕 七点多到校,整理博客,开了一篇新做题记录. 整理一下学过知识点,准备阶段复习. 八点整开始打模拟赛,接下来算游记. T1 是个静态区间第 \(k\) 小板子,纯主席树被空间卡掉了,打了 \(60 ...

  3. Springboot笔记<5>静态资源访问

    静态资源访问 静态资源目录 请求进来,先去找Controller看能不能处理.不能处理的所有请求又都交给静态资源处理器.静态资源也找不到则响应404页面.如果静态目录中存在a.png,访问localh ...

  4. java的StackOverflowError异常

    之前明明能查到,现在突然报错StackOverflowError,并一直在控制台返回空对象 多次遇到这种情况 发现是东西存入缓存中,缓存内存不够导致栈溢出,刷新kill缓存即可

  5. axios+vue

    网络应用 Vue结合网络数据开发应用 axios+vue 他与本地应用的不同点是 data中的数据有一部分是从网络中获取到的 axios(网络请求库) 内部就是ajax 但是通过封装后用起来更加便捷 ...

  6. STM32学会要花费多长时间?一个从机械转行老程序员的血泪史

    看到这个问题,我不禁想起了6年前那个拿着机械毕业证却被分配到电子部门的懵逼青年--没错,就是我. 当时坐在工位上,面对着桌上那块STM32F103的开发板,内心是崩溃的.我特么学了四年机械,研究生又搞 ...

  7. Java学习篇(四)—— Java 多线程

    如何创建一个线程? Java创建线程有两种方法,这里对三种方法做一个梳理,方便理解. 实现Runnable接口和run()方法 Java的接口就是一种协议,约定了想要被统一管理的类要遵循的协议.在Ja ...

  8. Wondows11安装 Docker Desktop 教程

    环境准备 确保电脑BIOS里面开启了虚拟化,可以任务管理器里面查看 启用wondows虚拟化支持 控制面板-程序-启用或关闭wondows功能 这里如果是家庭版,可能没有Hyper-v,没有就不勾 或 ...

  9. 《MySQL实战45讲》个人笔记-实战篇

    拜读了林晓斌大佬的<MySQL实战45讲>,特意做个知识点总结,以便后期回忆. 09.普通索引和唯一索引,应该怎么选择? 查询时:普通索引找到第一个后,还会往下找,直到碰到第一个不满足条件 ...

  10. CF1918B Minimize Inversions 题解

    CF1918B Minimize Inversions 诈骗题,点破一文不值. 交换元素 \(i,j\) 时可能有以下四种情况: 情况一:\(a_i\lt a_j,b_i\lt b_j\),此时总逆序 ...