面向对象高级特性
2017-05-04 16:48
211 查看
static的含义
继承的规则
子类实例化的过程
方法的覆盖
final关键字
抽象类的特性
接口的规范
静态修饰符static
static可以修饰的元素
属性---共享
方法---访问的方式
块---执行的时机
只能修饰类成员,不能修饰局部变量
静态属性
静态属性
静态属性描述了类的所有对象的共同特征;非静态属性描述的是每个对象独有的特性;
静态属性与非静态属性的对比:
静态属性在该类第一次被加载到虚拟机时,分配静态存储区,以后每次运行不再分配空间。
静态方法
使用static修饰方法时,不需要实例化,可以直接访问---也称为类方法
两种方式访问:
直接访问:类名。方法名()
实例化后访问:对象名。方法名()
作用:
简化方法的使用
便于访问静态属性
限制:
静态方法可以直接访问类中其他静态成员
如果静态方法中要访问类中的非静态成员,必须先实例化类
静态方法中不能使用this
静态方法不能被非静态方法覆盖
特殊的静态方法main
必须public权限修饰符
最大权限保证任何位置都可以访问该函数,不受任何限制;
必须static静态修饰符
无需实例化,可以直接调用main函数;
必须返回空值void
main函数仅是程序的启动,没有必要返回任何值;
main函数名不可改变
固定的函数名,注意大小写;
String[]args:命令行参数(必须是字符串数组类型)
从程序外部传入的参数;
实例变量初始化的顺序
隐式赋予变量默认值;
显示赋予初始值
构造方法体赋予新值;
注意:静态属性只在第一次装载入虚拟机时被赋值,对象实例化时不需要给静态属性赋值;
程序块(一般不使用)
静态程序块
非静态程序块
可以使用程序块来统一给属性显示的赋值;
静态块只执行一次,非静态块执行多次;
类继承的规则
子类继承父类的所有(可见)属性和所有(可见)方法;
但是构造器不继承;
方法的覆盖
所谓“覆盖(override)”是在声明子类的成员方法时,其名称、参数、返回值都与父类的成员方法的名称、参数、返回值一样,在面向对象的程序设计中称为方法的覆盖。
方法覆盖的规则
在父子类之间继承时发生
多个方法的名称相同
返回值类型必须相同
每个方法参数数量和参数类型和顺序相同
权限修饰符要求:子类方法的要不小于父类方法的。
子类方法只能抛出父类方法异常或其异常的子类。
super和this关键字
super()
作用:调用父类的构造器
只能出现在子类的构造器中,且必须是第一行
super()中的参数,决定了调用父类哪个构造器
如果子类构造器中没出现super(),那么默认给增加super(),即调用父类的空构造器。
this()
作用:调用本类的构造器
只能写在构造器的第一行
在同一个构造器中super()和this()不能同时出现
super.
指向父类的引用。
this.
指向本类的引用。
关键字final
final可以修饰的元素:
变量(属性和局部变量):不能被重新赋值
在声明的同时赋值
在构造器中赋值
方法:不能被覆盖,即不能修改。
类:不能被继承
抽象方法
只能方法声明,没有方法实现的方法;
抽象方法用abstract声明,以“;”结尾。
public abstract void getArea();
抽象类
含有抽象方法的类必须声明为抽象类;
用abstract声明class。
抽象类的规则
注意:
抽象类不能被实例化;
其包含的抽象方法必须在其子类中被实现,否则该子类只能声明为abstract
抽象方法不能为static;
在下列情况下,类必须声明为抽象类:
当类的一个或多个方法是抽象方法时;
当类是一个抽象类的子类,并且没有实现父类的所有抽象方法,即只实现部分;
当类实现一个接口,并且不能为全部抽象方法都提供实现时;
抽象类的本质
抽象类是抽象方法和非抽象方法的集合
特殊情况
全部是抽象方法
全部为非抽象方法
实际上是一套规范
思考:那么抽象类中的构造器还有必要存在么?
答:可以存在,用于给属性传参;
接口interface
接口不是一个类,不能实例化;
接口是常量和抽象方法的集合;
接口对类来说是一套规范,是一套行为协议;
定义格式如下:
类实现接口
接口实质上就是一个变量和抽象方法的集合。为了使用一个接口,你要编写实现接口的类。
如果一个类要实现一个接口,那么这个类就必须实现接口中所有抽象方法。否则这个类只能声明为抽象类。
接口的特点
接口使用interface关键字来定义,而不是class
接口中定义的变量都是公共静态最终变量
接口中没有自己的构造函数,而且接口中定义的方法全部都是抽象方法,即只提供方法的定义,而没有提供方法的具体实现的语句。
接口采用多继承机制,而不像类一样采用单继承机制。
接口默认:
常量:public static final
抽象方法:public abstract
接口与抽象类的区别
接口不能含有任何非抽象方法,而抽象类可以。
类可以实现许多接口,但只能有一个父类。
接口不是类分级结构的一部分,没有联系的类可以实现相同的接口。
访问接口中常量
public static final int MAX_SPEED=100;
有三种方式:
接口名.MAX_SPEED
类名.MAX_SPEED
对象名.MAX_SPEED
引用数据类型的转换
前提:具有继承关系
原则:子类就是父类
向上转型:子类转换为父类,自动转换;
向上转换损失了子类新扩展的属性和方法
仅剩下父类中声明过的属性和方法
向下转型:强制转换
曾经向上转换过的对象,才能再向下转换。
上溯优点:可以把不同类型的子类上溯为同一个父类类型,方便我们统一的处理它们;
上溯缺点:因为上溯了,就忽略了每个子类特有的属性,仅关注了共同的属性;
多态
相同类型的变量,调用相同的方法,执行的具体代码却不同的现象,称为多态;本质上遵守引用类型的转换规则。
分为两种表现形式
赋值多态
传参多态(隐式的赋值多态)
多态的机制
Override
多态的实现与使用
实现java的多态遵循的要求:
代码中必须有超类和子类继承关系
超类提供作为借口的方法,指定规范
参与多态的子类必须完善或者覆盖这些指定的方法,以达到接口效应
编写驱动类,或者应用代码,子类向上转型为超类引用,实现多态
多态的使用
调用多态方法是通过向上转型,或称超类引用实现的。即向上转型后,有超类产生对子类多态方法的动态调用
继承的规则
子类实例化的过程
方法的覆盖
final关键字
抽象类的特性
接口的规范
静态修饰符static
static可以修饰的元素
属性---共享
方法---访问的方式
块---执行的时机
只能修饰类成员,不能修饰局部变量
静态属性
静态属性
静态属性描述了类的所有对象的共同特征;非静态属性描述的是每个对象独有的特性;
静态属性与非静态属性的对比:
静态属性在该类第一次被加载到虚拟机时,分配静态存储区,以后每次运行不再分配空间。
静态方法
使用static修饰方法时,不需要实例化,可以直接访问---也称为类方法
两种方式访问:
直接访问:类名。方法名()
实例化后访问:对象名。方法名()
作用:
简化方法的使用
便于访问静态属性
限制:
静态方法可以直接访问类中其他静态成员
如果静态方法中要访问类中的非静态成员,必须先实例化类
静态方法中不能使用this
静态方法不能被非静态方法覆盖
特殊的静态方法main
必须public权限修饰符
最大权限保证任何位置都可以访问该函数,不受任何限制;
必须static静态修饰符
无需实例化,可以直接调用main函数;
必须返回空值void
main函数仅是程序的启动,没有必要返回任何值;
main函数名不可改变
固定的函数名,注意大小写;
String[]args:命令行参数(必须是字符串数组类型)
从程序外部传入的参数;
实例变量初始化的顺序
隐式赋予变量默认值;
显示赋予初始值
构造方法体赋予新值;
注意:静态属性只在第一次装载入虚拟机时被赋值,对象实例化时不需要给静态属性赋值;
程序块(一般不使用)
静态程序块
非静态程序块
可以使用程序块来统一给属性显示的赋值;
静态块只执行一次,非静态块执行多次;
类继承的规则
子类继承父类的所有(可见)属性和所有(可见)方法;
但是构造器不继承;
方法的覆盖
所谓“覆盖(override)”是在声明子类的成员方法时,其名称、参数、返回值都与父类的成员方法的名称、参数、返回值一样,在面向对象的程序设计中称为方法的覆盖。
方法覆盖的规则
在父子类之间继承时发生
多个方法的名称相同
返回值类型必须相同
每个方法参数数量和参数类型和顺序相同
权限修饰符要求:子类方法的要不小于父类方法的。
子类方法只能抛出父类方法异常或其异常的子类。
super和this关键字
super()
作用:调用父类的构造器
只能出现在子类的构造器中,且必须是第一行
super()中的参数,决定了调用父类哪个构造器
如果子类构造器中没出现super(),那么默认给增加super(),即调用父类的空构造器。
this()
作用:调用本类的构造器
只能写在构造器的第一行
在同一个构造器中super()和this()不能同时出现
super.
指向父类的引用。
this.
指向本类的引用。
关键字final
final可以修饰的元素:
变量(属性和局部变量):不能被重新赋值
在声明的同时赋值
在构造器中赋值
方法:不能被覆盖,即不能修改。
类:不能被继承
抽象方法
只能方法声明,没有方法实现的方法;
抽象方法用abstract声明,以“;”结尾。
public abstract void getArea();
抽象类
含有抽象方法的类必须声明为抽象类;
用abstract声明class。
抽象类的规则
注意:
抽象类不能被实例化;
其包含的抽象方法必须在其子类中被实现,否则该子类只能声明为abstract
抽象方法不能为static;
在下列情况下,类必须声明为抽象类:
当类的一个或多个方法是抽象方法时;
当类是一个抽象类的子类,并且没有实现父类的所有抽象方法,即只实现部分;
当类实现一个接口,并且不能为全部抽象方法都提供实现时;
抽象类的本质
抽象类是抽象方法和非抽象方法的集合
特殊情况
全部是抽象方法
全部为非抽象方法
实际上是一套规范
思考:那么抽象类中的构造器还有必要存在么?
答:可以存在,用于给属性传参;
接口interface
接口不是一个类,不能实例化;
接口是常量和抽象方法的集合;
接口对类来说是一套规范,是一套行为协议;
定义格式如下:
类实现接口
接口实质上就是一个变量和抽象方法的集合。为了使用一个接口,你要编写实现接口的类。
如果一个类要实现一个接口,那么这个类就必须实现接口中所有抽象方法。否则这个类只能声明为抽象类。
接口的特点
接口使用interface关键字来定义,而不是class
接口中定义的变量都是公共静态最终变量
接口中没有自己的构造函数,而且接口中定义的方法全部都是抽象方法,即只提供方法的定义,而没有提供方法的具体实现的语句。
接口采用多继承机制,而不像类一样采用单继承机制。
接口默认:
常量:public static final
抽象方法:public abstract
接口与抽象类的区别
接口不能含有任何非抽象方法,而抽象类可以。
类可以实现许多接口,但只能有一个父类。
接口不是类分级结构的一部分,没有联系的类可以实现相同的接口。
访问接口中常量
public static final int MAX_SPEED=100;
有三种方式:
接口名.MAX_SPEED
类名.MAX_SPEED
对象名.MAX_SPEED
引用数据类型的转换
前提:具有继承关系
原则:子类就是父类
向上转型:子类转换为父类,自动转换;
向上转换损失了子类新扩展的属性和方法
仅剩下父类中声明过的属性和方法
向下转型:强制转换
曾经向上转换过的对象,才能再向下转换。
上溯优点:可以把不同类型的子类上溯为同一个父类类型,方便我们统一的处理它们;
上溯缺点:因为上溯了,就忽略了每个子类特有的属性,仅关注了共同的属性;
多态
相同类型的变量,调用相同的方法,执行的具体代码却不同的现象,称为多态;本质上遵守引用类型的转换规则。
分为两种表现形式
赋值多态
传参多态(隐式的赋值多态)
多态的机制
Override
多态的实现与使用
实现java的多态遵循的要求:
代码中必须有超类和子类继承关系
超类提供作为借口的方法,指定规范
参与多态的子类必须完善或者覆盖这些指定的方法,以达到接口效应
编写驱动类,或者应用代码,子类向上转型为超类引用,实现多态
多态的使用
调用多态方法是通过向上转型,或称超类引用实现的。即向上转型后,有超类产生对子类多态方法的动态调用
相关文章推荐
- PHP面向对象高级特性初探
- 深入学习javascript面向对象及高级特性
- 09面向对象高级特性二
- PHP面向对象高级特性
- 深入PHP面向对象、模式与实践——高级特性(4)
- javascript面向对象程序设计高级特性经典教程(值得收藏)
- 面向对象高级特性===Java内部类及其实例化
- JAVA面向对象高级特性之继承(1)常见问题解答
- 深入PHP面向对象、模式与实践——高级特性(1)
- 面向对象高级特性===Java抽象类的概念和使用
- 高级特性-面向对象部分
- 09面向对象高级特性二
- 08面向对象高级特性一
- java面向对象高级特性:泛型
- 08面向对象高级特性一
- 【IOS 开发】Objective - C 面向对象高级特性 - 包装类 | 类处理 | 类别 | 扩展 | 协议 | 委托 | 异常处理 | 反射
- 【javascript】javascript之面向对象高级特性
- PHP面向对象学习之二:深入了解面向对象高级特性
- 深入PHP面向对象、模式与实践——高级特性(3)
- 面向对象高级特性1:抽象类