Java面向对象
什么是面向对象
面向过程:注重解决问题的过程,环环相扣,以自身为核心
优点:对小项目开发速度快
缺点:不易扩展
面向对象:注重谁来做,更符合人的思想
优点:易扩展
缺点:速度慢消耗内存
面向过程
面向对象
面向对象中的类和对象
类和对象有一定关系:类是对象的模板,对象是类实例
类:(模具)
有相似的属性行为的一类对象,例如:人类,植物类。。。
根据具体存在的对象,这些对象具有相同的属性和行为,我们--抽象出来的--。
对象:(模具创造的具体表现)【对象名、实例名、引用名】
对象是类创造出来的,是类的具体实例
创建类和对象
创建类:一般将这个类中对象能用得到的公用属性定义为成员变量(为成员变量的实例属性)
创建对象:类 对象名(引用) = new 类( );//类的实例化
例如:
给对象赋值
对象.属性名
例如:
打印对象的属性值
不同类的相互引用
类的属性和行为
属性:类中的成员变量
行为:就是类中的方法(动作)
构造方法(构造器)
特点:
1、构造方法是一个方法,方法名跟类名一样
2、构造方法没有返回值,也没有void
3、构造方法用来初始化属性和创建对象
4、构造方法通过new关键字调用,当你new对象时候,构造方法自然就执行了
5、当类里没写构造方法时就会隐式提供一个无参的构造方法
6、当你写了有参构造,而没有写无参构造,那么默认的无参构造方法就失效了
7、构造方法可以重载
8、构造方便程序员创建对象和给属性赋值
ps:成员变量的默认值会在无参构造里隐式赋默认值
权限修饰符 类名(){
}
面向对象的三大特性
封装
思想特点:
1、把属性方法等放到一个类中通过对象赋值调用方便传递
2、把相同的功能封装方法当中,方便调用
3、Java中封装一般使用私有权限,其他类调用时通过前面类提供的公有set,get方法通过对象进行赋值
权限修饰符
private 私有
public 公有
继承
什么叫进程:
继承∶生活中的继承的概念,运行编程世界当中
只要满足is-a关系,就可以用于继承
特点作用:
特点:
1.在java中子类只能单继承(一个子类只能有一个父类)
2.私有属性无法继承
3.子类会继承父类的属性和方法(私有除外)
如果父类的属性(变量)和行为(方法)不想被子类继承的话,那么就给他变成私有的,private来修饰
作用:
实现代码复用
写法结构:
Object为顶层父类,所有类都继承他
方法重写(override)
重写继承父类的行为(方法),当父类的行为无法满足子类时就要考虑重写,要保持跟父类继承过来的方法一样,重写其中的逻辑代码
重写equals方法
Object里的equals只判断了引用(对象地址),字符串中就重写了equals,一般字符串会放在常量池中
如果想通过equals判断两个对象内容是否一样,那么你需要重写,并且自己判断逻辑
重写tostring方法
当我们打印了引用类型数据时,一定会调用tostring方法
默认是在object下的方法,string类重写了这个方法
多态
同一父类的行为方法,子类重写后的不同表现形式
多种形态:编译阶段和运行阶段指向的对象不一样
理解:父类的引用指向子类的对象,运行阶段还是找子类的行为属性等
new对象阶段在运行时进行,引用在编译时运行
多态的向上转型和向下转型
向上转型:
东北虎一定是老虎。子类转父类
向下转型:
老虎一定是东北虎(错)。父类转子类,可能会报错,因此在转换前需要用instanceof判断一下是什么类型的对象(引用指向哪个类)
当想用子类的 特有 方法时需要强转
实现多态机制:
1、要有继承关系
2、父类引用指向子类对象
好处作用:
面向抽象,方便扩展,当需要扩展多个子类并调用子类重写的方法时可以通过父类直接调用
常见报错
super关键字
作用:存在于构造方法第一行,默认会调用父类的无参构造方法
在堆中表现为
super调用父类的有参构造
类似this,super也可以调用父类的有参构造,用于给父类的属性初始化,但是这两者不能同时存在。
重写时super调用父类的方法行为
作用:当要重写的方法需要用到父类被重写方法的逻辑时需要super调用父类被重写的方法
例如:
super的注意点
5、子类父类属性行为都不同时,调用父类属性super可以省略,反之不可以省略。
final关键字
作用:
final:最终,不可变的
1、final能修饰类、实例属性、局部变量、方法、引用
2、final修饰的类不可被继承
3、final修饰的方法不能被重写
4、final修饰的局部变量只能赋值一次
5、final修饰的实例(成员)属性必须手动赋值一次【默认的值会失效】
6、final和static一起用定义常量
7、final修饰的引用也不能改变
静态(static)关键字
特点:
1、static是一个关键字
2、static能修饰属性,这个属性叫静态属性
3、static能修饰方法,这个方法叫静态方法
4、节约内存,存在于方法区中
5、
什么时候用:
当属性跟对象没有太大关系,跟类有关系的我们定义静态属性
静态属性的调用
静态相关的东西因为跟类相关,所有通过类名(对象) .
其实静态属性(变量)跟对象没什么关系,最终都是找到这个属性所在的类,通过类调用的
静态方法的调用
特点:
用static修饰的方法,也是通过类名调用,但是对象也可以访问静态属性
静态方法只能 直接 访问静态相关的属性和方法
实例静态代码块
静态代码块 static {}
用于告诉你什么时候加载的类
实例代码块 {}
用于实例什么时候加载的(什么时候创建的对象)
告诉你类什么时候创建对象了,这是一个机制
都可以给静态属性赋值,初始化静态属性
实例静态代码块的执行顺序
静态代码块要优先与实例代码块
静态代码块
静态代码块1
哈哈
实例代码块
构造方法
this关键字
作用:对象本身,就是这个对象,调用当前类的对象
:是调用本类成员(成员变量,成员方法)
this指对象本身,谁调用实例方法,那这个this就指向谁
通过this()这种方式,可以其他调用的构造方法
就是通过创建对象后,this指向的这个对象在自己的这个类中调用属性,方法
例如:实例方法中的this 初始化实例属性
哪个对象调用方法this就指向谁
注意:
当形参名跟实例属性名相同时this不可以省略
this不能用在静态方法(最终通过类调用,因此没法区分)中(因为this是指向当前调用属性或方法的对象【当前类的对象】,会分不清到底是哪个对象调用的)
this调用构造方法
通过this()这样方式可以调用其他的构造方法(只能放在第一行)
抽象类
定义:使用abstract关键字修饰的类,方法
类根据对象之间的共同特征,抽象出来的
抽象类也根据类之间相同特征抽象出来的
特征作用:一般用来约束子类,求子类必须要重写抽象方法
1、抽象类里面的抽象方法,是要求子类必须要重写实现的
2、抽象不能new创建对象,final关键字不能和abstract连用
3、抽象类可以有构造方法,用于子类继承,可以初始化抽象类属性。实例方法、静态常量、实例属性
4、抽象方法只能存在抽象类中,抽象类不一定只有抽象方法
接口interface
完全抽象的,我们抽象抽出来的都是动作或者行为(方法)
接口把调用者和实现这分离,我们所说的解耦
写法注意事项:
1.权限修饰符 interface 接口名{ 抽象方法 }
2.接口里允许有常量(因为静态跟类有关所以允许存在),不能有实例属性,(可以写静态方法,跟接口关联),不能写构造方法
3.接口在编译时都可以进行强转但是运行时不一定通过(除非两个存在实现,继承关系)
3.通过implements + 接口名 实现接口。可以多实现(继承)弥补Java的单继承 (接口就是更抽象的类类似继承)
4.普通类实现了接口,必须实现里面的抽象方法,对于抽象类说,实现接口中的抽象方法不是必须的,所以抽
象类在类和接口之间起到一个缓冲作用,例如接口有4个抽象方法,类只需要接口中的两个,就可以先用抽象
类实现一下接口中类需要实现的抽象方法,再用类继承抽象类重写抽象类实现的方法就行了
5.可以类似多态形势,面向接口编程(跟多态的运行方式相似),当需要用到接口中的特有的抽象方法并且子
类重写了此抽象方法时用
注意事项
1、调用方法时形参的类型,基本数据类型就是值,引用数据类型传的是个地址
2、当要对类赋多个值时要考虑数组,集合等方式存放
3、局部变量未初始化不能用
例题:
ps:
OOA:面向对象分析
OOD:面向对象设计
OOP:面向对象编程