Java给我的感觉就是一个有一个的类,毕竟类是其代码的基本组织单元。
对象是类实例化的结果,所以对象有时也被称为实例,从类到对象的过程称为实例化。
面向对象的三大特点:封装、继承、多态
封装
学术上的东西就不讲了,从开发的视角阐述这个概念。
通常我们都会将字段的可访问性设置为private,然后通过Getter和Setter方法对外提供查看和设置字段值的接口。
(我习惯于称作字段,貌似大家都喜欢叫属性)
上代码:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
这是一个Person类,对人这个实体的抽象。类中有两个字段:name和age,代表人的姓名和年龄。从代码层面上看,Person类外面的任何方法都不能直接访问这两个字段,只能通过类中提供的方法进行访问和修改。
这就是封装!!!
至于说有什么有点,AI来吧:
面向对象编程(OOP)中的封装是一个核心概念,它提供了以下优点:
数据隐藏:封装允许对象隐藏其内部状态和复杂性,只暴露一个清晰的接口给外部世界。这降低了代码的复杂性,并提高了代码的可理解性。
实现细节的保护:通过隐藏内部实现,封装防止了外部代码直接访问对象的内部数据,从而防止了可能的错误或不当的修改。
接口与实现的分离:封装使得对象的内部实现可以独立于其接口进行修改,只要接口保持不变,外部代码就不需要修改。
提高代码的可维护性:由于对象的内部实现被隐藏,修改这些实现不会影响依赖于该对象的代码,这使得维护和更新变得更加容易。
增强代码的安全性:封装可以防止外部代码访问或修改对象的私有成员,这有助于防止潜在的安全风险。
促进重用:封装提供了一个清晰的接口,使得对象可以在不同的程序和环境中重用,而不需要了解其内部工作机制。
减少耦合:封装减少了类与类之间的直接依赖,从而降低了系统中各部分之间的耦合度。
提高代码的可测试性:封装使得单元测试可以针对特定的对象进行,而不需要考虑整个系统的复杂性。
支持多态:封装与多态一起工作,允许基于接口而非实现编程,这使得使用基类指针或引用调用派生类的方法成为可能。
封装继承:在支持继承的语言中,封装允许子类继承父类的属性和方法,同时可以扩展或修改这些属性和方法,而不需要更改外部代码。
促进模块化设计:封装鼓励将系统分解成模块或类,每个模块或类都有自己的职责,这有助于构建更大规模的系统。
提高代码的组织性:封装要求将相关的数据和操作这些数据的方法组合在一起,这有助于提高代码的组织性和结构化。
总的来说,封装是面向对象设计的一个关键原则,它有助于创建更健壮、更灵活和更易于维护的软件。
随便扫一眼就行了。。。
继承
这个没有什么好说的,子类可以继承父类非private的字段和方法。
在实际开发中,我们往往使用父类变量去引用子类对象,除非想调用子类对象的扩展的方法。
class Student extends Person {
public Student(String name, int age) {
super(name, age);
}
public void sayHello(){
System.out.println("Hello Java");
}
}
class Test {
public static void main(String[] args) {
Person person = new Student("kaiven", 20);
System.out.println(person.getName() + person.getAge());
}
}
由于Student继承了Person,所以Person类型的变量可以引用Student类型的对象。
当然,考虑以下语句,能够正常运行:
person.sayHello();
如果你尝试了,会发现不行。其实是可以的,因为引用的是Student对象嘛。但是,通不过编译器,因为Person类中没有sayHello这个方法。
如果我们想调用属于这个子类对象的特有方法,只能通过类型强转去通过编译器的检查:
class Test {
public static void main(String[] args) {
Person person = new Student("kaiven", 20);
Student student = (Student) person;
student.sayHello();
}
}
多态
不要去抓着这个字眼不放了,你越想就越容易钻牛角尖。
Java中的多态,分为编译时多态和运行时多态。
编译时多态指的是方法的重载:
class Student extends Person {
public Student(String name, int age) {
super(name, age);
}
public void sayHello(){
System.out.println("Hello Java");
}
public void sayHello(String content){
System.out.println(content);
}
}
运行时多态指的是程序中定义的对象引用的具体类型在运行期间才确定。
运行时多态的三个条件:继承、覆盖(重写)、向上转型
class Student extends Person {
public Student(String name, int age) {
super(name, age);
}
@Override
public String getName() {
return "我就不告诉你我的名次";
}
}
class Teacher extends Person{
public Teacher(String name, int age) {
super(name, age);
}
@Override
public String getName() {
return "我可以告诉你我的名字,但是是假的";
}
}
class Test {
public static void main(String[] args) {
Person person01 = new Student("kaiven", 20);
Person person02 = new Teacher("jack", 22);
System.out.println(person01.getName());
System.out.println(person02.getName());
}
}
JVM知道应该调用哪个方法的,不用担心。
2024.10.19
writeBy kaiven