对象的初始化
- 非静态对象的初始化:
- 在创建对象时,对象所在类的所有成员会首先进行初始化
- 基本类型:int型,会初始化为 0
- 如果为对象,这些对象会按顺序初始化
- 在所有类成员初始化完成后,才调用本类的构造方法创建对象
- 构造方法的作用就是初始化
- 静态对象初始化:
- 程序中主类的静态变量会在 main 方法执行前初始化
- 不仅第一次创建对象时,类中所有的静态变量都初始化,并且第一次访问某类(注意此时未创建此类对象)的静态对象时,所有的静态变量也要按他们在类中的顺序初始化
继承时,对象的初始化过程
- 主类的超类由高到低按顺序初始化静态成员,无论静态成员是否为private。
- 主类静态成员的初始化。
- 主类的超类由高到低进行默认构造方法的调用。
- 注意:在调用每一个超类的默认构造方法前,先进行对此超类进行非静态对象的初始化。
- 主类非静态成员的初始化。
- 调用主类的构造方法。
关于构造方法
- 类可以没有构造方法,但如果有多个构造方法,就应该要有默认的构造方法,否则在继承此类时,需要在子类中显式调用父类的某一个非默认的构造方法了。
- 在一个构造方法中,只能调用一次其他的构造方法,并且调用构造方法的语句必须是第一条语句。
有关public、private和protected
- 无public修饰的类,可以被其他类访问的条件是:
- 两个类在同一文件中
- 两个类在同一文件夹中
- 两个类在同一软件包中
- protected:继承类和同一软件包的类可访问。
- 如果构造方法为private,那么在其他类中不能创建该类的对象。
抽象类
抽象类不能创建对象。
如果一个类中一个方法为抽象方法,则这个类必须为abstract抽象类。
继承抽象类的类在类中必须实现抽象类中的抽象方法。
抽象类中可以有抽象方法,也可有非抽象方法。抽象方法不能为private。
间接继承抽象类的类可以不给出抽象方法的定义。
多态
- 多态的前提:在Java语言中,接口的多种不同的实现方式即为多态
- 必须有继承关系
- 子类继承父类,存在一些特点
- 必须有方法重写
- 子类继承父类,方法重写的目的,举例:动物吃的方法,每一个具体动物吃的东西不一样,所有必须要方法覆盖
- 必须有父类的引用指向子类对象 (向上转型)
- 父类名 fu = new 子类名() ; (父类的引用指向子类对象)
- 多态的好处:
- 可以提供代码的复用性:继承保证
- 可以提高的代码的扩展性:由多态保证
- 多态的弊端:通过父类的引用调用子类特有功能,不能调用
- 解决:将父类的引用强制转换子类的引用 (访问子类的特有功能)
- 举例:Father3 f = new Son3() ; //向上转型
- Son3 s = (Son3) f ; //前提是必须有父类的引用
接口interface (用implements来实现接口)
- 体现的是事务的扩展性功能(额外动作,后天经过学习等等)
- 接口中的所有数据均为static和final即静态常量。尽管可以不用这两个关键字修饰,但必须给常量赋初值。
- 接口中的方法均为public,在实现接口类中,实现方法必须可public关键字。
- 如果使用public来修饰接口,则接口必须与文件名相同。
- 接口成员的特点:
- 成员变量:是一个常量,不能更改,并且默认的修饰符:public static final
- 构造方法:接口不存在构造方法
- 成员方法:都是抽象方法,默认的修饰符:public abstract
多重继承
- 一个类继承了一个类和接口,那么必须将类写在前面,接口写在后面,接口之间用逗号分隔。
- 接口之间可多重继承,注意使用关键字extends。
- 一个类虽只实现了一个接口,但不仅要实现这个接口的所有方法,还要实现这个接口继承的接口的方法,接口中的所有方法均须在类中实现。
接口的嵌入
- 接口嵌入类中,可以使用private修饰。此时,接口只能在所在的类中实现,其他类不能访问。
- 嵌入接口中的接口一定要为public。
类的嵌入
- 类可以嵌入另一个类中,但不能嵌入接口中。
- 在静态方法或其他方法中,不能直接创建内部类对象,需通过手段来取得。
- 一个类继承了另一个类的内部类,因为超类是内部类,而内部类的构造方法不能自动被调用,这样就需要在子类的构造方法中明确的调用超类的构造方法。
异常类
JAVA中除了RunTimeException 类,其他异常均须捕获或抛出。
类加载的初始化顺序
- 父类--静态变量
- 父类--静态初始化块
- 子类--静态变量
- 子类--静态初始化块
- 父类--变量
- 父类--初始化块
- 父类--构造器
- 子类--变量
- 子类--初始化块
- 子类--构造器
Final关键字
- final关键字是一个修饰符,可以修饰类、方法和变量。
- 被final修饰的类是一个最终类,不可以被继承。
- final修饰的方法不能被重写而不是重载。
- final修饰属性,此属性就是一个常量,不能被再次赋值。
- 常量在使用前必须赋值,但除了在声明的同时初始化外,就只能在构造方法中初始化。
- final修饰的方法不能被重置(在子类中不能出现同名方法)。
- 如果声明一个类为final,则所有的方法均为final,无论其是否被final修饰,但数据成员可为final也可不是。
Static关键字
- 关于static关键字:静态修饰符
- 静态随着类的加载而加载
- static优先于对象存在
- 回想:public static void main(..){...}
- static共享数据:可以被多个对象进行共享
- 举例:饮水机(staticd的共享的)
- 举例:水杯(不能共享的...)
- 如果数据被静态修饰的,它可以被类名直接调用
- 被静态修饰的方法: 类名.方法名()
- 被静态修饰的变量: 类名.变量名;
构造代码块,构造方法,静态代码的优先级?
答案:静态代码块 > 构造代码块 > 构造方法
静态代码:只能执行一次
构造代码块:在每次执行构造方法之前都会被执行
Overload和Override的区别?
overload:方法重载(方法名一样,参数不同,和返回值没有关系)
参数不同:
参数个数不同
参数类型不同
override:方法重写 (子类定义一个和父类一摸一样的方法声明)
String
- String最大的特点:字符串一旦被赋值,其值不能改变;
- 原因:直接把一个常量赋值给String类型,这种形式,它是在方法去中的字符串常量池中看有没有当前字符串,有直接返回它的地址,没有就在常量池中开辟空间;
- StringBuffer和String的区别?
- 前者是一个可变的字符序列,后者是不可变的字符序列
- 如果从内存角度考虑,String定义的时候,会在常量池中开辟空间,比较耗费内存
- 而StringBuffer,字符串缓冲区(里面存储的全部都是字符串),它会释放掉
- StringBuffer,String,StringBuilder的区别?
- StringBuffer和StringBuilder都是一个可变的字符序列,提供一个缓冲区,(两者都看做容器)
- StringBuffer:线程安全的,同步的,但是执行效率低
- StringBuilder:线程不安全的,不同步的,但是执行效率高,并且单线程中优先采用StringBuilder
- StringBuffer:执行效率虽然低,但是由于String类型,并且他可变的字符序列,提供了缓冲区
- StringBuffer和数组的区别?
- 数组:它是可以存储多个数据的容器,并且多个数据的类型必须一致
- 数组长度功能:length属性
- StringBuffer:它是容器,它在缓冲区始终存储的只能字符串类型的数据
- 获取缓冲区的长度:length()
Calendar
- Calendar 类是一个抽象类(不能实例化),它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如:获得下星期的日期)提供了一些方法