Java的封装、继承、多态

Java语言是一种纯面向对象的语言,面向对象语言的特性就是封装、继承和多态。
一、封装
封装,按照字面意思理解,就是把一些东西封闭、并装在一起,按照自己设计的某种方式,我们才能控制这些东西的使用。
对于Java来说,封装就是对某一个类的成员变量和成员方法进行访问控制,让其它的类的按照我们设定的规则取访问这个类的字段和方法。
也就是对字段和方法用 public、private、protect、default关键字进行访问控制。
public:同包路径
private:这个类本身
protected:子类可访问
默认:包访问

这样,通过访问控制,会给代码带来一定的安全性。假如别人只能访问你的字段或方法而不能对他们做任何改变,就不会损坏源代码了。

二、继承
继承就是基于已存在的类构造一个新类,这个新类复用了它所继承的类的所有可访问的方法和域。在此基础上,新类还可以添加新的方法和域。
所以继承就是超越了copy,通过C V 大法从而在原有类的基础上实现更复杂的功能。

1.这个已存在的类叫做基类、父类或超类
新类叫做子类、继承类或导出类

继承关键字:extends

2.Java中所有的类都有一个公共父类:Object类,在Java也只能单根继承,一个导出类只能继承一个基类,但是一个基类可以有多个子类,这些子类之间也可以没有联系。
继承关系可以传递继承,比如,C是B的子类,B是A的子类,那么C也是A的子类

3.对于类的修饰符没有private,而只有public、默认和abstract(抽象类)这三个修饰符,所以阻止一个类被继承,需要加上final关键字
同时,final关键字不能和abstract同时使用。

4.组合和继承的区别

//组合 has- a 关系
	class A{}
	class B{
	A a = new A();
	}
	//继承 is-a 关系
	class A{}
	class B extends A{
	A a = new B();//也叫做向上转型,upcasting
	              //可以用这种方法去创建抽象类的实例
	 }

5.this和super关键字
this:
在当前类里面调用自己的非静态方法或非静态字段,可以通过方法名或字段名去调用,也可以通过 this. 去调用。两种方式等价,你不加 this ,编译器会默认你的非静态的方法和字段前有 this. ,这时候的this被称为隐式参数。

this : 通过this访问当前类里面的成员变量和成员方法
this.成员变量
this.成员方法

静态方法没有this引用。

this() 调用当前类中其它的无参构造
1)必须位于当前函数有效代码第一行
2)两个构造方法不能用this相互调用
3)一个构造方法中不能调用多个this()(参考1)
4)普通方法不能调用构造方法

super:代表父类对象
在子类当中访问父类的成员变量和成员方法 super.

super() :
1)必须位于当前函数有效代码第一行
2)在当前构造方法中用super()来初始化继承下来的父类的属性
3)一个构造方法中不能调用多个super()(参考1)
4)普通方法不能调用构造方法

6.方法重载和重写
方法签名:方法名和参数列表
参数列表:参数类型和参数个数
返回类型不是方法的签名

1)重载
同一个类中方法名相同,参数列表不同
而子类对父类之间具有继承结果的方法也叫做重载。

2)重写
子类对父类的方法的重写。
方法签名一致,就叫做重写。
我们一般重写父类的方法时,希望它和父类的方法得到不同的行为(否则我们直接调用父类方法即可),但是,我们返回的结果跟父类的结果相同是完全没问题的,我们也可以在子类重写父类的该方法时直接返回父类的该方法。

三、多态
静多态:也称编译时多态
比如方法的重载,根据方法的签名不同,在编译时就已经确定了调用的是哪个方法。

动态:也称运行时多态
动多态的条件:继承,重写,向上转型
之所以会有动多态,主要是为了区分到底是调用的子类的方法或字段还是父类的方法或字段。当一个子类继承自一个父类,而子类中又重写了父类的方法,这时候有
superClass example = new thisClass();
在运行时会调用子类的方法和字段而不是父类的。

动多态的底层原理:地址覆盖
在Java虚拟机中,有一块名叫方法区的内存区域,包括着静态常量、静态变量、运行时类信息(RTTI)、被编译器编译的代码和方法表。每个类都对应一个方法表。当虚拟机加载一个类时,就会产生一个class对象,通过运行时的类信息识别,就能够清楚的知道这到底是子类的实例还是父类的实例(即使经过向上转型,这个实例是子类的实例),这个过程也称为动态绑定。这个时候就会指向通过类加载产生的class对象而指向该class类的方法表,通过方法签名正确的调用方法。
子类的方法表是对父类方法表的复制,而继承、重写是发生动多态的条件之二,当调用了与父类方法签名相同的方法时,子类方法表中这个方法的地址就会覆盖掉父类方法表中这个方法的地址,从而实现动多态。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值