SHOW ME THE CODE - 面向对象设计系列
- 1 SHOW ME THE CODE - 面向对象基本概念
- 2 SHOW ME THE CODE - 面向对象程序设计之 - 单一职责原则(SRP)
- 3 SHOW ME THE CODE - 面向对象程序设计之 - 开闭原则(OCP)
- 4 SHOW ME THE CODE - 面向对象程序设计之 - 里氏替换原则(LSP)
- 5 SHOW ME THE CODE - 面向对象程序设计之 - 接口隔离原则(ISP)
Java是一门面向对象语言,Object-Oriented Programing,面向对象编程。今天我们就来带大家了解一下面向对象的一些基本概念,最重要的是SHOW ME THE CODE。
什么是对象
我们先问一下AI 助手:
Physical Object: In the real world, an object is a thing that you can see or touch. This is the most common meaning of the word. Examples of physical objects include your phone, a chair, a tree (though some might argue a tree is a living thing), a book, or a cloud.
所谓对象,就是你能看得见,或者触摸的一个东西。比如说,手机,椅子,桌子,书,大树,云朵等等。
在编程语言中的对象
在面向对象编程语言中,有两个最基本的概念:对象、类
类
是对一类具有共同特征和行为的事物的抽象描述,这是一个模板或者蓝图,用于创建具有相同特性的对象。 类包含了对象的属性(用来描述对象的特征)和方法(用来定义对象的行为)。
在Java 语言中,类就是一个个我们定义的class,
对象
是类的具体实例,它是根据类的定义创建出来的实体。对象通过方法来操作自身的属性和状态。
类与对象比较
特性 | 类 | 对象 |
---|---|---|
抽象程度 | 抽象 | 具体 |
存在形式 | 静态 | 动态 |
属性 | 声明属性 | 存储具体值 |
方法 | 定义方法 | 调用方法 |
创建方式 | 通过 class 关键字定义 | 使用 new 关键字创建 |
类是一个.java文件,通过编译后是一个.class文件,在程序运行时,.class文件会被加载至JVM的方法区(Method Area), 而我们通过new 创建的对象会存放在堆内存区(Heap).
Show Me The Code
我们定义了一个交通工具类:Vehicle.java,它是一个抽象类,我们使用了abstract关键用来标识该类是一个抽象类。
package com.txzq.ood;
public abstract class Vehicle {
//属性定义,我们使用private关键字,将属性私有化
private String type;
private int speed;
private int payloadCapacity;
private int maxOccupancy;
public Vehicle(String type, int speed, int payloadCapacity, int maxOccupancy) {
this.type = type;
this.speed = speed;
this.payloadCapacity = payloadCapacity;
this.maxOccupancy = maxOccupancy;
}
//抽象方法定义
public abstract String toString();
//抽象方法定义
public abstract String transport(String start, String destination);
public String getType() {
return type;
}
public int getSpeed() {
return speed;
}
public int getpayloadCapacity() {
return payloadCapacity;
}
public int getMaxOccupancy() {
return maxOccupancy;
}
}
接着我们定义了一个具体的类:Bike.java, 我们使用了extend关键字,表示继承Vehicle类
package com.txzq.ood;
public class Bike extends Vehicle
{
public Bike(int speed, int payloadCapacity, int maxOccupancy) {
this("Bike", speed, payloadCapacity, maxOccupancy);
}
private Bike(String type, int speed, int payloadCapacity, int maxOccupancy) {
super(type, speed, payloadCapacity, maxOccupancy);
}
public String Fold()
{
System.out.println("The Bike was folded");
}
@Override
public String transport(String start, String destination) {
return "Transporting from "+start+" to "+destination+" by "+ this.getType();
}
@Override
public String toString() {
return "Bike [type=" + this.getType() + ", speed=" + this.getSpeed() + "km/hour, payloadCapacity=" + this.getpayloadCapacity() + "kg, maxOccupancy=" + this.getMaxOccupancy() + " person]";
}
}
接下来创建一个入口程序来创建一辆交通工具,来执行运输任务。
package com.txzq.ood;
public class App {
public static void main(String[] args) {
Vehicle vehicle = new Bike(20, 200, 2);
System.out.println(vehicle);
System.out.println(gotoSomeWhere(vehicle, "北京饭店", "天安门广场"));
vehicle = new Car(200, 500, 5);
System.out.println(vehicle);
System.out.println(gotoSomeWhere(vehicle, "北京饭店", "天安门广场"));
}
public static String gotoSomeWhere(Vehicle vechile, String start, String end)
{
return vechile.transport(start, end);
}
}
面向对象三大特性
- 封装(Encapsulation)
- 继承(Inheritance)
- 多态(Polymorphism)
封装(Encapsulation)
封装,指的是将数据的表示和操作封装在一起,使得数据的内部结构对外界隐藏。在面向对象编程中,类(Class) 是封装的基本单元。类中包含了属性和方法,封装规定了属性只能通过内部方法修改,而不能直接从外部访问。
从我们上面的例子中,属性都是通过private关键字修饰,不能直接被访问(obj.someAttr),必须通过公共方法来访问obj.getSomeAttr()。
//属性定义,我们使用private关键字,将属性私有化
private String type;
private int speed;
private int payloadCapacity;
我们在main()方法中创建了一个vehicle对象,但是,我们没有办法直接访问vehicle的私有属性,我们以speed为例,下面的代码片段上第一种访问方式会造成编译出错。
//我们创建了一个vehicle对象
Vehicle vehicle = new Bike(20, 200, 2);
//下面的写法是错误的,在程序编译的时候,下面这一行会报错
int speed = vehicle.speed;
//正确的方式是
int speed = vehicle.getSpeed();
System.out.println(vehicle);
继承(Inheritance)
继承指的是一个类可以从另一个类继承属性和方法,而继承的关系通常通常是“IS-A”的关系,例如,自行车是一种交通工具。在Java中,使用extends关键字来表示继承。
public class Bike extends Vehicle{
...
...
public String Fold()
{
System.out.println("The Bike was folded");
}
@Override
public String transport(String start, String destination) {
return "Transporting from "+start+" to "+destination+" by "+ this.getType();
}
...
...
}
这里需要注意的是,Vehicle是一个抽象类,抽象类中定义了两个抽象方法,所以当Bike继承Vehicle时,需要实现这两个抽象方法。这也是我们常听到的一个概念:Override,重写,也叫方法重写(Method Override)。
使用@Override注解,来实现方法重写。重写时,返回值类型和方法名称,参数要保持一致。
另外,Bike还多了一个独有的行为:Fold(),表示Bike可以被折叠。
多态(Polymorphism)
多态可以表现为多种形式,一种是面向抽象编程,如上面的例子中,
我们通过Vechile来定义对象,而创建对象的时候,可以是new一个Bike,也可以是new一个Car,但不管是Bike还是Car,他们都有transport这个行为。
例子中,gotoSomeWhere方法接收的是Vechile对象,在实际执行时,会根据Vechile的具体类型输出相应的结果。
Vehicle vehicle = new Bike(20, 200, 2);
vehicle = new Car(200, 500, 5);
gotoSomeWhere(vehicle, "北京饭店", "天安门广场");
}
//接收Vechile类型的对象,实际会调用具体类型的transport方法输出结果。
public static String gotoSomeWhere(Vehicle vechile, String start, String end)
{
return vechile.transport(start, end);
}
而另一种多态的形式就是方法的重载(Method Overloading),即方法名是相同的,但参数类型不相同。
class Math
{
public int add(int a, int b)
{
return a + b;
}
public double add(double a, double b)
{
return a + b;
}
}
总结
以上就是面向对象中几个最基本且最重要的概念,希望上面的讲解能够帮助大家理解这几个重要的概念。
欢迎关注我的公众号。