java类的三大特征

来源:互联网 发布:暴雪下载器 mac 编辑:程序博客网 时间:2024/06/05 14:09

面向对象的三大特征

封装(encapsulation)封装把对象的所有组成部分组合在一起,封装定义程序如何引用对象的数据,封装实际上使用方法将类的数据隐藏起来,控制用户对类的修改和访问数据的程度。适当的封装可以让程式码更容易理解和维护,也加强了程式码的安全性。

修饰符

作用范围

private

只能在当前类中访问

默认的(jdk1.8以后是default)

同包下可以访问(子类,其他类)。不同包下子类,非子类均不可访问。

protected

同包下可以访问(子类,其他类)。不同包下的子类可以访问。不通包下的其他类不能访问。

public

同包不同包均可以访问。

 

继承:

java中不支持多继承

Object

定义:Object类是所有Java类的祖先。每个类都使用Object 作为超类。所有对象(包括数组)都实现这个类的方法。

在不明确给出超类的情况下,Java会自动把Object作为要定义类的超类(父类)

 

 

 

 

 

继承中构造方法的引用

继承中当子类使用时,会从其父类,Object类的构造方法逐层往下调用直到该类的构造方法调用为止。

 

多态:

为什么引用多肽:

Java之所以引入多态的概念,原因之一是它在类的继承问题上和C++不同,后者允许多继承,这确实给其带来的非常强大的功能,但是复杂的继承关系也给C++开发者带来了更大的麻烦,为了规避风险,Java只允许单继承,派生类与基类间有IS-A的关系(即“猫”is a “动物”)。这样做虽然保证了继承关系的简单明了,但是势必在功能上有很大的限制,所以,Java引入了多态性的概念以弥补这点的不足。

 

java中存在两种多态,

重载(Overload)和重写(Override)

 

什么是重载:

两同三不同:

    同一个类中,同一个方法名

    形参列表: 个数不同,类型不同,顺序不同

重写

方法名相同;形参列表相同;返回值类型相同;子类的访问权限大于父类;

重载与重写的区别

方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。

 

重载是一个类中多态性的一种表现。重写是父类与子类之间多态性的一种表现。

老师解答:

    程序有了重写之后,子类能够更好的处理自己本身对于业务逻辑的控制需求,以及达到更高效的代码编写。其次,父类中定义的方法,是为了后期去对于整个代码,以及继承该父类的类。对于流程控制,很多模式都会以该点来扩散,比如方法模板以及工厂设计模式。都是由于父类和子类的继承关系发生后,存在重写,所以达到了原本设计模式的初衷,代码的高效性,间接性,拓展性。

 

编译时多态性与运行时多态性

编译时多态性(静态多态性):---程序运行前发生的事件 重载是事先写好了各个方法,在调用的时候根据不同的参数选择不同的方法。

运行时多态性(动态多态性):---程序运行时发生的事件 重写后运行时,虚拟机根据调用的不同动态编译的。

多态的体现(父类引用指向子类对象的用法):

Animal animal = new Cat(); 
即声明的是父类,实际指向的是子类的一个对象。

那我们从内存角度来理解试试. 
假设现在有一个父类Father,它里面的变量需要占用1M内存. 
有一个它的子类Son,它里面的变量需要占用0.5M内存. 
现在通过代码来看看内存的分配情况:

Father f = new Father();//系统将分配1M内存.

Son s = new Son();//系统将分配1.5M内存!

因为子类中有一个隐藏的引用super会指向父类实例,所以在实例化子类之前会先实例化一个父类,也就是说会先执行父类的构造函数.由于s中包含了父类的实例,所以s可以调用父类的方法.

Son s1 = s; //s1指向那1.5M的内存.

Father f1 = (Father)s;//这时f1会指向那1.5M内存中的1M内存

f1只是指向了s中实例的父类实例对象,所以f1只能调用父类的方法(存储在1M内存中),而不能调用子类的方法(存储在0.5M内存中).

Son s2 = (Son)f;//这句代码运行时会报ClassCastException.

因为 f 中只有1M内存,而子类的引用都必须要有1.5M的内存,所以无法转换.

Son s3 = (Son)f1;//这句可以通过运行,这时s3指向那1.5M的内存.

由于f1是由s转换过来的,所以它是有1.5M的内存的,只是它指向的只有1M内存. 

 

 

0 0
原创粉丝点击