面向对象三大特征

ゝ一纸荒年。 2022-06-11 04:12 410阅读 0赞

面向对象三大特征:
1、继承
2、封装

3、多态

1 、封装性(Encapsulation)

封装的概念

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

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

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

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

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

  1. public class Student {
  2. int age;//年龄
  3. }

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

  1. public static void main(String[] args) {
  2. Student student = new Student();
  3. student.age = -1;
  4. }

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

那么怎么解决这个问题?

private

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

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

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

  1. public class Student {
  2. private int age;//年龄
  3. }

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

  1. public static void main(String[] args) {
  2. Student student = new Student();
  3. student.age = 999;//这行代码报错,找不到age属性。因为该属性,被 private 修饰,所以只有Student 本类才能访问。
  4. }

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

get和set方法

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

  1. public class Student {
  2. private int age;//年龄
  3. public int getAge() {
  4. return age - 3;
  5. }
  6. public void setAge(int age) {
  7. if (age<100&&age>0) {
  8. this.age = age;
  9. }else{
  10. System.out.println("设置的age不合法");
  11. this.age = 18;//如果设置非法年龄,自动设置age默认为18
  12. }
  13. }
  14. }

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

  1. public static void main(String[] args) {
  2. Student student = new Student();
  3. student.setAge(999);
  4. System.out.println("年龄为:"+student.getAge());
  5. //控制台将输出:
  6. //设置的age不合法
  7. //年龄为:18
  8. }

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

2、继承

继承的概念

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

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

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

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

类的继承的使用

语法

Java中继承使用关键字 extends

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

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

特点

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

正确的示例:

  1. public class SubClass extends SuperClass{//正确
  2. }

错误的示例:

  1. public class SubClass extends SuperClass1, SuperClass2{ //错误,不能继承多个父类
  2. }
  1. java支持多层继承(继承体系)。B继承A, C可以再继承B

例如:

  1. public class A{
  2. }
  3. public class B extends A{
  4. }
  5. public class C extends B{
  6. }
  1. 一个儿子只能有一个亲爹,而一个父亲可以有多个儿子。即:一个类只能有一个父类,而一个类可以有多个子类。

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

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

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

多态的体现

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

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

代码示例:

父类:

  1. public class FatherClass {
  2. public void show() {
  3. System.out.println("父类的方法");
  4. }
  5. }

子类:

  1. public class ChildClass extends FatherClass {
  2. @Override
  3. public void show() {
  4. System.out.println("子类的方法");
  5. }
  6. }

多态:

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

程序将在控制台输出:

Center

动态多态和静态多态

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

注意: 多态是父类的引用类型变量指向了子类的对象或者是接口类型的引用类型变量指向了接口实现类 的对象。

发表评论

表情:
评论列表 (有 0 条评论,410人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java 面向对象特征

    Java是一种面向对象的编程语言,其中包含三大特征: 1. 封装:封装是指将类的接口和实现分开,并将实现隐藏在类内部。这样,其他类就无法直接访问类的内部实现,只能通过公共的

    相关 面向对象基本特征

    面向对象之“封装” 首先,一类事物有它的属性和行为(方法),其中属性描述同一类事物的特征,行为可以描述事物可以做的操作。 封装就是将同一类事物的共同点(属性和行为)归到

    相关 面向对象特征

    面向对象的三大特征:封装,继承,多态 封装性在java当中的体现: 1. 方法就是一种封装 2. 关键字private也是一种封装 封装就是将一些细节信息隐藏起来,

    相关 面向对象特征

           最近刚开始学习设计模式,在学习初期,把面向对象这个概念弄明白是很有必要的。        之前接触过C语言的基础,后来又学了一点VB,不过这都不是面向

    相关 面向对象特征

    封装 啥是封装?它是面向对象的三大基本特征之一,通俗的理解就是,把对象的状态信息啥的隐藏在对象的内部,外接是无法直接操作对象的状态信息的,要想操作只能通过类对外开放的方法