0、前言
本文针对一些java基础知识的一些考点做出解析。
1、静态成员 与 非静态成员
静态变量与静态方法都是静态成员。
先说静态变量与普通成员变量的区别,例如如下两个变量:
public class Demo {public static String A = "静态变量";public String B = "实例变量,又称成员变量";
}
A是静态,B是成员,从jvm层面来讲,他们有以下区别:
理解原理:
- 静态变量是在类加载时创建的:随着类的消失而消失,静态变量与类共存亡。
成员变量是在对象创建后而存在的,:随着对象被回收而释放,成员变量与对象共存亡。 - 由第一点可推导:
静态变量可以被对象调用,也可以通过类名直接访问(因为无需创建对象static变量就存在)
成员变量因为是在类的实例化过程中创建的,所以需要通过类的实例(也就是对象)调用,没有实例化就没法调用。
- 静态方法内不能直接调用非静态方法,因为没有创建实例对象(如果调用,将不知道非静态方法属于哪个对象,所以会报错。)
public class Demo {public static void staticMethod() {// 直接调用非静态方法:编译报错instanceMethod();}public void instanceMethod() {System.out.println("非静态方法");} }
相对的,成员方法(非静态方法)能够直接调用静态方法。
总结:静态方法只能访问静态成员(包括静态变量和静态方法)
实例方法则可以访问实例成员(包括实例变量和实例方法)以及静态成员。
2. 父类子类方法的继承重写问题
看一个简单的例子,我们知道,子类重写父类方法必须”三个同“的特点:
返回类型、名称、输入参数都相同。
class A{public void sb(){System.out.println("A.sb");}
}
class B extends A{
//1.普通的重写
// public void sb(){
// System.out.println("B.sb");
// }//2.名称、输入参数一样,但返回类型不同:重写失败。编译错误
//因为虽然返回类型不同,但系统调用sb的时候无法区分是父子哪个sb方法,并且这也不是方法重载。
//但要注意,如果返回类型是父类的派生类,也是可以的。public int sb(){System.out.println("BBB");return 10;}//3.只要输入参数不同,就已经不是同一个sb方法,尽管名称都叫sb:
// 不是重写,但能编译,相当于新方法(即,方法重载)
// 例如,我们可以通调用sb(10)和sb()这两种方式对应两个sb方法,这是可以区分的public void sb(int input){System.out.println(input);}
//同理:public int sb(int input){System.out.println(input);return 1;}
}
其他补充:
只有返回类型不同的方法并不足以使方法成为重载,重载要求参数列表必须有所区别。
3、接口与抽象类
接口的性质:
接口内的字段(常量)类型都必须是public static final的。Java8开始,可以省略,直接定义常量。如int a = 1;
区别:
定义方式:抽象类使用
abstract
关键字定义,可以包含抽象方法和具体方法;接口使用interface
关键字定义,只能包含抽象方法和常量。实现方式:一个类可以继承(
extends
)一个抽象类,并且可以同时实现多个接口(implements
)。构造方法:抽象类可以有构造方法,而接口不能有构造方法。抽象类的构造方法在被子类实例化时会被调用。
方法实现:抽象类中的抽象方法可以由子类选择性地实现或覆盖,而接口中的所有方法都必须在实现类中被实现。
属性和变量:抽象类可以有实例变量、静态变量和普通方法,而接口只能有常量(
public static final
)和抽象方法。设计目的:抽象类用于创建具有共同特征的类之间的继承关系,它可以提供默认的实现和通用的行为;接口用于定义类应该具备的行为,以实现多态性和代码重用。
多继承:一个类只能继承一个抽象类,但可以实现多个接口。这是因为Java不支持多重继承,但可以通过实现多个接口来达到类似的效果。
4. 数据类型大小
红字代表字节数,1字节==8位
5.final与static
对于final类型的变量,如果不加static,可以有两种方式给它赋值:
(1)声明变量时直接赋值(2)在构造方法中完成赋值(全部的构造方法都得赋值)
而如果是static类型的final变量,那么类初始化的时候就必须赋值了 ,所以只有"方法(1)"