面向过程&面向对象
面向过程思想
面向对象思想
对于描述复杂的事物,为了从宏观是把握,从整体上合理分析,我们需要使用面向对象思想来分析,但是具体到微观操作,仍然需要面向过程的思想处理
什么是面向对象
面向对象编程(Object-Oriented Programming ,OOP)
面向对象编程的本质就是:以类的方式组织代码,以对象的组织(封装)数据
抽象
三大特性
从认识论角度思考先有对象后有类,对象是具体的事物,类是抽象的,是对对象的抽象
从代码运行的角度考虑是先有类后有对象,类是对象的模板
类class:是一个数据结构,是对某一类事物整体描述、定义,但是并不能代表某一个具体的事物,其中包括字段和方法,是创建对象的模板
字段(field)是类的属性,是用变量来表示
方法(method)是类的功能和操作,是用函数来表示的
对象Object:是类的一个具体的实例,创建类的对象叫类的实例化,对象的要素包括:
创建与初始化对象
使用new关键字创建对象
使用new关键字创建对象是,除了分配内存空间之外,还会给创建好的对象进行默认的初始化以对类中构造器的调用
类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的,一个类即使什么都不写,它也会存在一个构造方法(默认方法,不带参数且方法体为空)。并且构成器有两个特点:
构造器作用:
注意:定义有参构造之后,如果想使用无参构造,一定要显示的定义一个无参的构造
该露的露,该藏的藏
封装(数据的隐藏)
属性私有,get/set
继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模
extands 的意思是“扩展”。子类是父类的扩展
Java中类只有单继承 ,没有多继承
继承是类和类之间的一种关系,除此之外,类和类之间的关系还有依赖、组合、聚合等
继承关系的两个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extands
子类和父类之间,从意义上讲应该具有“is a”的关系
Object类:Java中所有的类默认直接间接继承Object类
super:指代super所在类的父类,可以用于调用父类中的方法和构造方法
调用父类的构造方法
调用父类的方法
子类对象构造的时候,如何构造来自父类的成员?——构造方法链
this是Java的一个关键字,表示某个对象(表示当前对象的引用)。this可以出现在实例方法和构造方法中,但不可以出现在类方法中
this关键字用途:
注意点:
super VS this:
代表的对象不同:
this:本身调用的这个对象
super:代表父类对象的应用
前提:
this:没有继承也可以使用
super:只能在继承条件才可以使用
构造方法:
this():本类的构造
super():父类的构造
静态成员:
实例成员:没有用static关键字声明的变量、方法称为实例变量、实例方法,统称为
实例成员和静态成员的区别
如果变量或方法依赖与类的具体实例,那么声明为实例成员;反之,不依赖于类的具体实例,那么声明为静态成员
static块:会在类被加载时执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法
public类:类声明时,如果在关键字class前面加上public关键字,就称这样的类是一个public类。可以在任何另外一个类中,使用public类创建对象
友好类:如果一个类不加public修饰,这样的类被称作友好类。在另外一个类中使用友好类创建对象时,要保证它们在同一个包中
使用对象数组来存放若干个同类型的对象,即数组的元素是对象。例如:
Student[] stu;
stu=new Student[10];
本质:对象数组的本质是引用变量的数组,也就是数组中存放的都是一系列对象的地址,通过数组下标获得对每个对象的访问
创建数组对象,逐一创建数组中的元素对象,之后才能使用该对象数组
Student[] stu=new Student[10];
for(int i=0;i<stu.length;i++){
stu[i]=new Student();
}
一个类可以把对象作为自己的成员变量,如果用这样的类创建对象,那么该对象中就会有其它对象,也就是说该对象将其他对象作为自己的组成部分,或者说该对象是由几个对象组合而成。我们把这种类之间的关系称为组合
子类型:子类定义的类型称为子类型
父类型:父类定义的类型称为父类型
声明类型:变量在定义的时候声明的类型
实际类型:变量引用的对象实际类型
多态性发生的条件
对象转换:对象的引用可以类型转换为另外一种对象的引用
对象转换的目的:为了获得通用程序设计的效果,通常将方法参数、变量定义成父类型,那么它可以接受任何子类型的值
对象转换原则:
为了确保对象转换(向下转型)的安全,使用instanceof运算符在转换前确保对象是另一个对象的实例
instanceof运算符:是一个二目运算符,左边的操作元是一个对象,右边的是一个类,当左边的对象是右边的类或子类创建的对象时,该运算符运算的结果是true,否则是false
常量:如果成员变量和局部变量被final修饰,那么就不可以再改变该变量的值,由final定义的变量为常量
常量需要在定义的时候赋值,常量标识符一般用大写字母和下划线
final方法:final定义的方法是最终的,可以防止子类重写该方法
final类:final可以放在类声明中,说明该类是终极类,不能做父类,final类中的所有方法被隐式设置为final,但是类中的成员变量可以定义为final或者非final
抽象类:有的父类设计得非常抽象,以至于它没有任何具体的实例,这样的类称为抽象类
抽象类定义:用关键字abstract修饰的类
抽象方法定义:用关键字abstract 修饰的方法
抽象类可以有抽象方法,也可以没有抽象方法,但是非抽象类一定不能有抽象方法,含有抽象方法的类一定是抽象类
抽象类不能用new运算符创建对象(即无法实例化),但可以定义抽象类的引用变量
抽象类有构造器,给子类用的
抽象类的抽象方法都要由继承它的子类去实现,除非子类也是抽象类
接口:是一种与类相似的结构,只包含常量和抽象方法,可以看成是一种特殊的抽象类,一种完全没有实现的类,目的是指明相关或者不相关类的多个对象的共同行为
接口和实现该接口的类之间的关系称为接口继承,本质上,接口继承和类继承一样,因此,如果一个类实现了一个接口,这个接口类似于该类的父类
实现接口:类可以使用关键字implements继承一个或多个接口:
[修饰符] class 类名[implements 接口名1,...,接口名n]{
}
利用extends关键字,接口可以继承(扩展)其他接口,这样的接口称为子接口
接口特点:
UML图
理解接口
形式上比较接口与抽象类
内涵上比较接口与抽象类
class OuterClass{ class InnerClass{...}//成员内部类 static class StaticNestedClass{...}//静态内部类 func(){ class LocalClass{...}//局部内部类 new ClassNameorInterfaceName(){...};//匿名内部类 } }
成员内部类(inner class)
内部类是依附于外部类的,所有只有先创建了外部类对象才能够创建内部类对象,如:
OuterClass outerClass=new OuterClass();
OuterClass.InnerClass innerClass=outerClass.new InnerClass();
成员内部类可以对外部类的成员进行任意访问,但是外部类要访问内部类的成员则需要通过内部类实例来访问
成员内部类不能存在static的成员变量和成员方法,但是可以存在静态常量
成员内部类可以被修饰为private、protect、public或包私有,就像外部类的成员一样,而外部类只能修饰为public或包私有
静态内部类(static nested classer)
内部类对象的创建是不需要依赖于外部类,因此无需先创建外部类对象
OuterClass.StaticNestedClass nestedObject=new OuterClass.StaticNestedClass();
静态内部类可以有静态成员,外部类可以直接访问静态内部类的静态成员
静态内部类和静态方法一样,只能直接访问外部类的静态数据域和静态方法成员,不饿能直接访问外部类的实例数据域和实例方法(即非static成员),只能通过对象访问外部类的实例成员变量和实例成员方法
局部内部类(local class):
匿名内内部类
new ClassOrInterfaceName(){
//类体
}
匿名内部类可以继承一个类或实现一个接口
可以在定义类的同时实例化该类的对象
匿名内部类和局部内部类类似,但匿名类没有名字,所以类体中不能定义构造方法
匿名类是表达式,意味着可以在任意表达式的位置定义匿名类
匿名内部类编译后,对应产生“外部类名$序号”为名称的class文件
枚举类型
枚举类型定义了该类型所有可能的值。JavaSE5版本后引入了枚举类型
用关键字enum定义枚举类型,例如
public enum Day{
SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIFAY,SATURDAY
}
枚举名称与类的名称遵循一样的惯例来定义
由于枚举值是常量,推荐全部用大写字母
枚举类型本质:枚举类型声明,实际上是定义一个类,所有的枚举类型隐式继承java.lang.Enum,经过编译器编译之后产生class文件
学习B站狂神说
中国大学MOOC