JAVA面向对象
Java类
什么是类
类其实是个模板,是一个具有共同特点的集合。比如说饮料:都有包装,都有颜色,都有味道,都是被喝的东西。这些东西都是抽象出来的属性和行为。
类的构成
类是由抽象出的属性和行为组成的对一种实物的描述,实物的属性是类的成员变量,实物的行为是类的方法。
Java类和对象的概念
类的概念
类的实质是一种数据类型,类似于int、char等基本类型,不同的是它是一种复杂的数据类型。因为它的本质是类型,而不是数据,所以不存在于内存中,不能被直接操作,只有被实例化为对象时,才会变得可操作。
对象的概念
现实世界中任何物体都能被当作是对象,不过在正常开发的时候通常只是在一定的范围去考虑和认识与系统相关的事物并用系统中对象抽象的表示他们。
对象和类的关系:类是物体属性和行为的模板,对象是物体的具体实现
封装的概念
- 在面向对象程式设计方法中,封装是指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。
- 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。
- 要访问该类的代码和数据,必须通过严格的接口控制。
封装的作用
- 封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。
- 适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。
封装的优点
一、减少耦合(良好的封装能够减少耦合,提高系统独立性)
二、可重用性(封装重复代码,提高软件的可重用性)
三、精确控制(可以对成员变量进行更精确的控制)
四、安全性(隐藏信息,实现细节,降低了构建大型系统的风险)
实现封装的步骤
public class Person{
private String name;
private int age;
}
这段代码中,将 name 和 age 属性设置为私有的,只能本类才能访问,其他类都访问不了,如此就对信息进行了隐藏。
—— 关键字 private
public class Person{
private String name;
private int age;
public String getName(){
return name;
}
public int getAge(){
return age;
}
public void setName(String name){
this.name = name;
}
public void setAge(int age){
this.age= age;
}
}
采用 this 关键字是为了解决实例变量(private String name)和局部变量(setName(String name)中的name变量)之间发生的同名的冲突。
—— 关键字 this
修饰符
访问修饰符
- default (即缺省,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法
- private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
- public : 对所有类可见。使用对象:类、接口、变量、方法
- protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
常用的非访问修饰符
- static 修饰符,用来修饰类方法和类变量。
- final 修饰符,用来修饰类、方法和变量,final 修饰的类不能够被继承,修饰的方法不能被继承类重新定义,修饰的变量为常量,是不可修改的。
- abstract 修饰符,用来创建抽象类和抽象方法。
- synchronized 修饰符,主要用于线程的编程,synchronized 关键字声明的方法同一时间只能被一个线程访问。synchronized 修饰符可以应用于四个访问修饰符。
- volatile 修饰符,volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
修饰类: 不能被继承
修饰成员变量: 不能被修改,赋值一次
修饰成员方法: 不能被重写
继承
继承的概念
- 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。
- 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
继承的作用
- 子类拥有父类的属性和方法,减少重复的代码,维护性高。
- 代码简洁,提高了代码的复用性。
继承关键字
- class——定义类
- interface——定义接口
- extends——继承父类
- implements——实现接口
java面向对象三大特征之一
含义:子类继承父类,可以直接使用父类的属性和方法(主要使用方法)。
父类:有时候也会被别人叫超类、基类。
关键字:estends
继承:类和类之间的关系
一般什么时候用继承:一般一个小的类和大的类之间这样使用。比如:Animal Dog Cat
好处是:减少代码的冗余
继承的特点:
1、子类可以继承父类非 private 的属性和方法
2、子类可以有自己特有的属性和方法
3、java类的继承是单继承,但是可以多重继承
4、子类可以重写父类的方法
extends和implements的区别
相同点:
- 都属于Java中的继承
- 都发生在多各类中
不同点:
- extends只能单继承,implements可以实现多继承
- extends继承父类时,父类中可以存在方法的默认实现
而implements在实现接口时接口中不能有方法实现 - extends发生在子类和父类之间,implements发生在实现
类和接口之间。
继承示例:
public class Animal {
private String name;
private int id;
public Animal(String myName, String myid) {
//初始化属性值
}
public void eat() { //吃东西方法的具体实现 }
public void sleep() { //睡觉方法的具体实现 }
}
public class Penguin extends Animal{
}
estends关键字
在 Java 中,类的继承是单一继承,也就是说,一个子类只能拥有一个父类,所以 extends 只能继承一个类
使用继承前
使用继承后
继承的优点
- 提高代码的复用性。
- 子类中重复的代码只需要在父类中写一遍,所有子类都可以应用。
- 提高代码的可维护性。
- 只需要修改父类属性和方法,所有的子类都会应用。
- 提高类和类之间的关联性,为多态做基础。
- 其实这也是继承的缺点,增加了类和类之间的耦合度,耦合度的增加意味着后期扩展性的降低。
super 与 this 关键字
super关键字:
一、我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。
二、super调用构造方法时,只能是第一句。
三、super不能访问父类的private成员。
implements关键字:
使用 implements 关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)
this和super的区别:
1、this代表本类对象(this理解为一个代词,就是创建的那个对象,new的那个对象)
2、super代表父类对象
3、属性和方法都是对象调用的,那么this和super都可以调用属性和方法
包的概念
本质就是一个文件夹,用来管理我们的类的,我们的类都要放在包中。我们某些相同功能的类,可以放在同一个包中
包的作用
一、把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用
二、如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。
三、包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。
使用IDE创建包
两种方法:
一、分别创建包和类
二、创建类的过程中创建类所在的包
包的命名规范
一、包名由小写字母组成,不能以圆点开头或结尾
二、包名之前最好加上唯一的前缀,通常使用组织倒置的网络域名
三、包名后续部分依不同机构内部的规范不同而不同
JDK提供的基本包
01.java.lang
虚拟机自动引入
02.java.util
提供一些工具类
java.io
文件操作
需求:
代码:
抽象类和接口
抽象类概念:
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类的特点:
- 抽象类可以有构造方法,但是不能创建对象,抽象类的构造方法是给成员变量初始化的
- 抽象类可以有普通成员变量,也可以有静态成员变量
- 抽象类里面有抽象方法,普通类里面不能有抽象方法
- 普通类继承了抽象类,必须重写抽象类中的抽象方法
- 抽象类也可以有普通的方法
注意:抽象类天生就是当爹的
方法重写:
方法重写:子父类关系中,子类和父类的方法名、参数列表、返回值必须一致
1.在继承或者实现关系
2.方法名参数列表返回值必须一致
3.子类的访问权限必须大于等于父类的访问权限(一般为public)
4.子类抛出的异常必须小于等于父类抛出的异常
方法的重载:
1.同一个类中
2.方法名相同
3.参数列表不同(参数的个数不一样,参数的类型不一样)
4.与修饰符和返回值无关
什么是面向过程和面向对象
面向过程:C语言,以方法为中心,主要是方法之间的调用。
面向对象:更符合人类思维,以对象为中心,主要是对象之间的调用。
成员变量和局部变量的区别:
1、成员变量定义在类中,整个类中都可以访问
2 、局部变量定义在方法中,只能在方法中使用
3 、成员变量可以不给初始值,因为有默认值,局部变量必须有初始值否则报错(除了参数)
4、如果成员变量和局部变量名字一样:成员变量前面可以加 this,this 代表当前对象
5、我们在方法里面使用变量的时候,如果方法里面有,就用自己的,如果没有就用成员变量的,如果成员变量没有,就报错。
接口
接口:interface 主要是用来定义规范
1、接口中的方法都是抽象方法,经常省略public abstract
2、和类一样,也是一种引用数据类型
3、接口中的成员变量都是常量。public static final 可以省略不写(这个以后在开发中用得不多)
4、接口是用来被实现的,而且一个类可以实现多个接口。implements(雷和接口的关系)
接口和类的关系
1、接口不能有构造方法,所以也不能实例化对象
2、接口里面不能有普通方法,只能有抽象方法
3、接口是不能被类继承的(但是能被接口继承),但是可以被类实现。
注意:java是单继承吗?
java中类和类之间是单继承的,但是接口和接口之间是多继承的。
接口和抽象类的区别:
抽象类可以有构造方法,普通成员变量,静态成员变量,静态普通法,抽象方法。
接口的继承:
一个接口能继承另一个接口,和类之间的继承方式比较相似。接口的继承使用extends关键字,子接口继承父接口的方法。
多态
多态:同一个对象,在不同时刻表现出来的不同形态
多态存在的三个必要条件:
1、要有继承或者实现关系
2、要有方法重写
3、要有父类引用指向子类对象 ,引用就是变量,子类对象就是值(向上转型)
多态注意事项:
1、子类重写了父类的方法以后,执行的是自己的方法
2、子类没有,父类有的方法,子类可以通过继承直接使用
3、子类没有,父类没有,调用的时候直接报错。(向下转型)
解释:子类其实就是父类范围里的一种
人—> 父类
学生—>子类
学生就是人 人类 人= new 学生();
不能说人就是学生
向上转型:子类往上走一步,变成父类类型
向下转型:父类往下走一步,变成子类类型。
1、强制类型转换,可能会出现类型转换异常
2、向下转型之前,必须先向上转型
3、为了避免类型转换异常,可以使用 instanceof 关键字进行判断
instanceof 对象 instanceof 类型判断是否是这个类型
多态的使用场景:
方法的形参是父类类型,实参可以是子类类型
形参和实参:
形参:方法声明时,方法小括号里的参数
实参:方法声明时,方法小括号里的参数
好处:提高了代码的扩展性
异常
异常:代码在运行时出现的错误
异常的问题:程序会终止运行。(如果代码出现了异常,那么后面的代码就不会再执行了)
异常的分类:
1、 编译时异常:代码还没运行,就出现了问题
SQLException:操作数据库时查询表可能发生的异常
IOException:操作文件时发生的异常
FileNotFoundException:操作不存在文件时发生的异常
ClassNotFoundException:加载类而类不存在时发生的异常
EOFException:操作文件到文件末尾发生异常
IllegalArguementException:参数异常
2、 运行时异常:代码在正常的运行过程中出现的问题
NullPointerException:空指针异常,当应用程序试图在需要对象的地方出现null时抛出该异常
ArithmeticException: 数学运算异常,当出现异常的运算条件时抛出此异常
ArrayIndexOutOfBoundsException: 数组下标越界异常,用非法索引访问数组时抛出的异常
ClassCastException :类型转换异常,当试图将对象强制转换为不是实例的子类时抛出该异常
NumberFormatException:数字格式不正确异常,当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时抛出该异常
try…catch…finally
try :捕获异常
catch :处理异常
finally :不管有没有异常都会执行, 一般用来释放资源
如果try中有多个异常,那么catch也要有多个,每个catch只能捕获一个异常,
catch里的异常,从上到下,从小到大,从子到父
throws/throw :关键字
throw: 生成一个异常
throws: 抛出一个异常,谁调用我,我就抛给谁,异常最终抛给了JVM