目录
前言:
一.面向对象和面向过程
面向过程
面向对象
面向过程与面向对象
二.类和对象
类
概念
成员变量(静态成员变量 和 非静态成员变量)
成员方法(静态成员方法 和 非静态成员方法)
代码块(实例代码块 和 静态代码块)
构造方法 特殊 用来为成员变量初始化
定义:
特点:
作用:
对象
对象和引用
三.this关键字 表示当前正在调用的对象
四.static关键字
概念
static修饰成员
static修饰方法
总结
五.包 管理类 避免类重名,按功能进行组织管理,访问权限的控制
问题:
包:
作用:
命名规范:
六.访问权限修饰符
七.面向对象3大特征--封装
概念
分类
八.继承
概念
特点:
优点:
方法重写
super
继承中构造方法调用
九.抽象类和抽象方法
抽象类:
抽象方法:
十.多态
优点:
缺点:
多态注意事项:
十一.接口
接口
接口和抽象类区别
总结
前言:
此文章为Javaopp面向对象部分核心知识点梳理,不包括代码演示部分,如果需要代码演示来更好的了解面向对象,可回顾Javaopp面向对象01至04
一.面向对象和面向过程
面向过程
面向过程,适合简单的程序设计,按照步骤一步一步区实现,以函数进行组织
典型的代表语言:c语言
面向对象
面向对象,适合复杂的程序设计,先宏观分类人,类与类之间建立联系,以类进行组织
典型的代表语言:c++,c#,java,python
代码复用,代码扩展,
开车和造车
面向过程与面向对象
面向过程和面向对象都是程序设计的一种风格(思想)
面向对象适合复杂问题,先宏观的分类设计,具体某一个步骤落地时,又需要面向过程,他们是相辅相成的
二.类和对象
类(class)和对象(object)是面向对象的核心概念
类
概念
具有相同特征的事物的抽象描述(定义)
是一类事物属性 和 行为/功能的抽象(概念,模板)
成员变量(静态成员变量 和 非静态成员变量)
成员变量(在类中定义)
可以使用基本数据类型,也可以使用引用数据类型
java中在使用前都必须初始化
成员变量可以不对其初始化,系统会默认进行初始化(默认值)
成员变量可以在成员方法,构造方法,代码块中使用
成员方法(静态成员方法 和 非静态成员方法)
1.形参列表:表示成员方法的输入
2.返回数据类型:表示成员方法输出,void表示没有返回值
3.方法主体:表示为了实现某一功能的代码块
4. return语句不是必须的
代码块(实例代码块 和 静态代码块)
定义在类中,类似于一个没有名字的方法,
分为
1、实例代码块
{
}
实例代码块:在创建对象时,被自动调用执行
2、静态代码块
static{
}
静态代码块:在类被加载时,被自动的调用执行
因为代码块没有名字,只能在满足条件时,自动由系统调用
类什么时候被加载
通过类名访问类中静态成员时,类会被加载
当一个类中使用main方法,也会加载类
创建对象也会加载类
类只被加载一次
注意:如果有多个实例代码块或多个静态代码块,他们会按照先后顺序执行
实例代码块先于构造方法执行
构造方法 特殊 用来为成员变量初始化
类的构造方法,类没有定义时,会默认又一个无参的构造方法
构造方法的名字与类名相同
定义:
构造方法名字与类名相同,且没有返回值,且不需要void修饰
特点:
类中没有定义时,会默认有一个无参的构造方法,在无参的构造方法中为成员变量赋初始值
我们还可以定义有参的构造方法,通过有参的构造方法为成员变量进行初始化赋值
一旦类中定义了有参的构造方法,那么默认的无参的构造方法便会失效
如果需要,需要显示的定义无参构造方法
作用:
用来对新创建的对象中的成员变量进行初始化
对象
对象是以类为模板在内存中创建出来的一个实例(对象,具体的可以使用的)
对象和引用
引用类型变量
Car car = new Car();
Car car1 = car;
对象在堆内存中存储
car拿到的不是对象本身,而是对象的内存地址。
三.this关键字 表示当前正在调用的对象
在编程时,为了区分成员变量和局部变量,在编码时,可以使用this关键字进行提示,
使用this调用的是成员变量或者成员方法,还有构造方法
this在实际的运行时,表示当前正在调用此方法的对象
this表示当前对象
四.static关键字
概念
static表示静态,可以修饰成员变量,成员方法,代码块,内部类
类--class--静态代码 只有一份的存在
静态表示--在内存中只有一份的存在
static修饰成员
static修饰的变量就是静态变量(类变量,与类一样,只有一份)
当所以类的对象的某一个属性值相同时,可以把他定义为静态的
当类被加载时,静态的成员就会被加载,先于对象创建存在
静态的先执行,可以被类,对象访问,非静态的只能通过对象访问
static修饰方法
static 关键字修饰的方法就是静态方法,属于类,我们可以通过类名直接访问
当方法中不需要使用非静态的成员变量时候,我们可以将这个方法设计为静态方法,不需要创建对象,直接通过类名访问
总结
static修饰后的成员,随着类的加载而加载
先于对象而存在
static修饰的成员变量在内存中只有一份,适合将所有实例都相同的属性设计为静态(中国人类 国籍都是人类)
静态的成员可以使用类名/对象名调用,一般建议使用类名访问
static修饰方法
静态方法只能访问静态的变量,不能访问非静态的变量
在方法中不使用非静态成员变量时,可以将方法设计为静态
public int max(int a,int b){
return (a>=b)?a:b;
}
五.包 管理类 避免类重名,按功能进行组织管理,访问权限的控制
问题:
项目越写类越多,难免可能会出现同名的类(java.util.Date,java.sql.Date)
不同类功能不同,需要分类管理
包:
为了解决一些类管理的问题,java引入包机制来解决
包称为类的命名空间(可以理解为是一个文件夹)
是类名的组成部分
类名(全类名=包名(地址)+类名简称
day1.demo2.Car
作用:
一个类属于不同的包,就可以避免同名类问题
按照不同的功能管理类(web层,service逻辑处理,dao数据管理访问层)
控制访问权限
命名规范:
包名单词全部小写
包命名:
第一级,项目类型 com,org,gov,edu......
第二级,公司名称 oracle,sun,huswei,ali,ffyc.....
第一级,项目名称 oa,erp,cms.....
第四级,功能模块名称 .....
导入外部包的类,关键字”import"
当在一个类中使用其他包中的类时,需要先使用impor关键字导入进来(全类名)
只有Java.lang包中的类比较特殊,使用时不需要导入
六.访问权限修饰符
访问权限修饰符,用来修饰类中的成员,控制是否可以被访问
从大到小
public:公共权限,在系统中哪里都可以访问
修饰类(包含内部类),方法(构造方法,成员方法),成员变量
protected:受保护权限,在本类,同包类,不同包子类中可以访问
修饰内部类,方法(构造方法,成员方法),成员变量
:默认权限,在本类,同包类访问
修饰类(包含内部类),方法(构造方法,成员方法),成员变量
private:私有权限 只能在本类中使用
修饰内部类,方法(构造方法,成员方法),成员变量
七.面向对象3大特征--封装
概念
1、包装,例如我们将一些常用的功能进行抽取,定义成一个方法
2、面向对象特征中的封装:隐藏,对类中的成员对外是否可见进行控制
使用权限修饰符控制成员对外可见性
分类
成员变量私有化
构造方法私有化
八.继承
概念
子继承父 儿子就可以拥有父亲的功能
面向对象语言也引入了继承的思想
猫和狗 都用有名字,年龄,吃东西的属性和行为
可以将这些共性的属性和行为进行抽取,这样就不需要在每个类中定义同样的属性和行为,只需要类与类之间建立继承关系
特点:
子类继承父类后,拥有父类所有的实例变量和方法
但是不能直接访问私有成员
java中一个类不能继承多个类
只能直接继承一个类,但是可以多层继承
优点:
减少代码冗余,提高代码复用性
提高程序功能的扩展性(分别在猫和狗类中维护他们各自特有的属性和行为)
方法重写
方法的重写
有时候,父类方法中的实现(父类方法中为完成功能所写的代码),不能满足子类中的需要 (与子类中的实现不同)
就可以将父类中的方法在子类中进行重写(在子类中对父类中的方法进行重新定义)
这样子类中的重写的方法,就会覆盖掉父类中方法
重写方法时的语法规则:
方法名相同,参数相同
方法返回值类型相同
子类重写的方法权限必须等于或大于父类方法的权限
子类重写的方法结构应与父类方法结构一致
super
在子类中使用super关键字,访问父类中定义的那部分成员
super.成员变量
super.成员方法(常用)当子类中重写了父类方法时,为了区分调用的是父类中还是子类中重写的方法,使用super调用父类中的
super()表示调用父类中构造方法
继承中构造方法调用
总是在子类的构造方法中,使用super()调用父类中的构造方法
为了确保对父类成员进行初始化
默认在子类中的构造方法中,会默认调用父类中的构造方法
每当创建子类对象时,会调用子类构造方法,在子类构造方法中调用父类构造方法
而且在子类构造方法的第一行就会调用父类构造方法,先确保父类中的成员被初始化
子类构造方法中默认会调用父类无参构造方法、
如果需要显示的使用super调用,必须放在构造方法的第一行
还可以调用父类中指定的构造方法
九.抽象类和抽象方法
抽象类:
被abstract关键字修饰的类,里面可能会包含抽象方法
当类中没有足够的信息(抽象方法)来描述一个具体的对象时
抽象类除了不能创建对象之外,类的其他功能都正常(成员变量,构造方法)
抽象类一般位于类结构的上层,用来定义有哪些功能,让具体的子类继承实现即可
静态的方法不能被修饰为抽象的方法的
一个类中可以定义多个抽象方法的
抽象方法:
定义方法,没有具体的实现,子类进行重写
十.多态
类与类要有继承关系
父类类型表示子类对象
优点:
只需要定义一个方法,处理不同的子类,提高程序的扩展性
缺点:
为每一种对象定义一个方法,不便于程序的扩展,每添加一种类型,就需要修改代码
多态注意事项:
注意成员调用时分为编译期间和运行期间
编译期间:写代码时,由于类型上升为父类类型,所以只能调用到父类中定义成员
运行期间:运行代码时,实际调用的是子类中重写的方法
对非静态成员方法:
编译看左边,运行看右边
对于静态成员方法h和成员变量:
都是编译看左边,运行也是看左边
十一.接口
接口
是一种更为彻底的抽象,主要用来定义功能
接口是不能被创建对象的,
jdk8之后接口可以定义4中内容:
1.静态常量
2.抽象方法
3.静态方法(jdk8之后才开始有的)
4.默认方法(jdk8之后才开始有的)
接口还可以继承其他多个接口
接口和抽象类区别
类实现接口,一个类可以实现多个接口
MyInterfaceImpl类是MyInterface接口的实现类
一个类如果实现接口,
要么重写接口中抽象方法
要么将此类声明为抽象类
一个类只能直接继承一个类,间接多层继承多个类
一个类可以实现多个接口
一个接口可以继承多个接口
总结
面向对象目标:合理的组织类与类之间的关系,让程序设计复用性更高,扩展性更高。