本帖最后由 程凯 于 2018-7-19 23:46 编辑
java语言是一种面向对象的程序设计语言,而面向对象思想是一种程序设计思想,这里的对象泛指现实中一切事物,每种事物都具备自己的属性和行为。
面向对象思想就是在计算机程序设计过程中,参照现实中事物,将事物的属性特征、行为特征抽象出来,描述成计算机事件的设计思想。
它区别于面向过程思想,强调的是通过调用对象的行为来实现功能,而不是自己一步一步的去操作实现
面向对象是相对于面向过程而言,都是一种思想;面向对象是基于面向过程的
面向过程:强调功能行为
面向对象:将功能封装进对象,强调具备了功能的对象。
面向对象思想是一种更符合我们思考习惯的思想,它可以将复杂的事情简单化,并将我们从执行者变成了指挥者。
万物皆对象
类:是一组相关属性和行为的集合。 对象:是一类事物的具体体现。
成员变量的默认值
数据类型 默认值 基本类型整数(byte,short,int,long) 0
浮点数(float,double) 0.0
字符(char) '\u0000'
布尔(boolean) false
引用类型 数组,类,接口 null
成员变量和局部变量,区别在于:
在类中的位置不同 (重点)
成员变量:类中,方法外
局部变量:方法中或者方法声明上(形式参数)
作用范围不一样 (重点)
成员变量:类中
局部变量:方法中
初始化值的不同 (重点)
成员变量:有默认值
局部变量:没有默认值。必须先定义,赋值,最后使用
在内存中的位置不同 了解
成员变量:堆内存
局部变量:栈内存
生命周期不同 了解
成员变量:随着对象的创建而存在,随着对象的消失而消失
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
当一个对象被创建时候,构造方法用来初始化该对象,给对象的成员变量赋初始值。
无论你与否自定义构造方法,所有的类都有构造方法,因为Java自动提供了一个无参数构造方法,一旦自己定义了构造方法,Java自动提供的默认无参数构造方法就会失效。
构造方法的写法上,方法名与它所在的类名相同。它没有返回值,所以不需要返回值类型,甚至不需要void
注意事项:
1. 如果你不提供构造方法,系统会给出无参数构造方法。
2. 如果你提供了构造方法,系统将不再提供无参数构造方法。
3. 构造方法是可以重载的,既可以定义参数,也可以不定义参数。
【建议】如果你自己要写构造方法,那么最好将无参和满参的构造方法全部写全
JavaBean 是 Java语言编写类的一种标准规范。符合 JavaBean 的类,要求类必须是具体的和公共的,并且具有无参数的构造方法,提供用来操作成员变量的 set 和 get 方法。
布尔类型的get set方法与其他的类型有区别,setXxx方法与其它一样,getXxx 方法要换成 public boolean isOne(){}
对象也可以作为方法的参数进行传递,传递过去的其实对象的地址值。作为返回值也一样,返回的对象的地址值。
面向对象之封装
封装可以认为是一个保护屏障,让外界无法直接访被封装的数据,方法等。必须通过指定的方式来访问。
适当的封装可以让代码更容易理解与维护,也加强了代码的安全性。
原则:将属性隐藏起来,若需要访问某个属性,提供公共方法对其访问
封装的操作——private关键字:
private的含义
1. private是一个权限修饰符,代表最小权限。
2. 可以修饰成员变量和成员方法。
3. 被private修饰后的成员变量和成员方法,只在本类中才能访问
为了访问被封装的东西,提供了其公共的指定的方式, getXxx 和 setXxx方法面向对象之继承
继承:就是子类继承父类的属性和行为,使得子类对象具有与父类相同的属性、相同的行为。子类可以直接访问父类中的非私有的属性和行为
继承是多态的前提,如果没有继承,就没有多态
继承主要解决的问题就是:共性抽取
继承的特点:
1.Java只支持单继承,不支持多继承
2.java支持多层继承(继承体系) 顶层父类是Object类。所有的类默认继承Object,作为父类
3.子类和父类是一种相对的概念。
父类:可以叫基类,超类 子类:可以叫派生类
在父子类的继承关系当中,如果成员变量重名,则创建子类对象时,访问有两种方式:
直接通过自理对象访问成员变量: 等号左边是谁,就优先用谁,没有就向上找
间接通过成员方法访问成员变量: 方法属于谁,就优先用谁,没有则向上找
子父类中出现了同名的成员变量时,在子类中需要访问父类中非私有成员变量时,需要使用 super 关键字,修饰父类成员变量,类似于之前学过的 this
Fu类中的成员变量是非私有的,子类中可以直接访问。若Fu类中的成员变量私有了,子类是不能直接访问的。通常编码时,我们遵循封装的原则,使用private修饰成员变量后可以在父类中提供公共的getXxx方法和setXxx方法。
子类重写父类方法请注意:
1. 子类方法覆盖父类方法,必须要保证权限大于等于父类权限。父类的返回值权限要大于等于子类的返回值权限
2. 子类方法覆盖父类方法,返回值类型、函数名和参数列表都要一模一样。
类的构造方法中默认有一个 super() ,表示调用父类的构造方法,父类成员变量初始化后,才可以给子类使用(父类构造方法先于子类执行)
在每次创建子类对象时,先初始化父类空间,再创建其子类对象本身
子类的每个构造方法中均有默认的super(),调用父类的空参构造。手动调用父类构造会覆盖默认的super()。
super() 和 this() 都必须是在构造方法的第一行,所以不能同时出现
1. 抽象类不能创建对象,如果创建,编译无法通过而报错。只能创建其非抽象子类的对象
2. 抽象类中,可以有构造方法,是供子类创建对象时,初始化父类成员使用的。
理解:子类的构造方法中,有默认的super(),需要访问父类构造方法。
3. 抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类
理解:未包含抽象方法的抽象类,目的就是不想让调用者创建该类对象,通常用于某些特殊的类结构设计。
4. 抽象类的子类,必须重写抽象父类中所有的抽象方法,否则,编译无法通过而报错。除非该子类也是抽象类。
理解:假设不重写所有抽象方法,则类中可能包含抽象方法。那么创建对象后,调用抽象的方法,没有意义
面向对象之多态
多态是继封装、继承之后,面向对象的第三大特性
多态: 是指同一行为,具有多个不同表现形式。
1. 继承或者实现【二选一】
2. 方法的重写【意义体现:不重写,无意义】
3. 父类引用指向子类对象【格式体现】
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,执行的是子类重写后方法。
好处:实际开发的过程中,父类类型作为方法形式参数,传递子类对象给方法,进行方法的调用,更能体现出多态的扩展性与便利
多态的转型分为向上转型与向下转型两种:
向上转型:多态本身是子类类型向父类类型向上转换的过程,这个过程是默认的。
向下转型:父类类型向子类类型向下转换的过程,这个过程是强制的。
为什么要转型
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误。也就是说,不能调用子类拥
有,而父类没有的方法。编译都错误,更别说运行了。这也是多态给我们带来的一点"小麻烦"。所以,想要调用子
类特有的方法,必须做向下转型。
转型的异常:
为了避免ClassCastException的发生,Java提供了 instanceof 关键字,给引用变量做类型的校验
变量名 instanceof 数据类型
如果变量属于该数据类型,返回true。
如果变量不属于该数据类型,返回false
|
|