Java面向对象三大特性
引
一、面向对象是什么?
面向对象(Object Oriented,OO)是软件开发方法,一种编程范式。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、人工智能等领域。
Java是面向对象的高级编程语言,类和对象是Java程序的核心构成。 对象就是真实世界中的实体,对象与实体是一一对应的
类:抽象的概念集合,是一个共性的产物,类中定义属性(特征)和方法(行为)。如:人类,具有共性的特征都有鼻子、眼睛、头发等;具有共性的行为有吃饭、睡觉、走路等
对象:对象是一种个性的表示,表示一个独立的个体,每个对象有自己独立的属性和行为,由此来区分不同的对象。
总结:类是对象的模板,对象是类的实例。
二、面向对象三大特性
面向对象三大特性为:继承、封装、多态3个核心特性
继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类,继承关键字为extends
继承就是子类继承父类的特征和行为,使子类对象(实例)具有父类的实例域和方法,或从父类继承方法,使得子类具有父类相同的行为。
虽然素草动物和肉食动物都是属于动物,但是两者的属性和行为上有差别,所以子类会具有父类的一般特性也会具有自身的特性。
/**
* 动物类
* @author 进击的java君
* @date 2021-08-24
*/
public class Animal {
// 共有特征
public String name;
// 共有行为
public void eat(){
System.out.println("动物都要吃饭!!");
}
}
/**
* 素食动物类
* @author 进击的java君
* @date 2021-08-24
*/
public class VegetarianAnimal extends Animal{
// 子类继承了父类,从而得到了父类相同的行为
// @Override关键字,表示方法重写(如:若不写@Override,系统认为是子类定义的新方法,不会报错)
@Override
public void eat(){
System.out.println("素食动物一般都吃草");
}
}
/**
* 肉食动物类
* @author 进击的java君
* @date 2021-08-24
*/
public class PredatorAnimal extends Animal {
@Override
public void eat(){
System.out.println("肉食动物一般都吃肉");
}
}
封装 核心思想就是“隐藏细节”、“数据安全”:将对象不需要让外界访问的成员变量和方法私有化,只提供符合开发者意愿的公有方法来访问这些数据和逻辑,保证了数据的安全和程序的稳定。
使用 private
修饰符把成员变量设置为私有,防止外部程序直接随意调用或修改成员变量,然后对外提供 public
的 set
和 get
方法按照开发者的意愿(可以编写一些业务逻辑代码,虽然很少这样做)设置和获取成员变量的值。
Java 中主要有 private、protected、public 和 default访问权限 四种:
public 修饰符,具有最大的访问权限,可以访问任何一个在 CLASSPATH 下的类、接口、异常等。
protected修饰符,主要作用就是用来保护子类,子类可以访问这些成员变量和方法,其余类不可以。
default修饰符,主要是本包的类可以访问。
private 修饰符,访问权限仅限于本类内部,在实际开发过程中,大多数的成员变量和方法都是使用 private 修饰的。
/**
* 动物类
* @author 进击的java君
* @date 2021-08-24
*/
public class Animal {
// 使用 private 关键字把成员变量私有化
private String name;
// 对外提供访问、设置成员变量的 public 方法
// 这样就可以按照我们自己的意愿来访问、设置成员变量
// 而且也有助于在方法内部对数据有效性进行验证
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
}
多态 多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作,如图所示:
多态存在的三个必要条件:
- 继承
- 重写
- 父类引用指向子类:Parent p =new Child();
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pV2vUsnG-1629982117100)(C:\Users\user\AppData\Roaming\Typora\typora-user-images\image-20210824234603853.png)]
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。
以下是一个多态实例的演示,详细说明请看注释:
public class Test {
public static void main(String[] args) {
show(new Cat()); // 以 Cat 对象调用 show 方法
show(new Dog()); // 以 Dog 对象调用 show 方法
Animal a = new Cat(); // 向上转型
a.eat(); // 调用的是 Cat 的 eat
Cat c = (Cat)a; // 向下转型
c.work(); // 调用的是 Cat 的 work
}
public static void show(Animal a) {
a.eat();
// 类型判断
if (a instanceof Cat) { // 猫做的事情
Cat c = (Cat)a;
c.work();
} else if (a instanceof Dog) { // 狗做的事情
Dog c = (Dog)a;
c.work();
}
}
}
abstract class Animal {
abstract void eat();
}
class Cat extends Animal {
public void eat() {
System.out.println("吃鱼");
}
public void work() {
System.out.println("抓老鼠");
}
}
class Dog extends Animal {
public void eat() {
System.out.println("吃骨头");
}
public void work() {
System.out.println("看家");
}
}
吃鱼 抓老鼠 吃骨头 看家 吃鱼 抓老鼠