《JAVA SE》类与对象的注意事项

简介: 《JAVA SE》类与对象的注意事项

前言

本章节为大家总结了JAVA中类与对象中的一些注意事项,包括语法、定义等等。

类就是一类对象的统称。对象就是这一类具体化的一个实例。
简单的例子:我们做月饼的模子就是一个类,而通过这个模子可以做出月饼,那么在这个例子当中,类就是那个模子,而月饼就是那个对象,所以月饼就是一个实体。一个模子可以实例化无数个对象。
总的来说:类相当于一个模板,对象是由模板产生的样本。一个类,可以产生无数的对象。 声明一个类就是创建一个新的数据类型,而类在 Java中属于 引用类型, Java 使用关键字 class 来声明类。

一、字段/属性/成员变量

在类中, 但是方法外部定义的变量. 这样的变量我们称为 "字段" 或 "属性" 或 "成员变量"(三种称呼都可以, 一般不会严格区分).

1.1 注意事项

1.使用 . 访问对象的字段.
2."访问" 既包含, 也包含.
3.对于一个对象的字段如果没有显式设置初始值, 那么会被设置一个默认的初值.

1.2 默认值规则

1.对于各种数字类型, 默认值为 0.
2.对于 boolean 类型, 默认值为 false.
3.对于引用类型(String, Array, 以及自定制类), 默认值为 null

1.3 认识 null

==null 在 Java 中为 "空引用", 表示不引用任何对象. 类似于 C 语言中的空指针. 如果对 null 进行 . 操作就会引发异常==

二、成员方法

用于描述一个对象的行为.

注意区别于构造方法,这是对象的方法,有返回值,创建对象后才可调用。

三、static关键字

3.1 静态属性,类属性,类变量

static修饰的属性为类属性,类变量,所有对象共享。

当一个实例变量被static关键字修饰,他就表示的属性(直接用类.变量名就可以调用),该类的所有对象共享这个属性,所有对象的属性值大家都一样。static修饰的属性在JVM方法区中存储,所有该类对象共享此属性。==(顺带一提,new出来的对象存储在堆区,而局部变量和普通方法存储在栈区)==

例如:调用new person()来创建一个对象,必须得先有类才能产生对象。该类会一开始先加载进内存中,随即person类中所有的static变量都会加载到方法区中。

3.1.1 方法区

1.类中的所有方法都在方法区中存储。
2.方法区中存储常量静态变量

3.1.2 注意事项

==(1)问:在JAVA中能否在方法中定义一个静态变量?==
答:不能!方法中定义的都是局部变量,在栈中存取,一旦方法调用结束,弹出栈帧就会销毁,所以不可以。

==(2)类中常量的定义==:
在类中定义常量,一般都会使用全局常量static final共同修饰。
常量的命名规则
==所有单词全部大写,多个单词使用下划线分隔。==
例如:static final String STUDENT_SCHOOL="清华大学"

==(3)不推荐使用对象来调用类属性,不规范!!!==

==(4)类的null引用也可以通过类名访问static属性。==
在这里插入图片描述

3.2 静态方法

如果在任何方法上应用 static 关键字,此方法称为静态方法。 静态方法属于类,而不属于类的对象。
可以直接调用静态方法,而无需创建类的实例。

==静态方法可以访问静态数据成员,并可以更改静态数据成员的值。==

3.2.1 注意事项

静态方法和实例无关, 而是和类相关. 因此这导致了两个情况:

(1)静态方法不能直接使用非静态数据成员或调用非静态方法(非静态数据成员和方法都是和实例相关的).

==(2)this和super两个关键字不能在静态上下文中使用(this 是当前实例的引用, super是当前实例父类实例的引用, 也是和当前实例相关).==

(3)main 方法为 static 方法.

==(4)static关键字不能直接修饰一个外部类。(private关键字也不可以修饰外部类)==

3.2.2 为什么main方法是静态方法?

主方法是一个程序的入口,若主方法是成员方法,必须先new一个对象,但入口都不存在何谈new一个对象呢?(程序从主方法开始执行,所以把它定义为静态方法,直接就可以调用,不需要产生对象)

四、构造方法

构造方法是类中非常特殊的一类方法,使用关键字new实例化对象时实际上调用的是该类的构造方法。

构造方法的作用就是产生对象。

4.1 new执行过程

1.为对象在堆中分配空间。
2.调用对象的构造方法为成员变量赋值。
3.构造方法调用结束,则对象初始化完成。
在这里插入图片描述

4.2 构造方法的语法规则

==(1)方法名称与类名称完全相同。==

==(2)构造方法没有返回值声明(不是void)。==

==(3)每一个类中一定至少存在一个构造方法(没有明确定义,则系统自动生成一个无参构造)。==

==(4)若类中定义了有参构造方法,则默认的无参构造将不再生成。此时建议再定义一个无参构造器。==

(5)构造方法支持重载. 规则和普通方法的重载一致。

五、this关键字

this表示当前对象引用(注意不是当前对象). 可以借助 this 来访问对象的字段和方法

5.1 调用当前对象的成员变量

在这里插入图片描述

5.2 调用当前对象的方法

在这里插入图片描述

5.3 this表示构造方法之间的互相调用(重点

==若不同参数的构造方法之间出现了重复的调用,可以使用this(参数)来调用其他方法的构造方法。==
更改前:
在这里插入图片描述更改后:

在这里插入图片描述

注意:

==(1)this调用其他构造方法必须放在当前构造方法的首行!==

==(2)this调用构造方法不能成“环”。==
在这里插入图片描述

六、代码块

使用 {} 定义的一段代码. 根据代码块定义的位置以及关键字,又可分为以下四种:
普通代码块
构造块
静态块
同步代码块

6.1 普通代码块

定义在方法中的代码块,用{}括起来。
在这里插入图片描述

6.2 构造代码块

定义再中的代码块,也叫构造块。
在这里插入图片描述
注意重点):
构造块直接定义在类之中,不加任何修饰符的代码块,==优先构造于构造方法执行==,有几个对象产生就调用几次构造块。
在这里插入图片描述

6.3 静态代码块

定义在类中,使用static修饰的代码块,==在类加载时执行一次==。

注意:静态代码块优先于构造块执行。
在这里插入图片描述
在这里插入图片描述
主类的静态块优先于主方法执行。JVM要执行主方法,首先得先加载主类,主类一加载,静态块就执行了。
示例:
在这里插入图片描述

七、补充说明(重点

7.1 toString方法

代码示例:

class Person { 
 private String name; 
 private int age; 
 public Person(String name,int age) { 
 this.age = age; 
 this.name = name; 
 } 
 public void show() { 
 System.out.println("name:"+name+" " + "age:"+age); 
 } 
} 
public class Main { 
 public static void main(String[] args) { 
 Person person = new Person("caocao",19); 
 person.show(); 
 //我们发现这里打印的是一个地址的哈希值 原因:调用的是Object的toString方法
 System.out.println(person); 
 } 
} 
// 执行结果
name:caocao age:19 
Person@1c168e5

可以使用 toString 这样的方法来将对象自动转成字符串:

class Person { 
 private String name; 
 private int age; 
 public Person(String name,int age) { 
 this.age = age; 
 this.name = name; 
 } 
 public void show() { 
 System.out.println("name:"+name+" " + "age:"+age); 
 } 
 //重写Object的toString方法
 @Override 
 public String toString() { 
 return "Person{" + 
 "name='" + name + '\'' + 
 ", age=" + age + 
 '}'; 
 } 
} 
public class Main { 
 public static void main(String[] args) { 
比特科技
 Person person = new Person("caocao",19); 
 person.show(); 
 System.out.println(person); 
 } 
} 
// 执行结果
name:caocao age:19 
Person{name='caocao', age=19} 

注意事项

(1)toString 方法会在 println 的时候被自动调用.

(2)将对象转成字符串这样的操作我们称为 序列化.

(3)toString 是 Object 类提供的方法, 我们自己创建的 Person 类默认继承自 Object 类, 可以重写 toString 方法实现我们自己版本的转换字符串方法. (关于继承和重写这样的概念, 我们后面会重点介绍).

(4)@Override 在 Java 中称为 "注解", 此处的 @Override 表示下面实现的 toString 方法是重写了父类的方法.

(5)IDEA快速生成Object的toString方法快捷键:alt+f12(insert)

7.2 匿名对象

匿名只是表示没有名字的对象.

1.没有引用的对象称为匿名对象.
2.匿名对象只能在创建对象时使用.
3.如果一个对象只是用一次, 后面不需要用了, 可以考虑使用匿名对象.

==简单来说就是new出来的对象只用一次就销毁了,通常用于测试类中的某些功能使用一次就被JVM销毁。==
示例:

class Person { 
 private String name; 
 private int age; 
 public Person(String name,int age) { 
 this.age = age; 
 this.name = name; 
 } 
 public void show() { 
 System.out.println("name:"+name+" " + "age:"+age); 
 } 
} 
public class Main { 
 public static void main(String[] args) { 
 new Person("caocao",19).show();//通过匿名对象调用方法
 } 
} 
// 执行结果
name:caocao age:19 

八、总结

(1)一个类可以产生无数的对象,类就是模板,对象就是具体的实例。

(2)类中定义的属性,大概分为几类:类属性,对象属性。其中被static所修饰的数据属性称为类属性, static修饰的方法称为类方法,特点是不依赖于对象,我们只需要通过类名就可以调用其属性或者方法。

(3)静态代码块优先实例代码块执行,实例代码块优先构造函数执行。

(4)this关键字代表的是当前对象的引用。并不是当前对象。

**以上就是JAVA中类与对象的所有注意事项啦,希望老铁们给个三连哟~
(●ˇ∀ˇ●)**

相关文章
|
6天前
|
Java 编译器 ice
【Java开发指南 | 第十五篇】Java Character 类、String 类
【Java开发指南 | 第十五篇】Java Character 类、String 类
27 1
|
4天前
|
自然语言处理 Java API
Java 8的Stream API和Optional类:概念与实战应用
【5月更文挑战第17天】Java 8引入了许多重要的新特性,其中Stream API和Optional类是最引人注目的两个。这些特性不仅简化了集合操作,还提供了更好的方式来处理可能为空的情况,从而提高了代码的健壮性和可读性。
26 7
|
6天前
|
Java
【Java开发指南 | 第十四篇】Java Number类及Math类
【Java开发指南 | 第十四篇】Java Number类及Math类
17 1
|
2天前
|
安全 Java 容器
Java一分钟之-并发编程:线程安全的集合类
【5月更文挑战第19天】Java提供线程安全集合类以解决并发环境中的数据一致性问题。例如,Vector是线程安全但效率低;可以使用Collections.synchronizedXxx将ArrayList或HashMap同步;ConcurrentHashMap是高效线程安全的映射;CopyOnWriteArrayList和CopyOnWriteArraySet适合读多写少场景;LinkedBlockingQueue是生产者-消费者模型中的线程安全队列。注意,过度同步可能影响性能,应尽量减少共享状态并利用并发工具类。
17 2
|
4天前
|
设计模式 算法 Java
Java的前景如何,好不好自学?,万字Java技术类校招面试题汇总
Java的前景如何,好不好自学?,万字Java技术类校招面试题汇总
|
5天前
|
消息中间件 Java RocketMQ
MQ产品使用合集之在同一个 Java 进程内建立三个消费对象并设置三个消费者组订阅同一主题和标签的情况下,是否会发生其中一个消费者组无法接收到消息的现象
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
13 1
|
6天前
|
安全 Java 开发者
Java一分钟之-文件与目录操作:Path与Files类
【5月更文挑战第13天】Java 7 引入`java.nio.file`包,`Path`和`Files`类提供文件和目录操作。`Path`表示路径,不可变。`Files`包含静态方法,支持创建、删除、读写文件和目录。常见问题包括:忽略异常处理、路径解析错误和权限问题。在使用时,注意异常处理、正确格式化路径和考虑权限,以保证代码稳定和安全。结合具体需求,这些方法将使文件操作更高效。
11 2
|
6天前
|
安全 Java 开发者
Java一分钟之-Optional类:优雅处理null值
【5月更文挑战第13天】Java 8的`Optional`类旨在减少`NullPointerException`,提供优雅的空值处理。本文介绍`Optional`的基本用法、创建、常见操作,以及如何避免错误,如直接调用`get()`、误用`if (optional != null)`检查和过度使用`Optional`。正确使用`Optional`能提高代码可读性和健壮性,建议结合实际场景灵活应用。
22 3
|
6天前
|
存储 Java 索引
【Java开发指南 | 第十六篇】Java数组及Arrays类
【Java开发指南 | 第十六篇】Java数组及Arrays类
10 3
|
6天前
|
存储 缓存 Java
【Java开发指南 | 第六篇】Java成员变量(实例变量)、 类变量(静态变量)
【Java开发指南 | 第六篇】Java成员变量(实例变量)、 类变量(静态变量)
13 2