1. 类与对象的初步认知
JAVA是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。
面向过程注重的是过程,在整个过程中所涉及的行为,就是功能。
面向对象注重的是对象,也就是参与过程所涉及到的主体。是通过逻辑将一个个功能实现连接起来。
2. 类和类的实例化
类相当于一个模板,对象是由模板产生的样本。一个类,可以产生无数的对象。
声明一个类就是创建一个新的数据类型,而类在 Java 中属于引用类型, Java 使用关键字 class 来声明类。
注意事项:
new 关键字用于创建一个对象的实例。
使用 . 来访问对象中的属性和方法。
同一个类可以创建多个实例。
3. 类的成员
基本语法:
// 创建类
class <class_name>{
field;//成员属性
method;//成员方法
}
// 实例化对象
<class_name> <对象名> = new <class_name>();
类的成员可以包含以下:字段、方法、代码块、内部类和接口等。
class为定义类的关键字,ClassName为类的名字,{}中为类的主体。
类中的元素称为:成员属性。类中的函数称为:成员方法。
注意事项:
使用 . 访问对象的字段. “访问” 既包含读, 也包含写.
对于一个对象的字段如果没有显式设置初始值,那么会被设置一个默认的初值。
默认值规则:
对于各种数字类型, 默认值为 0。
对于 boolean 类型, 默认值为 false。
对于引用类型(String, Array, 以及自定制类)默认值为NULL。
null 在 Java 中为 “空引用”, 表示不引用任何对象. 类似于 C 语言中的空指针. 如果对 null 进行 . 操作就会引发异常。
如果在任何方法上应用 static 关键字,此方法称为静态方法。
静态方法属于类,而不属于类的对象。
可以直接调用静态方法,而无需创建类的实例。
静态方法可以访问静态数据成员,并可以更改静态数据成员的值。
注意事项1:
静态方法和实例无关, 而是和类相关. 因此这导致了两个情况:
静态方法不能直接使用非静态数据成员或调用非静态方法(非静态数据成员和方法都是和实例相关的。
this和super两个关键字不能在静态上下文中使用(this 是当前实例的引用, super是当前实例父类实例的引用, 也是和当前实例相关。
注意事项2:
我们曾经写的方法为了简单, 都统一加上了 static. 但实际上一个方法具体要不要带 static, 都需要是情形而定。
main 方法为 static 方法。
4. 封装
private/ public 这两个关键字表示 “访问权限控制” 。
被 public 修饰的成员变量或者成员方法, 可以直接被类的调用者使用.。被 private 修饰的成员变量或者成员方法, 不能被类的调用者使用。
换句话说, 类的使用者根本不需要知道, 也不需要关注一个类都有哪些 private 的成员。从而让类调用者以更低的成本来使用类。
注意事项:
private 不光能修饰字段, 也能修饰方法。
通常情况下我们会把字段设为 private 属性, 但是方法是否需要设为 public, 就需要视具体情形而定.。一般我们希望一个类只提供 “必要的” public 方法, 而不应该是把所有的方法都无脑设为 public。
当我们使用 private 来修饰字段的时候, 就无法直接使用这个字段了。此时如果需要获取或者修改这个 private 属性,就需要使用getter/setter方法。
getName 即为 getter 方法, 表示获取这个成员的值。
setName 即为 setter 方法, 表示设置这个成员的值。
当set方法的形参名字和类中的成员属性的名字一样的时候,如果不使用this, 相当于自赋值. this 表示当前实例的引用。
不是所有的字段都一定要提供 setter / getter 方法, 而是要根据实际情况决定提供哪种方法。在 IDEA 中可以使用 alt + insert (或者 alt + F12) 快速生成 setter / getter 方法.。在 VSCode 中可以使用鼠标右键菜单 -> 源代码操作 中自动生成 setter / getter 方法。
5. 构造方法
构造方法是一种特殊方法, 使用关键字new实例化新对象时会被自动调用, 用于完成初始化操作。
new 执行过程
为对象分配内存空间
调用对象的构造方法
语法规则:
1.方法名称必须与类名称相同
2.构造方法没有返回值类型声明
3.每一个类中一定至少存在一个构造方法(没有明确定义,则系统自动生成一个无参构造)
注意事项
如果类中没有提供任何的构造函数,那么编译器会默认生成一个不带有参数的构造函数。
若类中定义了构造方法,则默认的无参构造将不再生成。
构造方法支持重载。
代码实例如下:
class Person {
private String name;//实例成员变量
private int age;
private String sex;
//默认构造函数 构造对象
public Person() {
this.name = "caocao";
this.age = 10;
this.sex = "男";
}
//带有3个参数的构造函数
public Person(String name,int age,String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
public void show(){
System.out.println("name: "+name+" age: "+age+" sex: "+sex);
}
this关键字
在构造函数的内部,我们可以使用this关键字,构造函数是用来构造对象的,对象还没有构造好,
我们就使用了this,那this还代表当前对象吗?当然不是,this代表的是当前对象的引用。
6. 代码块
根据代码块定义的位置以及关键字,又可分为以下四种:
普通代码块
构造块
静态块
同步代码块
构造块:定义在类中的代码块(不加修饰符)。也叫:实例代码块。构造代码块一般用于初始化实例成员变量。
class Person {
private String name;
private int age;
// 构造方法
public Person() {
System.out.println("person");
}
// 实例代码块
{
System.out.println("实例代码块");
}
// 静态代码块
static {
System.out.println("静态代码块 ");
}
}
public class TestDemo04 {
public static void main(String[] args) {
Person person = new Person();
}
}
运行结果为:
静态代码块
实例代码块
person
注意事项:
静态代码块不管生成多少个对象,其只会执行一次,且是最先执行的。
静态代码块执行完毕后, 实例代码块(构造块)执行,再然后是构造函数执行。
7. 补充
代码示例:
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 这样的方法将对象自动转化为字符串。
注意事项:
toString 方法会在 println 的时候被自动调用。
将对象转成字符串这样的操作我们称为序列化。
toString 是 Object 类提供的方法, 我们自己创建的 Person 类默认继承自 Object 类, 可以重写 toString 方法实现我们自己版本的转换字符串方法。
@Override 在 Java 中称为 “注解”