打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
java学习总结-高级语言特性-封装,继承,多态
1.1. 封装 (encapsulation) 
1.事物的内部实现细节隐藏起来 
2.对外提供一致的公共的接口――间接访问隐藏数据 
3.可维护性 

1.2. 继承 (inherit) 
1.2.1. JAVA继承特点 
 继承:父类的成员能否继承到子类? 
 子类能否访问到父类的成员 

private:本类内部可以访问 不能继承到子类 
(default):本类内部可以访问,同包其他类也可 以访问 
 能否继承到子类? 不一定 

protected:本类内部可以访问,不同包的子类也可以访问, 同包其他类也可以访问 
 能继承到子类   
public:任何地方都可以访问 能继承到子类 

从严 到宽 

(override)覆盖的构成条件: 
1、方法名:相同 
2、参数表:相同(个数,类型) 
3、访问限制符:相同或者更宽 
4、返回值类型:相同 或者 子类返回的类型是父类返回的类型的子类 
5、不能抛出比subclass(父类)更多的异常 

对象的构造过程: 
1.递归的构造父类对象 
2.分配空间 
3.初始化属性 
4.调用本类的某一个构造方法,并用在方法的第一句。 

super:调用父类的某一个构造方法 
 父类对象 
不能出现在static方法内 

多态: 
1. 对象不变 
2. 只能对对象调用编译时类型中定义的方法 
3. 运行时,根据对象的运行时类型,找覆盖过的方法来调用(运行时动态类型判定) 

强制类型转换 instanceof 

屏蔽子类差异,利用父类共性做出通用编程 

属性的遮盖(shadow)没有多态 
方法的重载看参数的编译时类型 

1.2.2. 父类(SuperClass)和 子类(SubClass)的关系 
父类的非私有化属性(不同包的子类无法访问default修饰符)和方法可以默认继承到子类。 
Class Son extends Father{ 

而如果父类中的私有方法被子类调用的话,则编译报错。 
父类的构造方法子类不可以继承,更不存在覆盖的问题。 
所以子类构造方法默认调用父类的无参构造方法。(所以养成写无参构造的习惯) 
如果子类访问父类的有参构造方法,必须在子类构造方法第一行使用super(参数) 
当构造一个对象的时候,系统先构造父类对象,再构造子类对象。 
Public class BMWcar extends Car{ 
 Public BMWcar(){ 
 Super(int alength); //显式的调用父类的构造,默认调用无参构造 
 //所以父类没有无参构造的话,子类如果不加显示调用其他构造就会报错。这里的super是一个对父类的引用 
 } 


1.2.3. 系统构造一个对象的顺序  
1先为最里层类成员属性赋初值; 
2再构造该类对象; 
3返回外层,重复1(上一层类)、2步骤直到完成最外层类的构造。 

最外层类 
  
最里层基类 
  
<!--[if !vml]-->最外层类[里层类] 

  
注意:super() this() 不会同时出现 
A(){ 
super(); 

A(int a){ 
this(); 

1.3. 多态(polymorphism)  
多态:一个对象变量可以指向多种实际类型的现象。 

1.3.1. 方法的覆盖(overridding)
 
当子类从父类继承一个无参方法,而又定义了一个同样的无参方法,则子类新写的方法覆盖父类的方法,称为覆盖。(注意返回值类型也必须相同,否则编译出错。) 
如果方法参数表不同,则成重载。 
特点: 
1.对于方法的访问限制修饰词,子类方法要比父类的访问权限更高。 
父类为public,那么子类为private则出现错误。 
2.子类抛出的异常应该是父类抛出的异常或其子类。 

1.3.2. 多态的分类 
多态分两种: 
1编译时多态:编译时动态重载; 
2运行时多态:指一个对象可以具有多个类型,方法的覆盖 
这样对于对象而言分为: 
理解运行时多态: 
Car c = new Bus(); 
Car编译时类型 编译时检查变量类型是否存在,是否有调用的方法 
Bus运行时类型 实际运行是访问heep中的对象,调用实际的方法。 
运行时多态是由运行时类型决定的 
编译时多态是由编译时类型决定的 
猫,小鸟,狗 都是动物,都可以安上动物的标签。 
Interface Animal{} 
Class Car implements Animal{} 
Class Bird implements Animal{} 
Class Dog implements Animal{} 
方法中 
Animal a = new Car(); 
Animal b = new Bird(); 
Animal c = new Dog(); 

*方法重载看的是参数的编译时类型 

public class Animal{ 
 public static void main(String[] args){ 

 } 



(1)   是覆盖吗?不能多态了 
abstract class MyClass{ 
 priavate void m(); 

class Sub extends MyClass(){ 
 public void m(); 

(2)  错误的修饰符组合 
abstract class MyClass{ 
 priavate abstract void m(); 

class Sub extends MyClass(){ 
 public void m(); 

(3) 5.0 新 非覆盖  
abstract class MyClass{ 
private final void m(); 

class Sub extends MyClass(){ 
 public void m(); 



1.3.3. 运行时多态的三原则 
1.对象不变;(改变的是主观认识) 
2.对于对象的调用只能限于编译时类型的方法,如调用运行时类型方法报错。 
在上面的例子中:Animal a=new Dog();对象a的编译时类型为Animal,运行时类型为dog。 
注意:编译时类型一定要为运行时类型的父类或者同类型。 
对于语句:Dog d=(Dog)a。将d强制声明为a类型,此时d为Dog(),此时d就可以调用运行时类型。注意:a和d指向同一对象。 
3.动态类型判定实际调用的方法。即它调用覆盖后的方法。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Java类和对象及实例
java的多态、重载、构造函数、析构函数的理解
为什么构造函数不能声明为虚函数,析构函数可以
Java知识体系详解
.net反射详解
Python入门篇之面向对象
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服