1. 抽象类:
使用abstract修饰,含有抽象方法的类是抽象类;
抽象类中可以有成员变量和成员方法,成员方法可有抽象方法,也可由非抽象方法;
抽象类可以是内部类,抽象内部类用private修饰;抽象类中抽象方法不可有方法体;
一个抽象方法必须对其子类可见,即不能用private修饰;
一个抽象类可继承自其他类,这个类可以是抽象类,也可是非抽象类,若继承自抽象类,可实现部分抽象方法,使其子类实现父类的抽象方法;
一个抽象类可实现接口,可以实现部分接口,若不实现,将实现任务交给子类;
抽象类只有被继承才有用,其子类可为抽象类,也可为非抽象类,若其子类为非抽象类,则必须实现全部抽象方法,若子类为抽象类,会自动继承所有抽象方法,抽象子类中也可定义新的抽象方法,该子类的某个非抽象子类必须实现全部抽象方法;
抽象类可用来定义变量,但不能构造对象,可用抽象类定义的变量指向非抽象类子类的对象;
抽象类中可有构造方法,但构造方法只能由其子类构造方法调用,且抽象类中的构造方法不是抽象方法;
抽象类和抽象方法不能用final修饰。
2. 抽象方法:使用abstract修饰, abstract不能修饰成员变量
abstract不能与private、 static、final 同时修饰一个成员方法
3. 接口:
interface关键字只能用来定义接口,不能用来修饰类、成员变量或成员方法
一个接口类中可有成员变量和成员方法,也可用来定义内部类或内部接口
接口类中成员变量一定是public static final的,但允许在声明变量时仅指定部分修饰符,即使没添加public、static、final中任何一个修饰符,改变量依然是public static final的,由于final成员变量必须在定义时初始化,因此接口类中定义的成员变量必须在定义时赋值。赋值可以用常量表达式,也可用任意在该接口中能够访问的对象组成的表达式。
接口类中的成员变量在实现该接口的类中可直接使用,在没有实现该接口,但可见该接口的类中可通过‘接口名.变量名’来访问
接口中出了static类型的成员方法外,都是public abstract类型的抽象方法,不能有方法体,允许声明成员方法时指定部分或不指定修饰符,但即使未添加public abstract中任何一个修饰符,该成员方法依然是public abstract的。static成员方法必须有方法体,接口中只有static方法有方法体,因此接口中不可出现this,super关键字
一个接口可继承自其他接口,使用extends关键字,一个接口可实现多个其它接口,不同接口之间用分号分隔
一个接口不能继承自任何类,包括抽象类
一个非抽象类若实现了某个接口,必须实现接口中所有抽象方法(接口中除static外的都是抽象方法)
接口可用来定义变量,但不能构造对象,可用接口定义的变量指向实现该接口的类的对象
接口没有构造函数,不能用final修饰
接口中所有成员都是public访问权限
4. 抽象类和接口的区别
抽象类可提供某些方法的部分实现,而接口不可以(若向抽象类中加入一个新的具体方法时,那么其所有子类都得到了该方法,而接口做不到这一点,若向接口中加入一个新方法,所有实现该接口的类都无法编译了,必须让每一个类都实现该方法才行,这是接口的缺点)
一个抽象类的实现只能由这个抽象类的子类给出,(由于java语言的单继承性,使用抽象类的作为类型定义工具的效能大打折扣,在这一点上,接口优势显现出来了,任何一个实现了一个java接口所规定的类均可具有此接口的类型,而一个类可实现多个接口,从而这个类便具有多种类型)
java接口是定义混合类型的理想工具,混合类表明一个类不仅具有某个主类型的行为,而且具有其他次类型的行为
结合上述抽象类与接口的优缺点,最经典的设计模式出来了:声明类型的工作由接口承担,但同时给出一个java类,且实现该接口,而其他同属于此抽象类类型的具体类可选择实现这个java接口,也可选择继承这个抽象类。即在层次接口中,接口在最上面,然后紧跟着抽象类,此时二者的优点皆能发挥,这个模式为‘缺省适配模式’
应用:
行为模型应通过接口而不是抽象类来定义
抽象类表示的是is-a的关系,接口表示的是like-a的关系
5. 方法重载和方法覆盖
方法重载:
在同一个类中出现方法名相同,参数列表不同的情况
返回值及权限不作为重载的依据
方法覆盖:在子类中出线和父类相同方法声明的时候,会运行子类的函数
子类覆盖父类方法时,子类权限必须大于等于父类权限
静态只能覆盖静态或被静态覆盖
6. final类和方法
final修饰的类不可被继承;final修饰的方法不可被覆盖;final修饰的变量为常量
7. java面向对象
一、java内存结构
栈
特点:有序的内存空间,先进后出
创建方式:由程序平台自身创建
存储内容:基本数据类型的值,存放对象在堆空间的地址
个数问题:java程序执行有很多个栈,往往为一个代码段(一个大括号)创建一个栈空间
周期问题:若相应代码段被执行完毕,则栈空间马上回收
堆
特点:一种无序的内存空间
创建方式:可有程序员自己创建或申请(mailoc)
用途:用于存放一些复杂数据信息(自定义类型)
个数问题:java程序执行过程中仅有一个堆,对所有方法和执行过程共享
周期问题:从java虚拟机运行开始,一直到java虚拟机运行结束
JVM内存结构全景图
堆:全局共享的无序存储空间(从JVM启动开始到JVM结束销毁)
栈:有序的存储空间(方法加载执行被创建分配,直到方法执行完毕栈被释放)
方法区:将所有方法中内容都存储起来, 为执行提供代码信息(从JVM启动开始到JVM结束销毁)
执行上下文:用于存储即将执行的方法的调用关系和执行顺序的空间。
注:把对象放在堆中,引用则存放在栈中,因为栈存放数据具有先进后出的特点,为避免数据的重复挪用,则把数据的引用放到栈中
二、java对象的组成
引用:存储在栈上
实例:存储在堆上