JavaSE-类和对象
类和对象的概念
类的定义
类是一种用户自定义的数据类型,它是创建对象的蓝图,定义了一组属性(称为“字段”)和方法(称为“函数”)。类是面向对象编程的基本构建块,它封装了数据和行为。
在 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();
}
}
写一个类要包含以下部分(类的结构):
包声明(Package Declaration):
- 使用
package关键字声明,用于组织类和接口。
- 使用
导入语句(Import Statements):
- 使用
import关键字导入其他包中的类或接口。
- 使用
类声明(Class Declaration):
- 使用
class关键字后跟类名。
- 使用
访问修饰符(Access Modifiers):
- 如
public,protected,private等,定义类或类的成员的可见性。
- 如
类属性(Class Fields):
- 定义类的成员变量,可以是任何数据类型。
构造函数(Constructor):
- 类的构造函数用于创建类的实例。
方法(Methods):
- 类的行为通过方法实现,可以包含业务逻辑。
getter 和 setter 方法(Accessors and Mutators):
- 提供访问和更新类属性的方式。
主方法(Main Method)(如果类是应用程序的入口):
- 使用
public static void main(String[] args)作为程序的入口点。
- 使用
文档注释(Documentation Comments):
- 使用
/** ... */为类和方法提供文档注释。
- 使用
代码注释(Code Comments):
- 使用
//或/* ... */为代码添加注释,提高代码可读性。
- 使用
异常处理(Exception Handling):
- 使用
try,catch,finally,throw,throws等关键字进行异常处理。
- 使用
内部类(Inner Classes):
- 如果需要,类可以包含内部类定义。
枚举(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-类和对象的更多相关文章
- JavaSE——面向对象与面向过程、类与对象、(属性、方法、构造器)等
一:面向对象与面向过程 二者都是一种思想,面向对象是相对于面向过程而言的. 面向过程: 1.面向过程思想强调的是过程(动作). 2.在面向过程的开发中,其实就是面向着具体的每一个步骤和过程,把每一个步 ...
- JavaSE基础知识(5)—面向对象(5.1类和对象概念、创建及内存分配)
一.类和对象的相关概念 1.面向对象和面向过程的理解 面向对象和面向过程都属于解决问题的思考方式.面向过程:以执行者的角度思考问题,侧重于“怎么做”,比较适合解决小型项目面向对象:以指挥者的角度思考问 ...
- [javase学习笔记]-6.2 类与对象的关系
这一节我们来看一下类与对象之间的关系. 我们学习java语言,目的就是用java语言对现实生活中的事物进行描写叙述.那么我们如何来描写叙述呢.这就引出了类,我们在实际实现时,是通过类的形式来体现的. ...
- 类与对象 - Java学习(二)
弄清楚类与对象的本质与基本特征,是进一步学习面向对象编程语言的基本要求.面向对象程序设计与面向过程程序设计在思维上存在着很大差别,改变一种思维方式并不是一件容易的事情. 一.面向对象程序设计 程序由对 ...
- java 类与对象基础整理
之前学习javaSE的时候,没有针对性地对对类与对象的一些基础进行整理,下面这些内容是笔记内容整理后的,希望以后自己可以通过这些博客时常复习! 一.类and对象的基础 类似于类的生命啊,类与对象的关系 ...
- 【JAVA】笔记(2)---面向过程与面向对象;类,对象;实例变量,引用;构造方法;
面向过程与面向对象: 1.面向过程思想的典型栗子是C语言,C语言实现一个程序的流程是:在主函数中一步一步地罗列代码(定义子函数来罗列也是一样的道理),以此来实现我们想要的效果: 2.面向对象思想的典型 ...
- Java编程里的类和对象
像我们搞计算机这块的,都知道这么一件事,当前的计算机编程语言主要分为两大块,一为面向过程,二为面向对象.Java就是一门纯面向对象的语言.学习了一个月左右的Java,在下对于Java当中的类和对象有了 ...
- Python - 类与对象的方法
类与对象的方法
- C++基础知识(5)---类和对象
终于把C++中的基础在前面的几篇博客中总结完了,可能还有一些语法还没有总结到,没关系,以后用到了再查资料就好.类是C++中的一个非常重要的概念,这是区别你使用的C++到底是面向过程还是面向对象的一个重 ...
- 简述JavaScript对象、数组对象与类数组对象
问题引出 在上图给出的文档中,用JavaScript获取那个a标签,要用什么办法呢?相信第一反应一定是使用document.getElementsByTagName('a')[0]来获取.同样的,在使 ...
随机推荐
- WPF 的 await Application.Current.Dispatcher.InvokeAsync,Func 如果是Task , 等待赋值可能存在没有等待执行完成的问题
最近在检查我们组内的代码,发现好多用到 await Application.Current.Dispatcher.InvokeAsync 相信好多WPF的开发都会用到 该方法做UI线程切换.但是细看里 ...
- 「Log」2023.8.28 小记
序幕 七点多到校,整理博客,开了一篇新做题记录. 整理一下学过知识点,准备阶段复习. 八点整开始打模拟赛,接下来算游记. T1 是个静态区间第 \(k\) 小板子,纯主席树被空间卡掉了,打了 \(60 ...
- Springboot笔记<5>静态资源访问
静态资源访问 静态资源目录 请求进来,先去找Controller看能不能处理.不能处理的所有请求又都交给静态资源处理器.静态资源也找不到则响应404页面.如果静态目录中存在a.png,访问localh ...
- java的StackOverflowError异常
之前明明能查到,现在突然报错StackOverflowError,并一直在控制台返回空对象 多次遇到这种情况 发现是东西存入缓存中,缓存内存不够导致栈溢出,刷新kill缓存即可
- axios+vue
网络应用 Vue结合网络数据开发应用 axios+vue 他与本地应用的不同点是 data中的数据有一部分是从网络中获取到的 axios(网络请求库) 内部就是ajax 但是通过封装后用起来更加便捷 ...
- STM32学会要花费多长时间?一个从机械转行老程序员的血泪史
看到这个问题,我不禁想起了6年前那个拿着机械毕业证却被分配到电子部门的懵逼青年--没错,就是我. 当时坐在工位上,面对着桌上那块STM32F103的开发板,内心是崩溃的.我特么学了四年机械,研究生又搞 ...
- Java学习篇(四)—— Java 多线程
如何创建一个线程? Java创建线程有两种方法,这里对三种方法做一个梳理,方便理解. 实现Runnable接口和run()方法 Java的接口就是一种协议,约定了想要被统一管理的类要遵循的协议.在Ja ...
- Wondows11安装 Docker Desktop 教程
环境准备 确保电脑BIOS里面开启了虚拟化,可以任务管理器里面查看 启用wondows虚拟化支持 控制面板-程序-启用或关闭wondows功能 这里如果是家庭版,可能没有Hyper-v,没有就不勾 或 ...
- 《MySQL实战45讲》个人笔记-实战篇
拜读了林晓斌大佬的<MySQL实战45讲>,特意做个知识点总结,以便后期回忆. 09.普通索引和唯一索引,应该怎么选择? 查询时:普通索引找到第一个后,还会往下找,直到碰到第一个不满足条件 ...
- CF1918B Minimize Inversions 题解
CF1918B Minimize Inversions 诈骗题,点破一文不值. 交换元素 \(i,j\) 时可能有以下四种情况: 情况一:\(a_i\lt a_j,b_i\lt b_j\),此时总逆序 ...