面向对象的三大特征
封装(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 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内存.
|