-
Static关键字使用
a) 可以修饰属性、方法、代码块、内部类
b) 修饰属性:静态变量(类变量)class variable, 相对的是非静态变量(实例变量)instance variable
i. 实例变量:每个对象都独立拥有一套类中的非静态变量
ii. 静态变量:多个对象共享一个静态变量
iii. 静态变量随着类的加载而加载,直接通过“Class.ClassVariable”调用
iv. 加载早于对象创建,而且只加载一次
v. 存在于方法区的静态域(Static field)中
vi. 例子:System.out Math.PI
c) 修饰方法:
i. 随着类的加载而加载,可以直接调用
ii. 静态方法只能调用静态的方法和属性(生命周期判断),非静态方法都能调用静态和非静态。
d) Static引出的设计模式
i. 单例模式Singleton -
对某个类只存在一个对象实例
-
三要素
a) 构造器的访问权限设为private
b) 调用该类的某个静态方法
c) 类对象的变量也是静态的 -
两种实现
a) 饿汉式:创建当前类的对象
b) 懒汉式:先声明但不创建当前类的对象 -
Main()方法的使用说明
i. 程序的入口
ii. 也是个静态方法,不能直接调用其他非静态方法,需通过创建对象的方式调用。
iii. 与控制台交互 -
代码块(初始化块)
a) 用于初始化类,对象
b) 代码块如果有修饰的话,只能使用static
c) 分类:
i. 静态代码块:随着类的加载而实行,只执行一次
ii. 非静态代码块:随着对象的创建而执行,每创建一次对象执行一次
d) 作用:
i. 可以在创建对象时,对对象的属性进行初始化 -
Final关键字
a) 可以修饰类、方法、变量
i. 类:不能被继承
ii. 方法:不可以再被重写
iii. 变量:此时的变量变为常量,可以考虑的赋值位置有:显示初始化,代码块和构造器初始化
iv. 局部变量:方法的形参,或者方法体内的变量
v. Static final 修饰属性:全局常量 -
抽象类—>只能修饰类和方法
a) 有时候将一个父类设计的非常抽象,保证父类和子类能共享特征,父类不再有具体实例—>抽象类
b) 用abstract修饰类时,次类不能被实例化,抽象类中一定有构造器
c) Abstract修饰方法:抽象方法,该方法没有方法体
d) 包含抽象方法的类 一定是抽象类
e) 当子类重写了父类的所有方法以后,子类才可以实例化。(包括间接父类)
f) 不能修饰私有方法,静态方法,final方法(私有方法没法被重写) -
创建抽象类的匿名子类对象
a) 假设Person是抽象类
Person p = new Person(){
@Override
Public void overwriteAbstractMethod(){}
}//这个创建了一个匿名子类对象:P,没有特定的子类名字,但是创建了一个对象 -
抽象类的应用:设计模式模板方法(TemplateMethod)
-
接口(interface)
a) 一个类可以实现多个接口,解决了单继承的局限性
b) 接口和类是两个并列的结构
c) 使用
i. JDK7:只能定义全局常量和抽象方法 -
Public static final 和 public abstract
ii. JDK8:还可以定义静态方法、默认方法 -
默认方法default和静态方法static
-
实现类可以直接调用默认方法,也可以重写默认方法
-
若实现类的父类,和实现的接口有同名同参默认方法,则实现类(子类)使用的是父类中的同名同参数的方法。(类优先)
-
在实现类中调用接口的默认方法:
a) 实现类类名.super.默认方法名() -
默认和静态方法,使得接口越来越像类了,可以直接或间接调用接口中已经定义好的方法,自己的类不需要再进行方法的重写
d) 接口中不能使用构造器 不能进行实例化
e) 通过类来实现接口(implements)
i. 如果实现类,没有覆盖接口的所有抽象方法,则仍然是抽象类
ii. 若实现所有接口的抽象方法,则实现类可以被实例化 -
接口应用
a) 设计模式:代理模式(Proxy)
b) 工厂模式:实现了创建者和调用者的分离,即将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。 -
内部类inner class
a) java中,允许一个类的定义在另外一个类的内部,前者成为内部类,后者成为外部类。(没必要在外边定义,只在这个外部类中使用,所以可以用内部类简化)
b) 成员内部类 vs 局部内部类(相对于局部变量和成员变量理解放的位置)
i. 局部内部类:方法内,代码块内,构造器内 -
用处,例如:要求方法返回一个实现了Comparable接口的类的对象:在方法中使用局部内部类来实现接口,然后方法返回该内部类的实例。
-
使用外部属性时,只能读取不能修改,外部属性有隐式的final定义。
ii. 成员内部类:(静态,非静态) -
可以定义属性,方法构造器等
-
可以被final修饰,则不被继承
-
可以被abstract修饰
-
可以被权限修饰符修饰
-
调用外部类的非静态属性方法:外部类类名.this.外部类属性(方法)
-
实例化
a) 静态成员内部类:外部类类名.成员内部类 ins=new 外部类类名.成员内部类();
b) 非静态成员内部类:先创建外部类实例p —>再Person.Bird bird = p.new bird(); -
异常概述
a) 将程序执行中发生的不正常的情况成为异常(开发过程的语法和逻辑错误不是异常)
b) Error:JVM 无法解决的严重问题 例如:StackOverflow OOM
c) Exception:编程错误或外在因素导致,可以用针对性代码处理。 例如:空指针 读取不存在的文件
d) 分类:
i. 编译时异常:最理想在编译时捕获错误,受检异常(checked)
ii. 运行时异常Runtime Exception:非受检异常(unchecked)
e) 常见异常的举例 -
NullPointerException空指针异常
a) 调用null的地址 -
ArrayIndexOutOfBound
a) 数组角标越界 -
ClassCastException类型转换异常
a) Object obj = new Date();//多态 String str = (String) obj;//父类强转子类 -
NumberFormatException
-
InputMismatchException
a) 输入不匹配 -
ArithmeticException 算数的异常
-
异常处理:try—catch—finally用于处理编译时异常,运行时仍可能报错
a) “抛”:一旦出现异常,就会在异常代码处生成一个对应异常类的对象,并将对象抛出。抛出后,其后的代码不再执行
b) 两种常见处理输出方式
i. e.getMessage();
ii. e.printStackTrace();
c) 在try结构中声明的变量,在外部无法再使用
d) Finally:声明的是一定会被执行的代码。即使catch中又出现异常了,try中有return语句,也会执行
i. 用法:对于物理连接,例如数据库连接,输入输出流连接 socket连接 这些垃圾回收机制无法处理的,需要手动关闭的,防止出现异常而没有关闭 -
将关闭的语句放到finally语句块中。
-
Throw方式
a) 将异常抛给方法的使用者,并没有真正的将异常处理掉。 -
方法重写与异常有关的规则
a) 子类重写方法抛出的异常,不大于父类被重写方法抛出的异常类型。 -
手动抛出异常对象
a) Throw new runtimeException(“message”);//创建了一个运行时异常对象
b) 若抛出编译时异常,则需要try/catch -
用户自定义异常类
a) 继承extends现有的异常结构:runTimeExeception,Exception
b) 提供全局常量:serialVersionUID 提供重载的构造器
Java基础点:面向对象下
最新推荐文章于 2024-07-13 13:55:40 发布