一、概念
面向对象编程(Object-Oriented Programming,简称 OOP)是一种编程范式,它使用“对象”来设计软件。在 OOP 中,对象是数据(即类的实例变量,有时称为属性或字段)以及可以对这些数据执行的操作(即方法或函数)的封装。OOP 的主要目标是提高代码的可重用性、灵活性和扩展性。
这些代码示例很好地展示了面向对象编程(OOP)中的几个核心概念,包括封装、继承、多态以及接口的应用。下面是对这些代码如何体现OOP特性的分析:
封装(Encapsulation)
Book 类中,属性 name, price, author, type 都是私有的 (private),并通过 getter 和 setter 方法来访问和修改这些属性。这表明了封装的原则,即隐藏对象内部的实现细节,并通过公共方法来访问这些内部状态。
继承(Inheritance)
Cat 和 Mao 类都继承自 Animal 类。这意味着 Cat 和 Mao 类自动获得了 Animal 类中的所有公共属性和方法,并可以添加自己的特定功能。
在 CatTest 类中的 main 方法里,可以看到 Animal mao=new Mao(); 这样的代码,表明 Mao 类可以被当作 Animal 类来使用,这也是继承的一种表现。
多态(Polymorphism)
CatTest 类中的 main 方法里,Animal mao=new Mao(); 这一行代码展示了多态性。虽然 mao 是 Animal 类型的引用,但实际上它引用的是 Mao 类的一个实例。这种情况下,mao 可以调用 Mao 类特有的方法,如 setEyes(),这展示了多态的特点。
同样地,Animal cat=new Cat(); 也展示了多态的特性。
抽象(Abstraction)
Animal 类为 Cat 和 Mao 提供了一个抽象的基础,虽然这里没有使用抽象类关键字 abstract,但是 Animal 类作为一个基类,提供了通用的行为和状态,这也可以被视为一种抽象的形式。
接口(Interface)
TestService 接口中定义了一个名为 saySomething 的方法。TestServiceImpl 类实现了这个接口,并提供了该方法的具体实现。这表明了接口在定义行为规范方面的用途,并展示了实现接口的具体方式。
综上所述,这段代码通过不同的方式展现了面向对象编程的主要特性,包括封装、继承、多态以及接口的使用。
二、代码示例
封装(Encapsulation)
public class Book {
//书名
private String name;
//价格
private double price;
//作者
private String author;
//类目
private String type;
//无参构造
public Book() {}
/**
* Book类的有参数构造方法
* @param name 书名
* @param price 价格
* @param author 作者
* @param type 类目
*/
public Book(String name, double price, String author, String type) {
this.name = name;
this.price = price;
this.author = author;
this.type = type;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", price=" + price +
", author='" + author + '\'' +
", type='" + type + '\'' +
'}';
}
}
class BookTest {
public static void main(String[] args) {
// 创建Book对象并初始化
Book book = new Book("JDK学习笔记", 99.6, "林信良", "编程类");
Book book2 = new Book();
// 输出书名
System.out.println(book.toString());
}
}
在这个例子中,Book 类的属性都是私有的,并且提供了公共的 getter 和 setter 方法来访问这些属性,这体现了封装的思想。
继承(Inheritance)
//父类 生物
public class Animal {
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;
}
public Animal() {}
private String name;
private int age;
@Override
public String toString() {
return "Animal{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
class Mao extends Animal {
@Override
public String toString() {
return "Mao{" +
"isEyes=" + isEyes +
'}';
}
public boolean isEyes() {
return isEyes;
}
public void setEyes(boolean eyes) {
isEyes = eyes;
}
private boolean isEyes;
public Mao(boolean isEyes) {
this.isEyes = isEyes;
}
public Mao() {}
}
class Cat extends Animal {
public Cat(String tail) {
this.tail = tail;
}
private String tail;
@Override
public String toString() {
return "Cat{" +
"tail='" + tail + '\'' +
'}';
}
public String getTail() {
return tail;
}
public void setTail(String tail) {
this.tail = tail;
}
public Cat() {}
}
class CatTest {
public static void main(String[] args) {
Mao bigMao = new Mao();
bigMao.setName("大毛");
bigMao.setAge(20);
bigMao.setEyes(true);
Animal mao = new Mao();
Animal cat = new Cat();
System.out.println(mao.toString());
}
}
在这个例子中,Mao 和 Cat 类继承了 Animal 类,这使得它们共享了 Animal 类的属性 name 和 age,同时还增加了各自的特定属性和方法,如 Mao 类的 isEyes 属性和 Cat 类的 tail 属性。
多态(Polymorphism)
class CatTest {
public static void main(String[] args) {
Mao bigMao = new Mao();
bigMao.setName("大毛");
bigMao.setAge(20);
bigMao.setEyes(true);
Animal mao = new Mao();
Animal cat = new Cat();
System.out.println(mao.toString());
}
}
这里展示了多态性,即 mao 和 cat 都是 Animal 类型的引用,但它们实际上分别是 Mao 和 Cat 类的实例。这使得我们可以在运行时决定实际执行哪个子类的方法。
接口(Interface)
public interface TestService {
/**
* 随便说点什么
* @param msg 要说的话
* @return 经过处理后的值
*/
String saySomething(String msg);
}
public class TestServiceImpl implements TestService {
@Override
public String saySomething(String msg) {
return "ken说" + msg;
}
}
class TestServiceTest {
public static void main(String[] args) {
TestService testService = new TestServiceImpl();
System.out.println(testService.saySomething("123"));
}
}
在这个例子中,TestService 接口定义了一个方法 saySomething,而 TestServiceImpl 类实现了这个接口并提供了具体的方法实现。接口提供了一种多态的形式,即任何实现了该接口的类都可以被当作 TestService 对象来对待。