面向对象三大特征

时间:2022-01-22 21:52:59
面向对象三大特征:
1、继承
2、封装

3、多态


1 、封装性(Encapsulation)


封装的概念

高度概括:对属性的访问做限制

在java中类的封装性主要体现不能让外部随意修改一个成员变量的值,否则会引起很多逻辑上的错误,以及一些不可预知的错误。

在定义一个类的成员(包括变量和方法),使用private关键字说明这个成员的访问权限,只能被这个类的其他成员方法调用,而不能被其他的类中的方法所调用;为实现封装性,常将类的成员变量声明为private,再通过public的方法来对这个变量进行访问。对一个变量的操作,一般都有 读取和赋值操作,我们一般定义两个方法来实现这两种操作,即:getXxx()与setXxx();

一个类就是一个模块,我们应该让模块仅仅公开必须要让外界知道的内容,而隐藏其他的一切内容。再进行程序设计时,应尽量避免一个模块直接修改或操作另一个模块的数据,模块设计追求强内聚(许多功能尽量在类的内部独立完成,不让外面干预),弱耦合(提供给外部尽量少的方法调用)。

假设:有 Student 的学生类,里面有一个属性 age,年龄
  
  public class Student {

int age;//年龄

}

问:这么访问属性有没有问题?

  public static void main(String[] args) {

Student student = new Student();
student.age = -1;

}


答:显示生活中,年龄有999岁的吗?随意访问age属性,明显问题就出现了。

那么怎么解决这个问题?

private

Java*四种权限修饰符:public、private、protected、default(默认,什么都不写,也称为包访问权限)

而被 private 修饰的属性和方法的特点是:只有当前类才能访问。


解决上面的问题,首先使用private私有age属性:


  
  public class Student {

private int age;//年龄

}



但是,此时如果是在其他类中使用一下代码,会出现无法访问的问题:


   
 public static void main(String[] args) {

Student student = new Student();
student.age = 999;//这行代码报错,找不到age属性。因为该属性,被 private 修饰,所以只有Student 本类才能访问。

}



如果解决该问题?被 private 修饰的属性,怎么在外部类去修改该属性值?

 get和set方法

使用get和set方法是为了程序的封装,为了其它的类可以使用(设置set和获取get)该类的私有属性和方法。
   
 public class Student {

private int age;//年龄


public int getAge() {
return age - 3;
}

public void setAge(int age) {
if (age<100&&age>0) {
this.age = age;
}else{
System.out.println("设置的age不合法");
this.age = 18;//如果设置非法年龄,自动设置age默认为18
}

}
}

这样就可以通过 public 的 get和set 方法,让外部类去访问 Student 私有的属性 age了。但访问受到了限制:

 public static void main(String[] args) {

Student student = new Student();
student.setAge(999);

System.out.println("年龄为:"+student.getAge());

//控制台将输出:
//设置的age不合法
//年龄为:18
}

get 和 set 是为了程序的封装,封装是为了对 外部类访问本类属性和方法做限制

 2、继承

 继承的概念

一个类继承另一个类。实现继承的类称为子类(subclass)也叫派生类,而被继承的类称为父类,也叫超类或基类。

通过“继承”一个现有的类,可以在子类中使用被继承的的类(父类)中的非私有的属性和方法。

类的方法和属性可以被继承,但是类的构造器(构造方法)不能被继承

假如多个类有相同的属性和方法,那么就可以创建一个具有他们共同属性和方法的类作为父类(基类),让子类来实现该父类,根据实际业务需求来添加新的属性和方法。

 类的继承的使用

 语法

Java中继承使用关键字 extends

    [权限修饰符]  class  <类名>  extends <父类名>
    {   
    //类中代码
    }

在java中一个类只能有一个直接父类,即:java只支持单继承(亲爹只能有一个。干爹可以有多个,学习接口时会学到),不支持多继承。(与C++不同)

 特点

1. 子类可以访问父类中非私有的成员变量和方法。
2. java只支持单继承不支持多继承:一个类最多只能有一个直接父类


正确的示例:

  
  public class SubClass extends SuperClass{//正确

}


错误的示例:

 public class SubClass extends SuperClass1, SuperClass2{ //错误,不能继承多个父类

}

1. java支持多层继承(继承体系)。B继承A, C可以再继承B

例如:


  
  public class A{

}

public class B extends A{

}

public class C extends B{

}


1. 一个儿子只能有一个亲爹,而一个父亲可以有多个儿子。即:一个类只能有一个父类,而一个类可以有多个子类。


3、多态
 什么是多态(具有多种形态)

在java中,一个对象的引用会有两种类型:1、编译时类型 2、运行时类型。编译时类型由声明该变量时使用的类型决定(赋值运算符左边),运行时类型由实际赋给该变量的对象决定(赋值运算符右边)。如果编译时类型和运行时类型不一致,就会出现所谓的多态(Polymorphism)。

可以这么理解:定义一个引用变量,编译时是否能够通过要看赋值运算符的左边。运行时的实际表现要看赋值运算符的右边。

 多态的体现

多态只体现在 对象的方法中,属性(成员变量)和静态方法不具有多态性。

Java 的多态机制遵循一个原则:当父类引用变量指向子类对象时,对象的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在父类中定义过的,也就是说被子类继承的方法或重写的方法。

代码示例:


父类:

  public class FatherClass {

public void show() {
System.out.println("父类的方法");
}
}


子类:


   
 public class ChildClass extends FatherClass {

@Override
public void show() {
System.out.println("子类的方法");
}
}



多态:


   
public static void main(String[] args) {
FatherClass fClass = new ChildClass();
fClass.show();
}




程序将在控制台输出:

面向对象三大特征

  动态多态和静态多态

1. 静态多态性指的是程序在编译时,系统就能决定调用哪个函数,如重载。 
2. 动态多态性指在运行中才能动态确定操作指针所指的对象,主要通过抽象函数和重写来实现。