面向对象(封装,继承,多态)

时隔一周,小的终于学完面向对象了。接下来给各位观众老爷一起分享学习,如有错误遗漏之处请多指教!

 

开篇先抛出一个问题:大家知道Java面向对象的三大基本特征吗?可能有观众老爷会说,这简单啊 !封装、继承、多态。那再接着问,什么是封装、继承、多态呢?别着急,请听我细细道来...

一、封装

封装就是把过程和数据包围起来,对数据的访问只能通过已定义的接口。

原则:

  1. 将类的某些信息隐藏在类内部,不允许外部程序直接访问
  2. 通过该类提供的方法来实现对隐藏信息的操作和访问

好处:

  1. 提高代码的安全性
  2. 把代码用方法进行封装,提高了代码的复用性

1.1 private关键字

1.是一个权限修饰符
2.可以修饰成员(成员变量和成员方法)

3.作用是保护成员不被别的类使用,被private修饰的成员只在本类中才能访问

注意:针对private修饰的成员变量,如果需要被其他类使用,提供相应的操作

  • 提供get变量名()方法,用于获取成员变量的值,方法用public修饰

  • 提供set变量名(参数)方法,用于设置成员变量的值,方法用public修饰

关键字使用:

  • 把成员变量用private修饰
  • 提供对应的getXxx()/setXxx()方法 

例如: 创建一个学生类

public class Student {
    private String name; //姓名
    private String sex;// 性别
    private int age; //年龄

    /*提供对应的getXxx()/setXxx方法
       按住ALT+insert键 选中Getter and Setter
    */

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

如上代码,一个标准的学生类就创建好了。

1.2 this关键字

在上述代码中我们可以看见在set()方法中有一个this,这个this在Java中也是一个关键字。

this修饰的变量用于指代成员变量
方法的形参如果与成员变量同名,不带this修饰的变量指的是形参,而不是成员变量
方法的形参没有与成员变量同名,不带this修饰的变量指的是成员变量

 那么什么时候使用this关键字呢?

        解决局部变量隐藏成员变量

我们在代码中可以看到,在这个学生类中有成员变量name,在提供的成员方法中也有一个局部变量name,那么显然成员变量与局部变量重名了。那么在我们调用setXxx()方法时,就需要一个this关键字来指向我们的成员变量,这样才能把值赋给我们的成员变量。

大家可以自己动手试一试,例如把上面的学生类中的setSex()方法中的this.sex = sex;改成sex = sex;然后在测试类中进行操作打印,看控制台输出的结果是怎样的?

二、继承

面向对象三大特征之一

使子类有了父类的属性与方法,也可以在子类中重新定义以及追加属性和方法

优点:

  • 继承可以让类与类之间产生关系,子父类关系产生子父类后,子类则可以使用父类中非私有的成员。
  • 提高代码复用性维护性

缺点:

  • 类的耦合性增强了,削弱了子类的独立性 

2.1 extends关键字

格式:class 子类 extends 父类{}

例如:

创建父类:

public class A {
    int a = 1;
    double d = 2.0;
    public void show(){
        System.out.println("Class A: a=" + a + "\td=" + d);

    }
}

创建类B使用extends关键字继承类A,成为类A的子类

public class B extends A {
    float a = 3.0f;
    String d = "Java program.";

    public void show() {
        
        System.out.println("Class B: a=" + a + "\td=" + d);
    }
}

上述代码就是一个简单的继承。

接下来说明一下继承中访问变量的特点:采用的是就近原则。

解释一下:

  • 子类局部范围找
  • 子类成员范围找
  • 父类局部范围找
  • 父类成员范围找
  • 如果都找不到就报错

我们来测试一下: 依旧是上面的例子

我们创建一个测试类:

public class Test {
    public static void main(String[] args) {
        A a = new A(); //创建父对象
        a.show();
        B b = new B(); //创建子对象
        b.show();
    }
}

点击运行查看测试结果:

 我们可以看出子对象输出的结果是Class B: a=3.0    d=Java program.再回到子类的代码中

public class B extends A {
    float a = 3.0f;
    String d = "Java program.";

    public void show() {
       System.out.println("Class B: a=" + a + "\td=" + d);
    }
}

我们可以看到B类虽然继承了A类,但是在访问变量时,仍是先访问的子类范围内的成员变量以及方法。

2.2 super关键字

super:代表父类存储空间的标识(可以理解为父类对象引用)

前面我们学习了this关键字,在这里我们说明一下区别:

成员变量:

  this.成员变量    -   访问本类成员变量

  super.成员变量 -   访问父类成员变量

成员方法:

  this.成员方法  - 访问本类成员方法

  super.成员方法 - 访问父类成员方法

构造方法:

  this(…)  -  访问本类构造方法

  super(…)  -  访问父类构造方法

       子类初始化之前,一定要先完成父类数据的初始化
        每一个子类构造方法的第一条语句默认都是: super()

接下来看如何使用:

依旧是之前的A和B类,但是这次我们在B类的show()方法中加入一句super.show();

public class B extends A {
    float a = 3.0f;
    String d = "Java program.";

    public void show() {
        super.show();
        System.out.println("Class B: a=" + a + "\td=" + d);
    }
}

点击运行,控制台输出:

 

 这次我们可以看到控制台多打印了一次Class A: a=1    d=2.0 这正是super的作用,访问父类中的成员方法。

2.3 方法重写

重写概念:子类出现了和父类中一模一样的方法声明(方法名一样,参数列表也必须一样)

应用场景:当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容

Override注解:用来检测当前的方法,是否是重写的方法,起到【校验的作用

注意事项:

  1. 私有方法不能被重写(父类私有成员子类是不能继承的
  2. 子类方法访问权限不能更低(public > 默认 > 私有)

2.4 继承注意事项

  1. Java中类只支持单继承,不支持多继承
  2. Java中类支持多层继承

三、多态

         多态:      同一个对象,在不同时刻表现出来的不同形态 

        前提条件:

               要有继承/实现关系

               要有方法重写

               要有父类引用指向子类对象

3.1 访问特点

        多态中成员变量的访问特点是什么

               编译看左边、运行看左边

        多态中成员方法的访问特点是什么

               编译看左边、运行看右边

3.2 多态的优劣性、

        优点:

                提高了代码的扩展性。

               定义方法时,如果将父类型作为参数,在使用方法时,可以传递任意子类对象

        弊端:

                不能使用子类特有的成员

3.3 多态中的转型

多态中的 向上转型

               父类引用指向子类对象其实就是向上转型。例如:

                       Animal a = new Dog();

多态中的 向下转型

               将父类型的引用转换成具体的子类对象。转换格式:

               ​​​​​​​        子类 对象名 = (子类)父类引用;

以上就是我今天分享的内容,如有错误遗漏之处请多指出!

おすすめ

転載: blog.csdn.net/Michelhjx/article/details/120971601