面向对象
面向对象的概念
所谓的面向对象是一种编程思想,通过这种思想可以把生活中的复杂事情变得简单化,从原来的执行者变成了指挥者,面向对象是基于面向过程而言的
面向对象的三大特征
封装
概念:封装是指隐藏对象的属性和实现细节,仅仅对外提供公共的访问方式
优点:1、提高安全性;2、提高重用性
private关键字:是一个权限修饰符,用于修饰成员变量和成员函数,被私有化的成员只能在本类中访问。想要修改只能,对外提供公共的,get和set方法。
继承
初衷:提高代码的重用性
好处:假设没有继承结构,每种小动物都需要提供吃的功能,可能得写100万次,这个业务相同代码量非常大降低了开发效率.产生继承后,只需要把共性的吃的功能在父类里写一次即可,哪个小动物需要提供吃,就来继承父类.
特点:1.使用extends关键字
2.相当于子类把父类的功能复制了一份
3.Java只支持单继承
4.继承可以传递
5.不能继承父类的私有成员
6.继承多用于功能的修改,子类可以拥有父类的功能的同时,进行功能拓展
7.像是is a 的关系
super关键字
代表的是父类对象的一个引用
用来在子类中使用父类的功能
如果用在构造方法中,super必须是第一条语句
方法重写Override
发生在父类与子类间的现象,子类继承父类后,就可以使用父类的所有功能.当子类想要修改父类原有的功能时,就会发生方法的重写/复写/覆盖
重写的要求 : 继承关系 + 在子类中方法的声明/签名 必须和 父类一模一样(方法的声明/签名 包括: 方法返回值 方法名(参数列表))
多态
概念
多态是指同一个对象有多种形态;多态是为了统一调用标准---父类就是标准,一切向父类看齐;好处是:不关心具体的类型,屏蔽了子类之间的不同,把子类都会当做父类来看,做出统一的编程,写出通用的代码
特点
前提: 发生继承关系 + 发生方法重写
口诀: 父类引用指向子类对象 + 编译看左边运行看右边
多态的好处
提高了程序的灵活性和扩展性;多态中,根本不关心具体的子类的类型,可以屏蔽子类间的不同,把子类都当做父类对待;代码更加通用,做出统一的编程
多态的使用
多态对象使用的成员变量 --- 使用父类的
多态对象使用的成员方法 --- 使用了父类的方法声明,使用了子类的方法体
静态方法可以重写吗 --- 不可以!!静态资源,谁调用就执行谁的功能,根本没有重写的说法!!
类和对象
类
Java语言最基本单位就是类,类似于类型。
类是一类事物的抽象
可以理解为模板或者设计图纸
通过class关键字创建
对象
类是一类事物的抽象,对象是具体的实现
对象的状态用来描述对象的基本特征
对象的行为用来描述对象的功能
对象的标识是指对象在内存中都有一个唯一的地址用来和其他对象区分开来
通过new关键字创建
创建对象的流程
Person p = new Person();
把Person.class文件加载进内存;在栈内存中,开辟空间,存放变量p;在堆内存中,开辟空间,存放Person对象;对成员变量进行默认的初始化;对成员变量进行显示初始化;执行构造方法(如果有构造代码块,就先执行构造代码块再执行构造方法);堆内存完成;把堆内存的地址值赋值给变量p ,p就是一个引用变量,引用了Person对象的地址值。
访问控制符
public
访问范围:类、包、子类、任意
protected
访问范围:类、包、子类
default
访问范围:类、包
private
访问范围:类
构造方法
构造方法的语法: 修饰符 类名(参数列表){}
构造方法的触发时间节点: 创建对象/new/实例化
构造方法可以重载,目的是为了,方便外界比较灵活的创建对象
概念:
构造方法是一种特殊的方法,它是一个与类同名且返回值类型为同名类类型的方法。对象的创建就是通过构造方法来完成,其功能主要是完成对象的创建或者对象的初始化。当类实例化一个对象时会自动调用构造方法。构造方法和其他方法一样也可以重载。
抽象类
概念
Java中可以定义没有方法体的方法,该方法由其子类来具体的实现。该没有方法体的方法我们称之为抽象方法,含有抽象方法的类我们称之为抽象类。
抽象类可以理解为是一个只有方法声明没有方法体的特殊类。
特点
通过java关键字abstract实现
可以修饰方法或者类
抽象类中可以没有抽象方法(由子类去实现)
如果类中有抽象方法,那该类必须定义为一个抽象类
子类继承了抽象类以后,要么还是一个抽象类,要么就把所有抽象方法都重写
多用于多态中
抽象类不可以被实例化
用法
构造函数
抽象类也有构造方法,但是不能本身实例化。
那抽象类的构造函数有啥用?一般用于给子类实例化
成员变量
既可以有变量,也可以有常量
成员方法
抽象类里,既可以有普通方法,有可以有抽象方法
接口
概念
接口来的目的就是为了突破java单继承的局限性
接口的好处:灵活,可以同时使用多个接口的功能
接口主要体现的是 一套开发规范
特点
接口中都是抽象方法
通过interface关键字创建接口
通过implements让子类来实现
可以理解成,接口是一个特殊的抽象类
接口突破了java的单继承的局限性
接口和类之间可以多实现,接口和接口之间可以多继承
接口是对外暴露的规则,是一套开发规范
接口提高了程序的功能扩展,降低了耦合性
总结
接口里没有构造方法,没有变量,都是常量
接口里都是抽象方法(jdk1.8可有特殊的普通方法)
接口里的常量可以简写,会自动拼接public static final
接口里的方法可以简写,会自动拼接public abstract
代码块
概念:
代码块就是一段代码被一对花括号包起来的现象.如: {........}
代码块随着位置的不同,作用和意义都不同.
静态代码块
通常用于完成项目的初始化
静态资源会随着类的加载而加载,第一时间加载进内存,并一直贮存在内存中,直到类消失静态资源才消失
静态资源只会被加载一次
静态代码块,存在的位置是成员位置.如:static{....}
构造代码块
在类的内部,方法外部,的代码块
通常用于抽取构造方法中的共性代码
每次调用构造方法前都会调用构造代码块
优先于构造方法加载
局部代码块
在方法里面的代码块
通常用于控制变量的作用范围,出了括号就失效
变量的范围越小越好,成员变量会有线程安全问题
构造代码块是最优先的,局部代码块顺序执行
执行顺序
静态代码块 > 构造代码块 > 局部代码块
异常
概述
用来封装错误信息的对象
组成结构:类型,提示,行号
结构
Throwable - 顶级父类
-- Error:系统错误,无法修复
-- Exception:可修复的错误
--RunTimeException
--ClassCastException
--ClassNotFoundException
异常处理
捕获方式
try{
需要捕获的代码
}catch(异常类型 异常名){
处理方案
}
抛出方式
在方法声明上添加throws 异常类型1,异常类型2
public static void main(String[] args) throws Exception{ }
this关键字
当成员变量 和 局部变量 同名时,通过this关键字调用成员变量!
可以在构造方法间 实现互相调用,this关键字在构造方法中必须是第一条语句
static关键字
特点
可以修饰成员变量,成员方法
随着类的加载而加载,优先于对象加载
只加载一次,就会一直存在,不再开辟新空间
全局唯一,全局共享
可以直接被类名调用
静态只能调用静态,非静态可以随意调用
static不能和this或者super共用,因为有static时可能还没有对象
概念
是java中的一个关键字,用于修饰成员(成员变量和成员方法)
final关键字
概念
是java提供的一个关键字
final是最终的意思
final可以修饰类,方法,成员变量
初衷
java出现了继承后,子类可以更改父类的功能,当父类功能不许子类改变时可以利用final关键字修饰父类。
特点
final修饰类 不能被继承
final修饰方法 可以被继承,但是不能被重写
final修饰的是常量,值不能被修改
常量的定义形式: final 数据类型 常量名 = 值
容易搞混的一些东西
类与类之间的关系
继承关系
java里只支持单根继承
class A extends B
其中A是子类,B是父类.子类可以使用父类的所有功能
方法的重写override:如果想要修改父类的原有功能,可以进行方法重写
接口和接口间的关系
继承关系
接口的出现就是为了突破java单继承的局限性
接口间可以多继承
interface A extends B , C
其中A是子接口,B和C是父接口
A就拥有了B和C的所有功能,A的功能是最全的
class Impl implements A
Impl实现类就需要同时重写A B C 接口里的所有抽象方法,否则就是一个抽象类
抽象类和接口的区别
相同点
抽象类和接口都是抽象层,一般用来提取共性
都不能被实例化
不同点
构造方法:抽象类里有,接口里没有!!
成员变量:抽象类里有,接口里没有,接口里都是常量!!
成员方法:抽象类类可以有普通方法和抽象方法,但是接口里都是抽象方法(1.8后可以有)
接口里存在简写形式,抽象类里没有.
接口里的常量,int age = 10;会为常量自动拼接public static final
接口里的方法,void save();会为方法自动拼接public abstract
怎么去设计你的抽象层,到底是体现为一个抽象类呢还是接口呢?
--关键就看你需不需要提供方法体,如果类里的方法都不需要提供方法体,可以设计为接口.如果类里的方法需要提供方法,设计为抽象类.
抽象层到底设计成抽象类还是接口,谁好呢?
--如果实现类想要同时拥有多个功能,最好选择接口,因为接口可以多继承多实现
--如果就是设计为抽象类,子类就只能继承一个父类,只有这么一次的继承权
类和接口间的关系
实现关系
实现类可以实现接口,而且可以多实现
class A implements B,C
A是实现类,B和C是接口
A需要同时重写B和C接口里的所有抽象方法,否则就是一个抽象类
类可以在继承的同时多实现
class A extends B implements C , D
A可以叫子类,也可以叫是实现类
A同时拥有父类B的功能,也同时拥有接口C和D的功能
A需要同时重写C和D接口里的所有抽象方法,否则就是一个抽象类
对于父类B里的方法吗?看需求,B类是父类,里面如果都是普通方法,只有需要修改才会发生重写
this和super的区别
this代表本类对象的引用,super代表父类对象的引用
this用于区分局部变量和成员变量
super用于区分本类变量和父类变量
this.成员变量 this.成员方法() this(【参数】)代表调用本类内容
super.成员变量 super.成员方法() super(【参数】),代表调用父类内容
this和super不可以同时出现在同一个构造方法里,他们两个只要出现都得放在第一行,同时出现的话,到底第一行放谁呢。
重写与重载的区别(Overload和Override的区别)
重载:是指同一个类中的多个方法具有相同的名字,但这些方法具有不同的参数列表,即参数的数量或参数类型不能完全相同
重写:是存在子父类之间的,子类定义的方法与父类中的方法具有相同的方法名字,相同的参数表和相同的返回类型
重写是父类与子类之间多态性的一种表现
重载是一类中多态性的一种表现