三大特性
封装
利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体。数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。用户无需知道对象内部的细节,但可以通过对象对外提供的接口来访问该对象。
具体实现:将数据和代码封装在一个类中,通过访问控制修饰符(public、private、protected)来控制数据的访问权限,防止外部代码对数据的直接访问和修改。这样可以保证数据的安全性和完整性,同时也提高了代码的可维护性和可读性。
继承
继承实现了 IS-A 关系,例如 Cat 和 Animal 就是一种 IS-A 关系,因此 Cat 可以继承自 Animal,从而获得 Animal 非 private 的属性和方法。
通过继承机制,子类可以继承父类的属性和方法,并可以在此基础上进行扩展和重写。这样可以大大减少代码的冗余,提高代码的复用性和可扩展性。
继承应该遵循里氏替换原则,子类对象必须能够替换掉所有父类对象。
多态
多态分为编译时多态和运行时多态:
编译时多态主要指方法的重载
运行时多态指程序中定义的对象引用所指向的具体类型在运行期间才确定
运行时多态三个条件:
继承
覆盖(重写)
向上转型
面对对象开发过程:
- OOA(面向对象分析)
- OOD(面向对象设计)
- OOP(面向对象编程)
对象:对象是类的一个实例,它具有自己的属性和行为(方法),先有对象再有类。
类:类是多个对象的集合体,它描述一类对象的行为和状态。
实例展示
首先创建一个老师的类
public class Teather {
// 姓名、年龄、性别、职称、所在院系、是否党员、所授课程;
// 方法:上课;
protected String name;
protected String age;
protected String sex;
protected String rank;
protected String college;
protected String isPartyMember;
protected String SelectedCourse = "";
//创建老师类的set和get方法
public void setName(String value) {
name = value;
}
public void setAge(String value) {
age = value;
}
public void setSex(String value) {
sex = value;
}
public void setRank(String value) {
rank = value;
}
public void setCollege(String college) {
this.college = college;
}
public void setIsPartyMember(String isPartyMember) {
this.isPartyMember = isPartyMember;
}
public void setSelectedCourse(String selectedCourse) {
System.out.println("You are selecting the course of " + selectedCourse + "!");
if(SelectedCourse !=" ")
SelectedCourse = SelectedCourse + "," + selectedCourse;
else
SelectedCourse = SelectedCourse + selectedCourse;
}
public String getName() {
return name;
}
public String getAge() {
return age;
}
public String getSex() {
return sex;
}
public String getRank() {
return rank;
}
public String getSelectedCourse() {
return SelectedCourse;
}
public String getIsPartyMember() {
return isPartyMember;
}
public String getCollege() {
return college;
}
public void deliverCourse(String selectedCourse) {
System.out.println("You are delivering " + selectedCourse + "!");
SelectedCourse = SelectedCourse + "," + selectedCourse;
}
}
再创建一个导师的类来继承老师的类(同时进行重载和重写)
public class Supervisor extends Teather{
//导师类继承老师类
//同时对导师中的属性进行添加
protected String direction;
protected String tClass;
//在导师类中创建study方法
public void study(String tDirection){
System.out.println("你正在研究课题"+tDirection+"。");
}
//对study方法进行重载
public void study(String tDirection,String tRank){
System.out.println("你正在研究"+tRank+tDirection+"。");
//对老师类中的deliverCourse方法进行重写(delivering改为studying)
public void deliverCourse(String selectedCourse) {
System.out.println("You are studying " + selectedCourse + "!");
SelectedCourse = SelectedCourse + "," + selectedCourse;
}
}
注意:接口里的变量都隐式声明为 public static final,而接口里的方法默认情况下访问权限为 public
创建对象
使用 new 关键字:这是创建对象最常见的方式,通过使用 new 关键字可以在堆内存中分配一块新的内存空间来存储对象,然后返回对象的引用。例如:Person person = new Person();
使用 Class 类的 newInstance() 方法:Class 类是 Java 中描述类的元信息的类,可以通过它的 newInstance() 方法动态地创建对象。例如:Person person = (Person) Class.forName("com.example.Person").newInstance();
使用 Constructor 类的 newInstance() 方法:Constructor 类是 Java 中描述构造方法的类,可以通过它的 newInstance() 方法动态地创建对象。例如:Constructor constructor = Person.class.getConstructor(); Person person = constructor.newInstance();
使用 clone() 方法:clone() 方法可以复制一个对象,创建一个新的对象,并且两个对象的内容相同。注意,使用 clone() 方法需要实现 Cloneable 接口。例如:Person person = new Person(); Person newPerson = (Person) person.clone();
使用反序列化(Serialization):反序列化可以将一个对象从字节流中还原出来,实现对象的创建。例如:ObjectInputStream in = new ObjectInputStream(new FileInputStream("person.out")); Person person = (Person) in.readObject();
接口的抽象方法都需要重写,类中的属性默认具有final和static属性即变量初始化后不可更改