面向对象

EaborH

对象

对象本质上是一种特殊的数据结构

1
2
3
4
5
6
public class 类名{
...
}
main(){
类名 对象名 = new 类名();
}

构造器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Student {

String name;
int name;
char sex;
// 构造器是一种特殊的方法,不能写返回值类型,名称必须是类名

// 无参构造器
public Student(){

}

// 有参构造器
public Student(String n, int a, char s){

}
}

main(){
s1 = new Student(name, age, sex);
}

this关键字

this是一个变量,可以用在方法中,用于拿到当前对象

封装

合理隐藏合理暴露

  • 使用 关键字(私有,隐藏)修饰成员变量,就只能在本类中被直接访问
  • 使用 方法合理暴露

javabean

**实体类的对象只负责数据存取,而对数据的业务处理交给其他类的对象完成,以此实现数据和数据业务处理相分离

static

静态,可以修饰成员变量、成员方法

成员变量按照有无 static 修饰,分为两种

  • 静态变量(类变量):有static修饰,属于类,在计算机内只有一份,会被类的全部对象共享
  • 实例变量(对象的变量):无static修饰,属于每个对象

静态变量的应用场景

  • 如果某个数据只需要一份,且希望能够被共享(访问,修改),则该数据可以定义成静态变量来记住

静态方法的常见应用场景

  • 做工具类

静态方法,实例方法访问的相关几点注意事项

  • 静态方法中可以直接访问静态成员,不可以直接访问实例成员
  • 实例方法中可以直接访问静态成员,也可以直接访问实例成员
  • 实例方法中可以出现this关键字,静态方法中不可以出现this关键字

继承

继承是什么?

继承是面向对象当中一种重要的思想,其可以提高代码的复用性,减少重复代码的书写

Java中提供关键字 extends,可以让一个类另一个类建立起父子关系

1
2
3
4
5
6
7
public class B extends A{

// A类称为父类(基类 or 超类)
// B类称为子类(派生类)

}

子类可以继承什么

子类能继承父类的非私有成员(成员变量,成员方法)

继承后对象的创建

子类可以继承父类的非私有成员
子类的对象是由父类、子类共同完成的,所以子类的对象是完整的

权限修饰符

权限修饰符是用来限制类中的成员(成员变量,成员方法,构造器)能够被访问的范围

  • private :只能本类
  • 缺省 :本类,同一个包中的类
  • protected :本类,同一个包中的类,子孙类中
  • public :任意位置

继承的特点

  • 单继承 :Java是单继承模式,一个类只能继承一个直接父类
  • 多层继承 :Java不支持多继承,但是支持多层继承
  • 祖宗类 :Java中所有类都是Object类的子类
  • 就近原则 :优先访问自己类中,自己类中没有才会继承父类

方法的重写

当子类觉得父类中的某一个方法不好用,或者无法满足自身的需求,子类可以重写一个方法名称、参数列表一样的方法,去覆盖父类的该方法,这就是方法的重写

1
2
3
4
5
6
7
8
9
10
11
12
13
14

class a{
public void methodA(){
sout(textA);
}
}

class b extends a{
@Override // 方法重写的校验注解(标志)
// 方法名称、参数列表必须一致
public void methodA(){
sout(testB);
}
}

其他注意事项

  • 子类重写父类方法时,访问权限必须>=父类的方法权限(public>protected>缺省)
  • 重写的方法的返回值类型,必须与被重写方法的返回值一样,或者范围更小
  • 私有方法,静态方法不能被重写,如果重写会报错

toString 方法默认返回地址,可更具实际需求重写

子类构造器

子类构造器的特点

  • 子类的全部构造器,都会先调用父类的构造器,在执行自己

子类构造器是如何实现调用父类构造器的

  • 默认情况下,子类全部构造器的第一行代码都是 super() ,他会调用父类的无参数构造器
  • 如果父类没有无参数构造器,则我们必须在子类构造器的第一行手写 super(…) ,去指定调用父类的有参数构造器

this() :兄弟构造器,super() 和 this()必须写在构造器的第一行且不能同时出现

多态

什么是多态

多态是在 继承/实现 情况下的一种现象,表现为:对象多态,行为多态

  • 对象和行为编译看左运行看右
  • 对于成员变量为编译看左运行也看左

多态的前提 :有继承/实现关系;存在父类引用子类对象,存在方法的重写

多态的好处

  • 在多态的形式下,右边的对象是解耦合的,更便于扩展和维护
1
2
People p1 = new Teacher();
p1.run();
  • 在定义方法的时候,使用父类类型的形参,可以接受一切子类对象,扩展性更强,更便捷

局限性
在多态的情况下不能调用子类的独有功能

多态下的类型转换

  • 自动类型转换:父类 变量名 = new 子类()
1
People p = new Teacher();
  • 强制类型转换:子类 变量名 = (子类)父类变量()
1
Teacher t = (Teacher)p;

强制类型转换的一个注意事项

  • 存在继承/实现关系就可以在编译阶段进行强制类型转换,编译阶段不会报错
  • 运行时,如果发现对象的真实类型与强转后的类型不同,就会报类型转换异常(ClassCastException)的错误出来

建议强制转换前应该判断对象的真实类型,再进行强制转换

1
2
3
4
5
if(a instanceof b){
//do something
}else if(a instanceof c){
//do something
}

附加内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

// lombok 技术可以实现为类自动添加 getter setter方法,无参构造器,toString

import lombok.AllArgsConstructor
import lombok.Data
import lombok.NoArgsConstructor

@Data
@AllArgsConstructor
@NoArgsConstructor

// eg.
public class ... {
private ...
private ...
private ...
private ...
}


  • Title: 面向对象
  • Author: EaborH
  • Created at : 2025-03-15 00:00:00
  • Updated at : 2025-03-17 18:12:12
  • Link: https://eabor.xyz/2025/03/15/面向对象/
  • License: This work is licensed under CC BY-NC-SA 4.0.