前言
本章节为大家总结了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中类与对象的所有注意事项啦,希望老铁们给个三连哟~
(●ˇ∀ˇ●)**