Java面向对象的三大特性总结(封装性、继承性、多态性)

Java面向对象的三大特性总结(封装性、继承性、多态性)

面向对象的三大特性

(封装性、继承性、多态性)

1、面向对象: 面向对象思想就是在计算机程序设计过程中,参照现实中事物,将事物的属性特征、行为特征抽象出来,描述成计算 机事件的设计思想。它区别于面向过程思想,强调的是通过调用对象的行为来实现功能,而不是自己一步一步的去 操作实现。
举例:
洗衣服: 面向过程:把衣服脱下来-->找一个盆-->放点洗衣粉-->加点水-->浸泡10分钟-->揉一揉-->清洗衣服-->拧干-->晾 起来 面向对象:把衣服脱下来-->打开全自动洗衣机-->扔衣服-->按钮-->晾起来
2、类: 是一组相关属性和行为的集合。可以看成是一类事物的模板,使用事物的属性特征和行为特征来描述该 类事物。
现实中,描述一类事物:
属性:
就是该事物的状态信息。行为:就是该事物能够做什么。
3、对象: 是一类事物的具体体现。对象是类的一个实例(对象并不是找个女朋友),必然具备该类事物的属性 和行为。
4、类与对象的关系:
类是对一类事物的描述,是抽象的。对象是一类事物的实例,是具体的。类是对象的模板,对象是类的实体。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191025201923204.png?) 两个对象,调用同一方法内存图 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20191025202046244.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaW1hMw==,size_16,color_FFFFFF,t_70) 一个引用,作为参数传递到方法中内存图 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20191025202021325.png?)

封装:

封装可以被认为是一个保护屏障,防止该类的代码和数据被其他类随意访问。 封装步骤:
1. 使用 private 关键字来修饰成员变量。
2. 对需要访问的成员变量,提供对应的一对 getXxx 方法 、 setXxx 方法。

继承:

继承是多态的前提,没有继承,就没有多态。
继承主要解决的问题:
共性抽取,解决代码重复冗余的问题。
特点:
java值支持单继承,不支持多继承,即一个类不能有多个父类,但是java支持多层继承,即A继承B,C继承A。
由来:
多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要 继承那一个类即可。

在这里插入图片描述

其中,多个类属于子类,单独的那一个类属于父类或超类或基类。
继承描述的是事物之间的所属关系。
定义:
就是子类继承父类的属性和行为,使得子类对象具有与父类相同的属性、相同的行为。子类可以直接 访问父类中的非私有的属性和行为。
访问局部变量:直接写变量名即可。
访问本类的成员变量:this.成员变量
访问父类的成员变量:super.成员变量
public class Zi extends Fu{
    int num = 20;
    public void method(){
        int num = 30;
        System.out.println("局部变量num:"+num);//局部变量
        System.out.println("本类的成员变量num:"+this.num);/

        System.out.println("父类的成员变量num:"+super.num);

    }
}

public class ExtendTest {
    public static void main(String[] args) {
        Zi zi = new Zi();
        zi.method();
    }
}

结果如下:

在这里插入图片描述

在父类子类的继承关系中,创建子类对象,成员变量与成员方法重名的时候,访问成员方法的规则:
对象是谁,就优先用谁,如果没有则向上找。(无论是成员方法还是成员变量,如果没有都是向上找父类,绝对不会向下找子类。)
方法重写
方法名称一样,参数列表也一样,也叫覆盖。
注意事项:
(1)必须保证父子类之间的方法名称相同,参数列表也是相同的。@Override:写在方法前面,用来检测是否是有效的正确的方法重写。
(2)子类方法的返回值必须【小于等于】父类方法的返回值范围。(注意:java.lang.Object类是所有类的公共最高父类(祖宗类),java.lang.String就是Object的子类。)
(3)子类方法的权限必须大于等于父类方法的权限修饰符。(提示:public>protected>(default)>private)
备注:(default不是关键字,而是什么都不写。)
设计原则:
对于已经投入使用的类,尽量不要进行修改,推荐定义一个新的类,来重复利用其中共性内容(老的功能),并且添加改动的新的功能。
方法重载
方法名称一样,参数列表不一样。
继承关系中,父子类构造方法的访问特点:

(1)子类构造方法当中有一个默认隐含的“super();”调用,所以一定是先调用的父类构造,后执行的子类构造。(子类必须调用父类的构造方法)

public Fu(){
    System.out.println("执行父类构造方法:");
}

public Zi(){
    System.out.println("执行子类构造方法!");
}

public class ExtendTest {
    public static void main(String[] args) {
        Zi zi = new Zi();
    }
}

在这里插入图片描述
(2)可以通过super关键字来调用父类重载构造。

(3)super的父类构造调用必须是子类构造方法里的第一个语句。不能一个子类构造调用多次super构造。只有子类构造方法,才能调用父类构造方法。

总结:子类必须调用父类的构造方法,不写super();则子类构造方法中将隐含super();写了则用写的指定的super调用,super只能调用一个,还必须是第一个。如果父类中既有有参构造也有无参构造,而子类又没有写super();则还是默认调用无参构造。

所以super有三种功能:

(1)在子类的成员方法中,访问父类的成员变量;

(2)在子类的成员方法中,访问父类的成员方法;

(3)在子类的构造方法中,访问父类的构造方法。

this关键字的三种方法:

(1)在本类的成员方法中,访问本类的成员变量;

(2)在本类的成员方法中,访问本类的另一个成员方法;

(3)在本类的构造方法中,访问本类的另一个构造方法。

在第三个用法中注意,this调用也必须是构造方法的第一个语句,唯一一个;super和this两种构造调用,不能同时使用。

在这里插入图片描述

super_class就好比我们写的extend关键字,告诉它的父类是谁。

首先main方法先进栈,首先创建了一个子类对象,凡是new出来的对象都在堆当中。子类内容包含一个完整的父类结构,所以必须先有父类构造。堆中的方法保存的是该方法的地址值,比如说图中的0x method。当我们new了一个对象,0x666就会保存到子类当中。继续执行zi.show方法和zi.method方法,它们依次进栈。

多态:

多态:
是指同一行为,具有多个不同表现形式。

extend继承或者implements实现,是多态的前提。

代码中体现多态性,其实就是一句话:父类引用指向子类对象。

格式:

父类名称 对象名 = new 子类名称();

或者:

接口名称 对象名 = new 实现类名称();

访问成员变量的两种方式:

(1)直接通过对象名访问成员变量:看等号左边是谁,优先用谁,没有则向上找。

(2)间接通过成员方法访问:看该方法属于谁,优先用谁,没有则向上找。

注意:子类没有覆盖重写,就是父类的成员变量;子类如果覆盖重写,就是子类的成员变量。

当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,执行的是子类重写 后方法。

在多态的代码中,成员方法的访问规则:

看new的是谁,就优先用谁,没有则向上找。

向上转型:
多态本身是子类类型向父类类型向上转换的过程,这个过程是默认的。

对象的向上转型,其实就是多态写法,一样的格式。

含义:右侧创建一个子类对象,把它当做父类来看待使用。

向下转型:
父类类型向子类类型向下转换的过程,这个过程是强制的。

当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误。也就是说,不能调用子类拥 有,而父类没有的方法。编译都错误,更别说运行了。这也是多态给我们带来的一点"小麻烦"。所以,想要调用子 类特有的方法,必须做向下转型。
在这里插入图片描述

为了避免ClassCastException的发生,Java提供了 instanceof 关键字,给引用变量做类型的校验,格式如下:

变量名 instanceof 数据类型 如果变量属于该数据类型,返回true。如果变量不属于该数据类型,返回false

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值