前言
这篇主要是针对java基础知识点的梳理,会根据我自己掌握不太牢固的知识点进行整理,可能不太适合初学者。并且还会有一些自己的理解。持续更新哦
关键字
- final变量是只读的,final成员变量必须在声明的时候初始化或者在构造器中初始化
- final也可以声明方法。方法前面加上final关键字,代表这个方法不可以被子类的方法重写。如果你认为一个方法的功能已经足够完整了,子类中不需要改变的话,你可以声明此方法为final。final方法比非final方法要快,因为在编译的时候已经静态绑定了,不需要在运行时再动态绑定。
- 使用final来修饰的类叫作final类。final类通常功能是完整的,它们不能被继承。Java中有许多类是final的,譬如String, Interger以及其他包装类。
- final关键字提高了性能。JVM和Java应用都会缓存final变量。提高了性能。JVM和Java应用都会缓存final变量。
final变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销。JVM会对方法、变量及类进行优化。 - 在匿名类中所有变量都必须是final变量。
- final关键字不同于finally关键字,后者用于异常处理。
- final和abstract这两个关键字是反相关的,final类就不可能是abstract的。
- 按照Java代码惯例,final变量就是常量,而且通常常量名要大写:
类与对象
如果一个变量是基本类型,比如 int hp = 50;我们就直接管hp叫变量,=表示赋值的意思。如果一个变量是类类型,比如 Hero h = new Hero();我们就管h叫做引用。=不再是赋值的意思,=表示指向的意思。比如 Hero h = new Hero();这句话的意思是引用h,指向一个Hero对象。所以在函数参数的时候实际上是多了一个引用。
其中java有8种基本类型:
boolean,int,float,double,char,long,byte,short
如果提供了一个有参的构造方法,同时又没有显式的提供一个无参的构造方法,那么默认的无参的构造方法,就“木有了”。
可变数量的参数只需要设计一个方法
public void attack(Hero ...heros)
可以用this来调用其他构造方法
public Hero(String name){
this.name = name;
}
public Hero(String name,float hp){
this(name);
this.hp = hp;
}
修饰符 | 自身 | 同包子类 | 不同包子类 | 同包类 | 其他 |
---|---|---|---|---|---|
private | O | X | X | X | X |
package/friendly/default | O | O | X | O | X |
protect | O | O | O | O | X |
public | O | O | O | O | O |
其中子类的都是属于继承,非子类都是访问。
static可以使用在属性上,也可以是方法上。使用了static 的叫类属性或静态属性,类方法或静态方法。
可以通过类直接访问,例如 Hero.val, Hero.function()
- 声明该属性的时候初始化
- 构造方法中初始化
- 初始化块
这三种方式执行顺序,构造方法->初始化块->声明时。其中类属性初始化有2种。
抽象方法是一种特殊的方法:它只有声明,而没有具体的实现。抽象方法的声明格式为:
abstract void fun();
- 抽象方法必须用abstract关键字进行修饰。如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用abstract关键字修饰。因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象。也就是说抽象类不一定必须含有抽象方法。但如果一个抽象类不包含任何抽象方法,为何还要设计为抽象类?
- 抽象类就是为了继承而存在的,如果你定义了一个抽象类,却不去继承它,那么等于白白创建了这个抽象类,
- 抽象方法必须为public或者protected,缺省情况下默认为public。
- 如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。
接口泛指供别人调用的方法或者函数。它是对行为的抽象。在Java中,定一个接口的形式如下:
[public] interface InterfaceName {
}
- 接口中可以含有变量和方法。接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误)
- 方法会被隐式地指定为public abstract方法且只能是public abstract方法,并且接口中所有的方法不能有具体的实现。
- 接口是一种极度抽象的类型,它比抽象类更加“抽象”,并且一般情况下不在接口中定义变量。
- 要让一个类实现某组特地的接口需要使用
implements
关键字,可以看出允许一个类implements
多个特定的接口。如果一个非抽象类implements
了某个接口,就必须实现该接口中的所有方法。对于一个抽象类implements
某个接口的,可以不实现该接口中的抽象方法。 - Java中的接口Interface不是继承自Object——如果一个接口定义是最顶级的(没有 super interfaces),那么这个接口会自动声明一个 abstract member method 结构体来代表所有来自 Object 类(一切类的superclass)中的public方法(包括这些方法的签名、返回类型以及抛出的异常,意思是接口隐含定义了一套与Object类中的方法签名完全相同的方法
class ClassName implements Interface1,Interface2,[....]{
}
- 抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
- 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
- 接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
- 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
- 抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。举个简单的例子,飞机和鸟是不同类的事物,但是它们都有一个共性,就是都会飞。那么在设计的时候,可以将飞机设计为一个类Airplane,将鸟设计为一个类Bird,但是不能将 飞行这个特性也设计为类,此时可以将 飞行设计为一个接口Fly,包含方法fly( ),然后Airplane和Bird分别根据自己的需要实现Fly这个接口。然后至于有不同种类的飞机,比如战斗机、民用飞机等直接继承Airplane即可,对于鸟也是类似的,不同种类的鸟直接继承Bird类即可。从这里可以看出,继承是一个 "是不是"的关系,而 接口 实现则是 "有没有"的关系。
单例模式又叫做 Singleton模式,指的是一个类,在一个JVM里,只有一个实例存在。
//饿汉式单例模式
public class A{
//私有化构造方法使得该类无法在外部通过new 进行实例化
private A(){}
//准备一个类属性,指向一个实例化对象。 因为是类属性,所以只有一个
private static A instance=new A();
public static A getInstance(){
return instance;
}
}
//懒汉式单例模式
public class A{
//私有化构造方法使得该类无法在外部通过new 进行实例化
private A(){}
private static A instance;
public static A getInstance(){
if(instance==null)
instance=new A();
return instance;
}
}
饿汉式是立即加载的方式,无论是否会用到这个对象,都会加载。
如果在构造方法里写了性能消耗较大,占时较久的代码,比如建立与数据库的连接,那么就会在启动的时候感觉稍微有些卡顿。
懒汉式,是延迟加载的方式,只有使用的时候才会加载。 并且有线程安全的考量(鉴于同学们学习的进度,暂时不对线程的章节做展开)。
什么是单例模式?
回答的时候,要答到三元素
- 构造方法私有化
- 静态属性指向实例
- public static的 getInstance方法,返回第二步的静态属性