Java基础之面向对象
一. 什么是面向对象?
面向对象就是指以属性/特征和行为的观点来分析现实世界中事物的方式。
二.什么是面向对象编程?
面向对象编程就是指先使用面向对象的观点进行分析后再使用面向对象的编程语言进行翻译的过程。
三.面向对象三大特征(重点)
封装,继承,多态
四.基本概念
对象本质就是指现实生活中客观存在的事物,再java语言中代表一块内存区域。
类简单来说就是“分类”的含义,是具有相同特征和行为的对象的抽象描述
五.类的定义
1.类定义的语法格式
class 类名{
类体;
}
2.成员变量定义的语法格式
class 类名{
数据类型 成员变量名 = 初始值;
}
六.对象的创建
1.语法格式 new 类名();
2.注意事项:在java语言中使用new关键字创建/构建对象的过程叫做类的实例化,该过程的本质会在内存空间的堆区申请一块存储区域用于记录该对象独有的成员变量信息
七.引用
1.概念:`
使用引用数据类型声明的变量叫做引用型变量,简称引用
`
引用主要用于记录新创建对象在堆区中的内存地址信息,便于下次访问
2.声明方式:
类名 引用变量名;
八.成员方法(重点)
1.语法格式
class 类名{
返回值类型 成员方法名称(形参列表){
成员方法体;
}
}
2.成员方法详解
(1)返回值类型
返回值主要指从方法体向方法外传出的数据内容 返回值类型主要指返回值的数据类型,可以是基本数据也可以是引用数据类型
(2)形参列表
形式参数主要用于将方法外的数据内容传入方法体内,语法格式:数据类型 形参变量名 形参列表主要指多个形式参数,格式:数据类型
形参变量名1,数据类型 形参变量名2 …
(3)方法体
方法体主要用于编写描述该方法功能的语句
3.方法的调用
语法格式: 引用变量名.成员方法名(实参列表)
注意事项:
(1)实际参数列表的主要用于对形式参数列表进行初始化工作,因此实参列表的个数,类型,顺序等都必须与形参列表保持一致
(2)实际参数可以传递直接量/变量/表达式/方法的调用等
九.构造方法与方法重载(重点)
1.语法格式
class 类名{
类名(形参列表){
构造方法体;
}
}
2.注意事项
a.构造方法的名称与类名完全相同,并且没有返回值类型(连void都不许有);
b.当使用new关键字构造对象时会自动调用构造方法来进行成员变量的
初始化工作;
3.默认构造方法
当一个类中没有自定义任何形式的构造方法时,则编译器会自动提供一个无参的空构造方法,叫做默认/缺省构造方法。
当类中出现自定义构造方法时,则编译器不再提供任何构造方法
。
4.方法重载
(1)基本概念
在Java语言中允许出现方法名相同但参数列表不同的方法,这样的方法之间构成重载关系
。
(2)主要形式
方法重载的主要形式为:参数的个数不同、类型不同、顺序不同,与形参变量名以及返回值类型无关,但建议返回值类型最好相同。
判断能否重载的核心:调用方法时能否区分。
(3)实际意义
方法重载的实际意义在于:调用者只需要记住一个方法名称就可以调用各种不同的版本来实现各种不同的效果。
十.This关键字
(1)基本概念
在Java语言中允许出现方法名相同但参数列表不同的方法,这样的方法之间构成重载关系。
(2)主要形式
方法重载的主要形式为:参数的个数不同、类型不同、顺序不同,与形参变量名以及返回值类型无关,但建议返回值类型最好相同。
判断能否重载的核心:调用方法时能否区分。
(3)实际意义
方法重载的实际意义在于:调用者只需要记住一个方法名称就可以调用各种不同的版本来实现各种不同的效果。
使用场合
(1)当形参变量名和成员变量名同名时,在方法体中会优先选择形参变量使用,若希望使用
成员变量,则需要在变量名前面加上this.的方式加以说明(重中之重)。
(2)在构造方法的第一行使用this(实参)的方式可以调用本类中的其他构造方法(了解)。
注意:
a.当基本数据类型的变量作为方法的参数传递时,通常形参数值的改变不会影响到实参;
b.当引用数据类型的变量作为方法的参数传递时,通常形参指向内容的改变会影响到实参
指向的数据内容; c.当引用数据类型的变量作为方法的参数传递时,通常形参改变指向后再改变指向的内容
不会影响到实参指向的数据内容;
十一.递归调用
1.基本概念
递归主要指在方法体的内部调用当前方法自身的形式。
2.使用方式
a.寻找递归的规律并指定退出条件; b.使用递归必须使得问题简单化而不是复杂化;
c.若递归影响到程序的执行性能,则需要使用递推替代之;
十二.封装
.1 基本概念
通常情况下在测试类中可以给成员变量赋值一些合法但不合理的数值,无论是编译还是运行阶段都不会报错或给出提示,此时与现实生活不符。
为了避免上述错误的发生就需要对成员变量进行密封包装处理,来保证成员变量值的合理性,该机制就叫封装。
2 封装的流程
(1)私有化成员变量,使用private关键字修饰;
(2)提供公有的get和set方法,在方法体中进行合理值的判断;
(3)在构造方法中调用set方法进行合理值的判断;
tatic关键字(重点)
1 基本概念
通常情况下成员变量隶属于对象层级,每个对象都拥有独立的内存空间来记录独有的特征信息,当所有对象的某个成员变量数值完全相同时若还单独记录,则会造成内存空间的浪费。
为了避免上述问题,则使用static关键字修饰该成员变量表达静态的含义,该成员变量由对象层级提升为类层级被所有对象共享,随着类的加载准备就绪与对象是否创建无关。
static关键字还可以修饰成员方法,建议使用类名.的方式访问。
2 使用方式
(1)在非静态的成员方法中既能访问非静态的成员也能访问静态的成员; (成员:成员变量 + 成员方法
静态成员被所有对象共享,因此this可以访问) (2)在静态的成员方法中只能访问静态的成员 不能访问非静态的成员; (成员:成员变量
- 成员方法 调用该方法时可能还没有创建对象) (3)只有隶属于类层级被所有对象共享的内容才可以加static关键字修饰。
(不能滥用static关键字)
单例设计模式(重中之重 )
(1)基本概念
在某些特殊场合中,一个类对外能提供且只能提供一个对象,这样的类叫做单例类。 而单例类的设计思想和套路叫做单例设计模式。
(2)实现流程
a.私有化构造方法,使用private关键字修饰; b.提供本类类型的引用指向本类类型的对象,并使用private
static关键字共同修饰; c.提供公有的get方法负责将对象返回出去,并使用static关键字修饰;
(3)实现方式
单例设计模式的实现方式有两种:饿汉式 和 懒汉式,在以后的开发中推荐饿汉式。
十二.继承
1 基本概念
当多个类中具有相同的特征和行为时,可以将共性的内容提取出来组成一个公共类,让多个类分别吸收公共类中已有的特征和行为,而在多个类的内部只需要编写自己独有特征和行为的机制就叫继承。
使用继承提高了代码的复用性,可维护性以及可扩展性。 在Java语言中使用extends(扩展)关键字来表达继承关系。
2 注意事项
(
1)子类可以继承父类中的成员变量和成员方法,包括私有成员变量,只是不能直接访问; 子类不可以继承父类中的构造方法和私有成员方法;
(2)无论使用何种形式构造子类的对象时,都会自动调用父类的无参构造方法来初始化从
父类中继承下来的成员变量,相当于在构造方法的第一行增加super()的效果;
(3)Java语言中支持单继承不支持多继承,也就是一个子类只能有一个父类,但一个父类 可以有多个子类。
(4)使用继承必须满足逻辑关系:子类 is a 父类,也就是不能滥用继承。
3 this和super的比较(了解)
(1)基本概念
this关键字主要用于代表本类类型的对象;
super关键字主要用于代表父类类型的对象;
(2)使用方式
使用this.的方式可以访问本类中的成员变量和成员方法;
使用super.的方式可以调用父类中的成员变量和成员方法;使用this(实参)的方式在构造方法的第一行可以调用本类中的其他构造方法;
使用super(实参)的方式在构造方法的第一行可以调用父类的构造方法;
要求大家掌握的用法:
a.使用this.的方式可以区分同名的成员变量和局部变量;
b.使用super(实参)的方式可以调用父类的构造方法;
c.使用super.的方式可以调用父类中被重写的方法;
4 方法的重写(Override)
(1)基本概念
从父类中继承下来的方法不足以满足子类的需求时,则需要在子类中重新写一个和父类一样的方法来覆盖从父类中继承的版本,这种方式就叫方法的重写。
(2)重写的原则
a.要求方法名相同、参数列表相同、返回值类型相同,从jdk1.5开始允许返回子类类型。
b.要求访问权限不能变小,可以相同或者变大。
c.要求不能抛出更大的异常(异常机制)。
十三.访问控制
1 常见的访问控制符
访问控制符 访问权限 本类 本包中的类 子类 其它包中的其它类
public 公有的 ok ok ok ok
protected 保护的 ok ok ok no
啥也不写 默认的 ok ok no no
private 私有的 ok no no no
2 包的定义
package 包名; - 表示定义一个包,用于管理文件方便和解决命名冲突问题。
package 包名1.包名2…包名n;
3.final关键字(重点)
1 基本概念
final本意为"最终的,不可改变的",该关键字可以修饰类、成员方法、成员变量。
2 使用方式
fi
nal关键字修饰类体现在该类不能被继承。
- 为了避免滥用继承,如:java.lang.String类、System类等. final关键字修饰方法体现在该方法不能被重写但可以被继承。
- 为了避免不经意间造成的重写,如:java.text.DateFormat类中的format方法等。 final关键字修饰成员变量体现在该成员变量必须初始化而且不能更改。
- 为了避免不经意间造成的数值改变,如:java.lang.Thread类中MAX_PRIORITY等。
十三.多态
1.基本概念
多态主要指同一种事物表现出来的多种形态
2.语法格式
父类类型 引用变量名 = new 子类类型();
3 多态的效果
(1)当父类引用指向子类对象时,父类引用可以直接调用父类独有的成员方法;
(2)当父类引用指向子类对象时,父类引用不可以直接调用子类独有的成员方法;
(3)对于父子类都有的非静态成员方法来说,编译阶段调用父类版本,运行阶段调用子类版本;
(4)对于父子类都有的静态成员方法来说,编译和运行阶段都调用父类版本;
(静态成员隶属于类层级,与指向哪个对象无关)
4 引用数据类型之间的转换
(1)Java语言中引用数据类型转换分为两种:自动类型转换 和 强制类型转换。
其中自动类型转换主要指从小范围到大范围的转换,也就是子类向父类的转换。
其中强制类型转换主要指从大范围到小范围的转换,也就是父类向子类的转换。
(2)引用数据类型之间的转换必须发生在父子类之间,否则编译报错。
(3)当父类引用转换的目标类型不是该引用真正指向的子类对象时,则编译ok,运行阶段 产生类型转换异常。
(4)为了避免上述错误的发生,应该在强制类型转换之前加上判断,具体如下: if(父类引用 instanceof 目标类型) -
用于判断父类引用真正指向的对象是否为目标类型
- 若是则返回true表示条件成立,否则返回false。
5 实际意义
多态的实际意义在于屏蔽不同子类的差异性实现通用的编程带来不同的结果。
十四.抽象类
1 抽象方法的概念
抽象方法主要指不能具体实现的方法,体现在该方法没有方法体并使用abstract关键字修饰
2 抽象类的概念
抽象类主要指不能具体实现的类,体现在该类不能实例化/构造对象并使用abstract修饰。
3 注意事项
1)抽象类中可以有成员变量、成员方法以及构造方法。
(2)抽象类中可以有抽象方法也可以没有。
(3)拥有抽象方法的类必须是抽象类,因此严格来说,具有抽象方法并使用abstract
关键字修饰的类才是真正意义上的抽象类。
4 实际意义
抽象类的实际意义不在于自身创建对象而在于被继承,当一个类继承抽象类后则必须重写抽象方法,否则该类也得变成抽象类。
因此抽象类对子类具有强制性和规范性,叫做模板设计模式。
经验分享:
在以后的开发中推荐使用多态的语法格式,此时父类引用直接调用的所有方法都是父类拥有的方法,若更换子类时只需要将new后面的类型改变而其它所有代码不变就立刻生效,因此提高了代码的可维护性。
该方式的缺点在于:父类引用若希望调用子类独有方法,则需要强制类型转换。
接口(重点)
1 基本概念
接口是一种比抽象类还抽象的类,因此不能实例化对象。 定义类的关键字是class,而定义接口的关键字是interface。
继承类的关键字是extends,而实现接口的关键字是implements。
2 类和接口之间的比较
类和类之间的关系 使用extends关键字来表达继承的关系 支持单继承
类和接口之间的关系 使用implements关键字来表达实现的关系 支持多实现
接口和接口之间的关系 使用extends关键字来表达继承的关系 暂时认为单继承
3 抽象类和接口之间的区别(笔试题)
(1)定义抽象类的关键字是class,而定义接口的关键字是interface。
(2)继承抽象类的关键字是extends,而实现接口的关键字是implements。
(3)继承抽象类支持单继承,而实现接口支持多实现。
(4)抽象类中可以有构造方法,而接口中不可以有
(5)抽象类中可以有成员变量,而接口中只可以有常量。
(6)抽象类中可以有成员方法,而接口中只可以有抽象方法。
(7)抽象类中增加方法通常不影响子类,而接口中增加方法通常影响子类。
(8)从jdk1.8开始允许接口中有非抽象方法,但需要使用default关键字修饰。
内部类(了解)
1 基本概念
当一个类的定义放到另外一个类的类体中时,那么这个类就叫做内部类,而该类所在的类叫做外部类。
类体中的内容:成员变量、成员方法、构造方法、静态成员、构造块、静态代码块、内部类
2 语法格式
class 外部类名{
class 内部类名{
内部类体;
}
}
3 基本作用
当一个类存在的价值仅仅是为某一个类单独服务时,就可以将这个类定义为所服务类的内部类,内部类可以直接访问所在类的私有成员而不再需要提供公有的get和set方法。
4 基本分类
普通内部类 - 直接将类的定义放在另外一个类的内部。 静态内部类 - 使用static关键字修饰的内部类。
- static关键字只能用于修饰内部类。 局部内部类 - 直接将类的定义放在方法体的内部。
- 只在当前方法体中有效。 匿名内部类 - 主要指没有名字的内部类。
5 匿名内部类(重点、难点)
(1)语法格式
接口/父类类型 引用变量名 = new 接口/父类类型(){ 方法的重写 };
(2)经验分享
当接口类型的引用作为方法的形参时,实参的传递方式有两种:
a.自定义类实现接口并重写抽象方法,然后构造自定义类的对象作为实参传递;
b.使用匿名内部类的语法格式得到接口的引用作为实参传递;