Java学习笔记
2019-04-02 本文已影响0人
YLiuY
一. 面向对象
1. 初始化块
- 初始化块是构造器得补充,总是在构造器执行前执行。
- 初始化块是固定执行得一段代码,无需接受任何参数。
- 静态初始化块属于静态成员,静态成员不能访问非静态成员得原则,所以静态初始化块不能访问实例变量和方法。
- 静态初始代码块和静态变量语句得执行顺序和代码顺序有关。
2. Object类
所有的Java对象都是Object的实例,可以调用该类中定义的方法。
- 打印对象
toString
方法,默认返回“类名+@+hashcode”。 -
==
:比较两个变量是否相等,是否为同一对象 -
equals
:默认和==
一样,但可以重写该方法,使其值相等。 - 常量池:用来保存在编译时期就已经确定的值,并保存在class文件中。
3. 类成员
使用static
修饰的成员就是类成员,类成员属于整个类,不属于单个实例。static
不能修饰构造器。静态成员不能访问、使用实例变量和方法。可以通过实例访问静态成员。
一个重要的用途:单例类。
class SingleTon {
//缓存创建的类
public static SingleTon instance;
//构建器设为private,只能自己调用
private SingleTon() {
}
//在实例化该类之前,不存在对象,所以只能使用staic类方法
public static SingleTon getInstance() {
if (instance==null) {
instance = new SingleTon(); //调用构建器
}
return instance;
}
}
4. final修饰符
final
修饰变量时表示该变量一旦获得初始值就不可被改变。可以用来定义“宏变量”
-
final
修饰的方法不可以有子类 - 创建不可变类:实例变量不可改变。8个包装类和string类都是不可变类。
5. 抽象方法和抽象类
被abstract
修饰符修饰的方法和类称为抽象方法和类。抽象方法一定在抽象类中,抽样类中可以没有抽象方法。
- 抽象类不能被实例化,即不能使用new类调用构造器。但拥有构造器,可以被子类调用。
- 抽象方法不能有方法体(即没有大括号{}和大括号中的部分)。例:
abstract void test()
-
abstract
修饰的方法必须由子类重写,因此abstract
和final、private
不能同时使用。 - 模板模式:编写一个父类,父类为子类提供多个通用方法,并把一个或多个方法留给子类实现。
6. 接口
接口可以有多个直接父接口,但只能继承接口,不能继承类。
[修饰符] interface 接口名 extends 父接口1,父接口2...
{
零到多个常量定义...
零到多个抽象方法定义...
零到多个内部类、接口、枚举定义...
零到多个默认方法或类方法...
}
- 接口的访问权限都是
public
; - 变量只能是静态常量(不能更改值),方法只能是抽象方法、类方法、默认方法(
default
修饰) - 默认方法不能有
static
修饰,由于没有static
修饰,所以不能使用接口直接调用该方法,需要接口的实现类的实例调用。 - 类方法可以由接口直接调用
- 接口支持多继承,子接口会获得父接口中定义的所有抽象方法和常量
- 类可以实现多个接口,但只能继承一个类。实现接口使用
implements
。若这个类没有重写接口中的所有抽象方法,那么这个类只能是抽象类。 - 实现接口时必须使用
public
关键词,因为接口是public
修饰的,重写它必须使用访问权限大于等于它的关键词。
接口和抽象类的区别:
- 接口体现了一种规范,规定了实现者必须提供某些服务。类似于一个系统的“总纲”,制定了系统个模块的标准,因此接口不应该经常改变。
- 抽象类体现了一种模板设计,被当成系统实现过程中的中间品,已经实现了某些功能,但不是最终产品。
- 接口只能有类方法和默认方法,不能有普通方法提供方法实现。抽象类可以有普通方法
- 接口没有静态方法,抽象类有
- 接口只能定义静态常量,抽象类可以定义各种成员变量
- 接口不包含构造器;抽象类包含构造器,是让子类调用这些构造器完成对抽象类的初始化操作。
接口的使用场景:1.简单工厂模式 2.命令模式
7. 内部类
定义在其他类内部的类称为内部类。匿名内部类适合用于创建那些仅需要使用一次的类。
- 非静态内部类不能拥有静态成员。静态内部类可以有静态成员和非静态成员。
- 局部内部类(定义在方法中)和匿名内部类不是类成员
- 外部类不能直接访问内部类的成员,需要显示调用内部类对象或内部类访问
- 静态内部类只能访问外部类的静态成员。
- 接口内可以定义内部类,接口内部类只能是静态内部类。
内部类的使用 - 外部类使用非静态内部类
OuterInstance.new InnerConstructor
。 - 外部类使用静态内部类
new outerClass.innerCoustrucor
匿名内部类
匿名内部类适合创建只使用一次的类,创建时会立即创建该类的实例。不能重复使用
new 实现接口 ()| 父类构造器() //只能实现或继承一个接口或父类
{
//匿名内部类的方法体
}
- 匿名内部类不能是抽象类,因为在创建时,他会立即实例该类
- 匿名内部类不能定义构造器,因为没有类名,无法定义。
- 匿名内部类会继承父类的构造器
- 局部变量被匿名内部类访问,该变量自动被
final
修饰。
8. Lambda表达式
Lambda表达式支持将代码块作为方法的参数。
- Lambda表达式的类型是函数式接口类型。函数使接口只能有一个抽象方法。