前言
面向对象三大特性是 封装、继承、多态,设计模式几乎都以此为基础,这些特性是面向对象语言所具备的。
一、是什么?
一 . 封装
是面向对象编程语言对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界是无法直接操作的
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问
成员变量为private,提供对应的getXxx()/setXxx()方法
优点
通过方法来控制成员变量的操作,提高了代码的安全性;把代码用方法进行封装,提高了代码的复用性
二 . 继承
可以使得子类具有父类的属性和方法,还可以在子类中重新定义,以及追加属性和方法
一个新类继承了原有类的属性和方法,并增加了自己的新属性和新方法,称之为派生类,派生类就继承了原有类;
当子类继承父类的时候,子类不继承父类的构造函数,但是子类生成对象时(new Student())默认会先执行父类无参的构造函数
当父类定义有参构造函数时,需要手动书写无参函数,避免报错。
优点
减少了类的冗余代码,同时让类与类之间产生关系,为多态打下基础
继承可以让类与类之间产生关系,子父类关系,产生子父类后,子类则可以使用父类中非私有的成员。
提高了代码的复用性(多个类相同的成员可以放到同一个类中)
提高了代码的维护性(如果方法的代码需要修改,修改一处即可
弊端
继承让类与类之间产生了关系,类的耦合性增强了,当父类发生变化时子类实现也不得不跟着变化,削弱了子类的独立性
考虑应用范围,类与类之间是否存在is..a的关系(谁是谁的一种),不能随意继承(例如:老师和学生是人的一种,那人就是父类,学生和老师就是子类)
三 . 多态
前提
- 要有继承或实现关系
- 要有方法的重写
- 要有父类引用指向子类对象
多态性(polymorphisn)是允许将父对象设置成为和一个或更多的他的子对象相等的方法,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。
实现多态,有二种方式,覆盖,重载。
覆盖,是指子类重新定义父类的虚函数的做法。
重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。
好处
提高程序的扩展性。定义方法时候,使用父类型作为参数,在使用的时候,使用具体的子类型参与操作
弊端
二、怎么实现?
一 . 封装(标准类的制作)
class Student {
//成员变量
private String name;
private int age;
//构造方法
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
//成员方法
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public void show() {
System.out.println(name + "," + age);
}
}
二 . 继承
public class Fu {
public void show() {
System.out.println("show方法被调用");
}
}
public class Zi extends Fu {
public void method() {
System.out.println("method方法被调用");
}
}
public class Demo {
public static void main(String[] args) {
//创建对象,调用方法
Fu f = new Fu();
f.show();
Zi z = new Zi();
z.method();
z.show();
}
}
三 . 多态
需求:请采用多态的思想实现猫和狗的案例,并在测试类中进行测试
//测试类
public class AnimalDemo {
public static void main(String[] args) {
//创建猫类对象进行测试
Animal a = new Cat();
a.setName("加菲");
a.setAge(5);
System.out.println(a.getName() + "," + a.getAge());
a.eat();
a = new Cat("加菲", 5);
System.out.println(a.getName() + "," + a.getAge());
a.eat();
}
}
//动物类
public class Animal {
private String name;
private int age;
public Animal() {
}
public Animal(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;
}
public void eat() {
System.out.println("动物吃东西");
}
}
//猫类
public class Cat extends Animal {
public Cat() {
}
public Cat(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
//狗类
public class Dog extends Animal {
public Dog() {
}
public Dog(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("狗吃骨头");
}
}
总结
以上就是今天要讲的内容,本文浅述了面向对象三大特征的基础概念和理解。封装,目的是增强数据安全性、简化编程;继承,指将多个相同的属性和方法提取出来,新建一个父类,目的是代码复用;最后一个多态,目的是增加代码的灵活度。