类的基础
构造方法
创建对象后的内存
对象和数组一样,有两块内存,保存地址的部分分配在栈中,而保存实际内容的部分分配在堆中。栈中的内存是自动管理的,函数调用入栈就会分配,而出栈就会释放。
this and super
继承和多态
转型
子类对象赋值给父类引用变量,这叫向上转型,转型就是转换类型,向上转型就是转换为父类类型。
多态
父类对象可以引用任何子类类型的对象,这叫多态,即一种类型的变量,可引用多种实际类型对象。这样,对于父类对象,它就有两个类型:声明时的父类自身类型,我们称之为静态类型;实际引用的子类类型,我们称之为动态类型。实际调用的方法也是引用类型(动态类型)的方法,这称之为方法的动态绑定。
继承中的初始化
父类构造方法中调用可被子类重写的方法(不推荐)
在 new过程中,首先是初始化父类,父类构造方法调用 test() 方法, test() 方法被子类重写了,就会调用子类的 test() 方法,子类方法访问子类实例变量 a,而这个时候子类的实例变量的赋值语句和构造方法还没有执行,所以输出的是其默认值 0。
子类和父类中方法or变量重名
静态绑定
静态绑定,即访问绑定到变量的静态类型。静态绑定在程序编译阶段即可决定,而动态绑定则要等到程序运行时。实例变量、静态变量、静态方法、 private方法,都是静态绑定的。
可以看出,当有多个重名函数的时候,在决定要调用哪个函数的过程中,首先是按照参数类型进行匹配的,换句话说,寻找在所有重载版本中最匹配的,然后才看变量的动态类型,进行动态绑定。
一个父类的变量能不能转换为一个子类的变量,取决于这个父类变量的动态类型(即引用的对象类型)是不是这个子类或这个子类的子类。
重写时,子类方法不能降低父类方法的可见性。
为什么要这样规定呢?继承反映的是“ is-a”的关系,即子类对象也属于父类,子类必须支持父类所有对外的行为,将可见性降低就会减少子类对外的行为,从而破坏“ is-a”的关系,但子类可以增加父类的行为,所以提升可见性是没有问题的。
类加载
所谓类的加载是指将类的相关信息加载到内存。在 Java中,类是动态加载的,当第一次使用这个类的时候才会加载,加载一个类时,会查看其父类是否已加载,如果没有,则会加载其父类。
类加载后的内存分配
内存分为栈和堆,栈存放函数的局部变量,而堆存放动态分配的对象,还有一个内存区,存放类的信息,这个区在 Java中称为方法区。
方法调用
寻找要执行的实例方法的时候,是从对象的实际类型信息开始查找的,找不到的时候,再查找父类类型信息。
变量访问的过程
对变量的访问是静态绑定的,无论是类变量还是实例变量。
接口的威力
场景:Comparable 接口,自定义的类(P)如果有比较的需求,实现这个接口,重写 compareTo 方法,这样就可以
Java 8 新增
接口中可以定义,静态方法和默认方法
抽象类
定义了抽象方法的类必须被声明为抽象类,不过,抽象类可以没有抽象方法。抽象类和具体类一样,可以定义具体方法、实例变量等,它和具体类的核心区别是,抽象类不能创建对象,而具体类可以。
shape 是抽象类 Shape类型的变量,引用了具体子类 Circle的对象,调用 draw() 方法将调用 Circle 的 draw代码。
为什么需要抽象类
引入抽象方法和抽象类,是 Java提供的一种语法工具,对于一些类和方法,引导使用者正确使用它们,减少误用。
无论是编写程序,还是平时做其他事情,每个人都可能会犯错,减少错误不能只依赖人的优秀素质,还需要一些机制,使得一个普通人都容易把事情做对,而难以把事情做错。抽象类就是 Java提供的这样一种机制。
内部类
内部类只是 Java编译器的概念,对于 Java虚拟机而言,它是不知道内部类这回事的,每个内部类最后都会被编译为一个独立的类,生成一个独立的字节码文件。
静态内部类使用场景:一个类内部,如果既要计算最大值,又要计算最小值,可以在一次遍历中将最大值和最小值都计算出来,但怎么返回呢?可以定义一个类 Pair,包括最大值和最小值,但 Pair这个名字太普遍,而且它主要是类内部使用的,就可以定义为一个静态内部类。
成员内部类使用场景:成员内部类有哪些应用场景呢?如果内部类与外部类关系密切,需要访问外部类的实例变量或方法,则可以考虑定义为成员内部类。外部类的一些方法的返回值可能是某个接口,为了返回这个接口,外部类方法可能使用内部类实现这个接口,这个内部类可以被设为 private,对外完全隐藏。
枚举
|
-
Java编程的逻辑-面向对象
最新更新
Java编程的逻辑-面向对象
深入浅出 JAXB:自定义映射方式
Golang与Java的区别
Python第三方模块安装方法
Python常用模块之OS使用
python如何发送邮件(zmail模块)
Python中什么是类?如何定义?
Python使用xlrd读取Excel
Python使用xlrd写入Excel
go语言学习笔记-初识Go语言
三大常用数据库事务详解之三:事务运行
三大常用关系型数据库事务详解之二:基
三大关系型数据库事务详解之一:基本概
MongoDB常用命令(2)
MongoDB基本介绍与安装(1)
SQLServer触发器调用JavaWeb接口
SQL Server索引的原理深入解析
SqlServer2016模糊匹配的三种方式及效率问题
SQL中Truncate的用法
sqlserver 多表关联时在where语句中慎用tri
VB.NET中如何快速访问注册表
ASP.NET中图象处理过程详解
Vue(1)Vue安装与使用
JavaScript 语言入门
js将一段字符串的首字母转成大写
纯原生html编写的h5视频播放器
H5仿原生app短信验证码vue2.0组件附源码地
TypeScript(4)接口
TypeScript(3)基础类型
TypeScript(2)WebStorm自动编译TypeScript配置