【java学习】面向对象三大特性:封装,继承,多态
2017-05-21 16:54
721 查看
1,封装
1)概念:
首先是抽象,把事物抽象成一个类,其次才是封装,将事物拥有的属性和动作隐藏起来,只保留特定的方法与外界联系。2)体现:
形成“类”。2,继承
1)优点
继承可以使现有的代码具有可重用性和可扩展性。2)使用
①构造函数不能被继承,子类可以通过super()显示调用父类的构造函数②创建子类时,编译器会自动调用父类的 无参构造函数
③如果父类没有定义无参构造函数,子类必须在构造函数的第一行代码使用super()显示调用
所以:new新对象的执行顺序:先执行父类构造函数,再执行子类构造函数。
④父类的static方法是与类一起加载,子类不能继承。
⑤子类重写或覆盖父类方法,子类的访问权限不能低于父类
3)super、this与extends
super指当前对象里面的父对象的引用,可以调用父类的构造方法、父类的方法和属性。this指当前对象的引用,可以调用当前对象的某个方法或某个成员。
①super
与this类似。在一个类的非static成员内部使用,比如super.method()
作用
A.表示调用父类的构造函数。B.调用父类的被隐藏的非私有成员变量、函数。(如protected函数)。
C.用来调用父类中被重写的方法。
②extends
继承关键字。③this
A.在非static成员内部使用,表示当前这个对象。B.调用当前对象的方法和成员变量。
调用本类中对应参数的构造函数:
this();、
this(a,b)。
调用方法:
this.init();
调用成员变量:
this.context = context;
编程技巧:
可以在每个方法后面,返回this,来提供链式调用。
通过链式调用,代码更加简洁易懂。
如下这个类,可通过链式调用:
student.setName().setAge();
public class Student { Student setName(){ return this; } Student setAge(){ return this; } }
4)构造方法和构造代码块
执行顺序:②静态代码块—>①构造代码块——>③构造函数①构造块(构造代码块)
{ 代码。。。。。。 }
直接在类中定义且没有加static关键字的代码块称为{}构造代码块。
构造代码块在创建对象时被调用,每次创建对象都会被调用,并且构造代码块的执行次序优先于类构造函数。
②静态代码块:
static{ 代码。。。。。 }
一个用static关键字标示的一个代码块区域,定义在类中。
可以完成类的初始化,静态代码块会随着类的加载而执行一次(new多个对象也是只执行一次)。如果和主函数在同一个类中,优先于主函数执行。
③构造方法(构造函数)
i>主要作用:
完成对象的初始化工作,把定义对象时的参数传给对象的域。ii>特点:
a.与类同名b.没有返回类型
c.构造方法可以重载,以参数的个数,类型,顺序。
d.一个类可以定义多个构造方法
e.如果一个源文件中有多个类,每个类都可以有自己的构造器
f.调用子类构造器之前,会先调用父类构造器,当子类构造器中没有使用”super(参数或无参数)”指定调用父类构造器时,是默认调用父类的无参构造器,如果父类中包含有参构造器,却没有无参构造器,则在子类构造器中一定要使用“super(参数)”指定调用父类的有参构造器,不然就会报错。
class Base{ public Base(String s){ System.out.print("B"); } } public class Derived extends Base{ public Derived (String s) { super("s");//没有这句会报错 System.out.print("D"); } public static void main(String[] args){ new Derived("C"); } }
iii>调用场景:
a.调用构造方法b.反射:java反射机制使用java.lang.Class或java.lang.reflect.Constructor的newInstance()方法。
另外,调用序列化对象(Java.io.ObjectInputStream的readObject方法)、用对象的clone()方法创建一个对象,但不调用构造方法。
iv>继承中的构造函数及方法执行顺序:
初始化过程:1. 初始化父类中的静态成员变量和静态代码块 ;
2. 初始化子类中的静态成员变量和静态代码块 ;
3.初始化父类的普通成员变量和代码块,再执行父类的构造方法;
4.初始化子类的普通成员变量和代码块,再执行子类的构造方法;
class X{ Y y=new Y(); public X(){ System.out.print("X"); } } class Y{ public Y(){ System.out.print("Y"); } } public class Z extends X{ Y y=new Y(); public Z(){ System.out.print("Z"); } public static void main(String[] args) { new Z(); } }
输出结果为:YXYZ
5)重写和重载
重写:覆盖父类已有的方法。可通过super调用父类已覆盖的方法。重载:多个方法,同名而参数不同。
3,多态
1)概念:
多态可以分为两种类型:编译时多态(方法的重载)和运行时多态(继承时方法的重写)。运行时多态依赖于继承、重写和向上转型。
为了降低系统各部分的依赖和避免魔法数,将switch语句用多态替换掉。
点击查看demo:通过多态和发射机制替换switch
点击查看反射机制
2)重载:
重载是指一个类里面(包括父类的方法)存在方法名相同,但是参数不一样的方法,参数不一样可以是不同的参数个数、类型或顺序。java的静态多分派由方法重载来实现。(静态分派:所有依赖静态类型来定位方法执行版本的分派动作)。
3)覆盖:
类中存在和父类相同的方法即为覆盖。java的动态单分派由方法覆写来实现。(动态分派:在运行期根据实际类型确定方法执行版本的分派过程)。
子类重写或覆盖父类方法,子类的访问权限不能低于父类。
4)单分派和多分派:
宗量:方法的接受者(亦即方法的调用者)+ 方法的参数。单分派:根据一个宗量对目标方法进行选择。
多分派:根据多于一个宗量对目标方法进行选择。
java是一门静态多分派、动态单分派的语言。
5)向上转型的缺憾:
只能调用父类中定义的属性和方法,对于子类中的方法和属性它就望尘莫及了,必须强转成子类类型相关文章推荐
- Java学习第六课--面向对象的三大特性(封装、继承和多态)
- java学习总结(16.06.10~16.06.17)面向对象的三大特征——封装、继承、多态
- java面向对象的三大特性----封装、继承、多态
- java 面向对象三大特性(封装,继承,多态)以及抽象、接口的介绍
- java语言基础(23)——面向对象三大特性(封装、继承、多态)
- Java面向对象的三大特性——封装,继承,多态
- java笔记—封装、继承、多态[面向对象的三大特性]
- 黑马程序员——OC语言学习——OC面向对象的三大特性:封装、继承、多态,OC字符串——NSString
- 深入理解Java面向对象三大特性 封装 继承 多态
- java 面向对象三大特性(封装,继承,多态)以及抽象、接口的介绍
- java 面向对象三大特性(封装,继承,多态)以及抽象、接口的介绍
- Java的面向对象的三大特性 封装 继承 多态
- Java之面向对象的三大特性:封装,继承,多态讲解
- Java — 面向对象的三大特性(封装、继承、多态)
- 深入理解Java面向对象三大特性 封装 继承 多态
- Java学习之旅基础知识篇:面向对象之封装、继承及多态
- 黑马程序员学习日记 (四)面向对象三大特征: 封装 继承 多态
- 黑马程序员——OC面向对象三大特性——封装,继承,多态。
- 黑马程序员---OC面向对象三大特性(封装、继承、多态)
- PHP面向对象三大特点学习(充分理解抽象、封装、继承、多态)