面向对象三大特征
- 封装:把相关的数据封装成一个类组件
- 继承:子类自动共享父类方法
- 多态:增强软件的灵活性和重用性
类与对象
- 类:一类事务的抽象
- 对象 :对象的状态描述对象的基本特征,对象的功能描述对象可以完成的操作,对象的标识是指每个对象在内存中都有一个唯一的地址值用于与其他对象进行区分
栈和堆
队列:先进先出(FIFO)
栈:先进后出(FILO)
堆:每个堆内存的元素都有地址值
一般来讲局部变量存在栈中,方法执行完毕内存就被释放,对象(new出来的东西)存在堆中,对象不再被使用时,内存才会被释放
构造方法
与类同名且没有返回值类型的方法,主要功能就是完成对象创建或者初始化
this 全局变量与局部变量同名时,可以使用this指定本类的全局变量 , 如果不使用this指定,打印的就是近处的这个局部变量,就近原则.在构造函数中,调用构造构造函数的功能 ,this关键字必须在构造函数的第1行如this( );。
继承
继承是从已有的类中派生出新的类,新类能吸收已有类的数据属性和行为,并扩展新的能力.,新类的定义可以增加新的数据或者新的功能,也可以使用父类的功能,但不能选择性的继承父类(超类/基类)
这种继承使得复用以前的代码非常容易,能够大大的缩短开发的周期,降低开发费用. 构造方法不可以被继承
特点:
- 使用extends关键字来表示继承关系
- 子类把父类的功能复制了一份
- Java只支持单继承,一个父类可以有多个子类,但是一个子类只能有一个父类
- 继承可以传递
- 父类的私有成员由于私有限制访问,所以子类不能使用父类的私有资源
- 继承多用于功能的修改,子类可以在拥有父类功能的同时,进行功能拓展
当父类成员变量与子类成员变量同名时,子类中调用父类成员变量 可以使用super.变量名的方式调用父类的成员变量,super同this一样,必须再在构造方法中的第一行,子类在创建对象时,默认会先调用父类的构造方法,子类构造函数中第一行默认存在super()调用父类的无参构造,super:代表父类存储空间的标识,可以理解成父类对象的引用
注意:super的使用前提是继承,没有父子类关系,就没有super
注意:this调用构造方法或者super调用构造方法,都必须出现在构造方法的第一行
注意:如果父类没有无参构造,需要手动在子类构造方法的第一行调用其他的含参构造
拓展:如果子类重写了父类的方法以后,可以使用super.方法名(参数列表)来调用
方法重载Overload
同名不同参
方法重写Override
建立了继承关系以后,子类对父类的方法不满意, 修改源码的情况下,进行功能的修改与拓展
- 继承以后,子类就拥有了父类的功能
- 在子类中,可以添加子类特有的功能,也可以修改父类的原有功能
- 子类中方法的签名与父类完全一样时,会发生覆盖/复写的现象。注意: 父类的私有方法不能被重写
重写的要求:两同两小一大
- 两同:方法名 参数列表 要完全一致
- 两小:1、子类返回值类型小于等于父类的返回值类型(注意此处说的是继承关系,不是值大小)
2、子类抛出异常小于等于父类方法抛出异常
- 一大:子类方法的修饰符权限要大于等于父类被重写方法的修饰符权限
@Override 注解,用来标记重写方法
Static
- Static修饰的资源统称为静态资源,静态资源是随着类加载而加载到内存中的,比对象优先进入内存 *,所以静态资源可以不通过对象,直接通过类名调用
- 静态资源在内存中只有一份,而且会被全局所有对象共享
- 普通资源既可以调用普通资源,也可以调用静态资源
- 静态资源只能调用静态资源
- 静态代码块,static{},,位置在类里方法外,在类加载时就加载,并且只被加载一次,一般用于项目的初始化
- 静态资源不能与super,this共用
- 静态代码块:类里方法外,在类加载时就加载,并且只被加载一次,一般用于项目的初始化
- 构造代码块:类里方法外,在创建对象时会自动调用,每次创建对象都会被调用,提取构造方法的共性
- 局部代码块:方法里的代码块,限制局部变量的范围
静态代码块->构造代码块->构造方法->普通方法->局部代码块
final
- 被final修饰的类,不能被继承
- 被final修饰的方法,不能被重写
- 被final修饰的字段是个常量,值不能被修改
- 常量的定义形式:final 数据类型 常量名 = 值
多态
多态是面向对象程序设计(OOP)的一个重要特征,指同一个实体同时具有多种形式,即同一个对象,在不同时刻,代表的对象不一样,指的是对象的多种形态。
- 多态的前提:继承+方法的重写
- 父类引用指向子类对象,如:Animal a = new Cat();父类不能使用子类特有功能
- 多态中,编译看左边,运行看右边
多态可以让我们不用关心某个对象到底具体是什么类型,就可以使用该对象的某些方法,提高了程序的可扩展性和可维护性
异常
Unhandled exception: java.lang.Exception 未处理异常
* java.lang.Throwable
* |-----java.lang.Error:一般不编写针对性的代码进行处理。
* |-----java.lang.Exception:可以进行异常的处理
* |------编译时异常(checked)不会生成字节码文件
* |-----IOException
* |-----FileNotFoundException
* |-----ClassNotFoundException
* |------运行时异常(unchecked,RuntimeException)
* |-----NullPointerException//空指针异常
* |-----ArrayIndexOutOfBoundsException//数组角标越界
* |-----ClassCastException//类型转化异常
* |-----NumberFormatException//编码格式异常
* |-----InputMismatchException//输入不匹配
* |-----ArithmeticException//算术异常
捕获方式
对于不想现在处理或者处理不了的异常可以选择向上抛出
方式:在方法上设置异常的抛出管道,即:
在可能会会发生异常的方法上添加代码:
throws 异常类型, 如果有多个异常,用逗号分隔
例如:void method1 throws Exception1,Exception2,Exception3{ }
TIPS:方法上有默认的异常管道:RuntimeException
public class ExceptionsDemo2 {
public static void main(String[] args) {
f();
}
private static void f() {
try {
f2();
}catch (Exception e ){
System.out.println("输入的数值不正确");
}
}
private static void f2() throws Exception {
System.out.println("请输入需要计算的数值");
int a = new Scanner(System.in).nextInt();
int b = new Scanner(System.in).nextInt();
System.out.println(a/b);
}
}
抽象类 abstract
- abstract 可以修饰方法或者类
- 抽象类中可以没有抽象方法
- 如果一个类含有抽象方法,那么它一定是抽象类
- 子类继承了抽象类以后,要么还是一个抽象类,要么就把父类的所有抽象方法都重写
- 抽象类中的方法实现交给子类来完成
- 抽象类不可以被实例化
- 多用于多态中
接口
接口( Interface )在Java中也是一种抽象类型,接口中的内容是抽象形成的需要实现的功能,接口更像是一种规则和一套标准.
- 通过interface关键字来定义接口
- 通过implements让子类来实现接口
- 接口中的方法全部都是抽象方法(JAVA8)
- 可以把接口理解成一个特殊的抽象类(但接口不是类!!!)
- 类描述的是一类事物的属性和方法,接口则是包含实现类要实现的方法
- 接口突破了java单继承的局限性
- 接口和类之间可以多实现,接口与接口之间可以多继承
- 接口是对外暴露的规则,是一套开发规范
- 接口提高了程序的功能拓展,降低了耦合性
类与接口总结
1. 类与类的关系
继承关系,只支持单继承
比如,A是子类 B是父类,A具备B所有的功能(除了父类的私有资源和构造方法)
子类如果要修改原有功能,需要重写(方法签名与父类一致 + 权限修饰符>=父类修饰符)
2. 类和接口的关系
实现关系.可以单实现,也可以多实现
class A implements B,C{}
其中A是实现类,B和C是接口,A拥有BC接口的所有功能,只是需要进行方法的重写,否则A就是抽象类
3. 接口与接口的关系
是继承关系,可以单继承,也可以多继承
interface A extends B,C{}
其中ABC都是接口,A是子接口,具有BC接口的所有功能(抽象方法)
class X implements A{}
X实现类需要重写ABC接口的所有方法,否则就是抽象类
class A extends B implements C,D{}
其中A是实现类,也是B的子类,同时拥有CD接口的所有功能
这时A需要重写CD接口里的所有抽象方法
4.接口与抽象类的区别
接口是一种用interface定义的类型
抽象类是一种用class定义的类型
接口中的方法都是抽象方法,还有默认方法与静态方法
抽象类中的方法不做限制
接口中的都是静态常量
抽象类中可以写普通的成员变量
接口没有构造方法,不可实例化
抽象类有构造方法,但是也不可以实例化
接口是先天设计的结果,抽象是后天重构的结果
接口可以多继承
抽象类只能单继承
内部类
A类中又定义了B类,B类就是内部类,B类可以当做A类的一个成员看待:
1) 内部类可以直接访问外部类中的成员,包括私有成员