一:类的定义
类(Class)是用来对一项实体进行描述的,类的构成包括成员属性(用来描述实体有哪些特征)和成员方法(用来描述实体能干什么),它本质是一种用户定义的引用数据类型(不是数据)。类是面向对象程序设计(OOP,Object-Oriented Programming)的基础,类具有封装(Encapsulation)、继承(Inheritance)和多态(Polymorphism)的特性,可以实现增强代码的稳定性和安全性,使代码的层次结构分明、便于被理解和管理,提升代码的灵活性并降低代码耦合度等目的。
二:类的作用
1.对象创建:
类是创建对象的模板。当你定义一个类时,你可以基于该类创建任意数量的对象,每个对象都会有自己的状态(属性的值),但共享相同的行为(方法)。
2.数据封装:(即封装特性,后面讲)
类提供了封装数据和行为的能力。它允许你将变量(属性)和方法(行为)组合在一起,形成一个独立的单元,从而隐藏了实现细节并提供了对外部的接口。
3.代码复用:(即继承特性,后面讲)
通过继承机制,类可以从其他类继承属性和方法,这允许你创建层次结构,减少代码重复并提高代码的可维护性。
4.多态性:(即多态特性,后面讲)
类支持多态性,这意味着一个接口可以由多个类实现,或者一个父类可以被多个子类继承。这增加了代码的灵活性和可扩展性。
5.接口定义:(后面和抽象类一起讲)
类可以定义接口,即一组方法签名,而不需要具体实现。其他类可以实现这些接口,以保证提供一组特定的行为。
6.模块化和代码组织:
类帮助你将代码组织成模块,这使得大型项目更容易管理。每个类可以专注于一个特定的功能,而整个系统则是这些类协同工作的结果。
7.抽象和具体实现分离:(后面和抽象类一起讲)
类允许你定义抽象类和接口,这些可以被具体实现的子类继承和实现。这有助于将设计和实现细节分开,便于修改和扩展。
8.安全性和权限控制:
类提供了访问修饰符,如public、protected、private和默认(default,也可以不写),这让你能够控制哪些成员可以被外部代码访问,增强了代码的安全性。
三:类的创建与初始化,以及这个过程的细节
创建类需要使用关键字class,其一般形式是:
class 类名{
成员变量1;
成员变量2;
......
成员方法1;
成员方法2;
......
}
举个例子,我们创建一个练习生类:
class Contestant{
public String name;
public int age;
public void talent1(){ //才能一
System.out.println(name+"演唱了只因你太美。");
}
public void talent2(){ //才能二
System.out.println(name+"表演了铁山靠。");
}
四:类的实例化(对象的创建)
1.类的实例化的概念:
用类这一自定义类型创建对象的过程,称为类的实例化。Java中使用new这一关键字,配合类名来创建对象。
2.实例化格式:
下面我们创建一个练习生对象
Contestant contestant = new Contestant(); //contestant就是我们创建的对象
创建对象的时候发生了什么?
①检测对象对应的类是否加载了,如果没有加载则加载
②为对象分配内存空间
③处理并发安全问题
比如:多个线程同时申请对象,JVM要保证给对象分配的空间不冲突
④初始化所分配的空间
即:对象空间被申请好之后,对象中包含的成员已经设置好了初始值。
⑤设置对象头信息
⑥调用构造方法,给对象中各个成员赋值
五:对象的初始化:
1.构造方法
(1.)概念
构造方法是一种特殊的成员方法,用于初始化新创建的对象。每个类至少有一个构造方法,如果没有显式定义,Java编译器会自动为类提供一个默认的无参构造方法。
(2.)语法(拿Contestant类举例)
public Contestant(String string, int x) {
this.name = string;
this.age = x;
}
(3.)特点
①名字必须与类名相同
②没有返回值类型,设置为void也不行
③创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次。
④构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)
没有参数的构造方法Contestant
public Contestant(){
this.name="zhangsan";
this.age=20;
}
没有参数的构造方法对应的实例化方法:
Contestant contestant = new Contestant();
有两个参数的构造方法Contestant
public Contestant(String string, int x) {
this.name = string;
this.age = x;
}
两个参数的构造方法对应的实例化方法:
Contestant contestant = new Contestant("kunkun", 21);
⑤如果用户没有显式定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的。 一旦用户定义,编译器则不再生成。
可以结合前面的JVM给成员属性赋初值过程理解。
//Contestant类默认的构造方法
public Contestant() {
this.name = null;
this.age = 0;
}
⑥构造方法中,可以通过this调用其他构造方法来简化代码
(注意事项:this(...)必须是构造方法中第一条语句且
不能来回引用。不能我引用你的方法,你引用我的方法,因为我们其实都没有实际的赋值过程)
⑦绝大多数情况下使用public来修饰,特殊场景下会被private修饰(后序讲单例模式时会遇到)
public class Library {//忽略这个不相关的类名
static class Contestant {
public String name;
public int age;
// 构造方法(一种特殊的成员方法,负责给对象中的成员进行初始化)
public Contestant(String string, int x) {
this.name = string;
this.age = x;
}
public void talent1() { // 才能一
System.out.println(name + "演唱了只因你太美。");
}
public void talent2() { // 才能二
System.out.println(name + "表演了铁山靠。");
}
}
public static void print() {
Contestant contestant = new Contestant("kunkun", 21); // 因为构造方法,这里必须初始化,否则编译失败
// Contestant contestant = new Contestant();
/* contestant.name = "kunkun";
contestant.age = 21;*/
System.out.println("有请下一位练习生 " + contestant.age + "岁的" + contestant.name + "!");
contestant.talent1();
contestant.talent2();
}
public static void main(String[] args) {
print();
}
}