一.static修饰符
修饰成员变量
静态变量:1.能被类的所有实例所共享
2.java虚拟机在加载类的过程中为static变量分配内存,存在方法区
实例变量:1.对于每个类的实例都有一份,它们之间互不影响
2.实例变量在加载类后创建对象时分配内存,存于堆区
修饰成员方法
静态方法
1.不能使用this关键字,因为它并不唯一属于任何一个对象,而是共有的
2.super关键字用来访问当前实例从父类中继承的方法和属性,super关键字
和类的实例有关,所以不能使用super关键字
3.静态方法必须被实现
4.子类可以定义与父类的静态方法同名的静态方法,以便在子类中隐藏父类
的静态方法(重写只是根据运行时对象的类型来决定调用哪个方法,而静态
方法是在编译阶段与类进行了绑定,所以说重写对于静态方法是没有作用的,
只不过隐藏了父类的静态方法)
修饰代码块
静态代码块
1.用于初始化类,给静态变量赋初始值
2.如果类中包含多个静态代码块,那么JAVA虚拟机将按照它们在类中的顺序
依次执行它们
3.每个静态代码块只会执行一次
二.final修饰符
修饰类: 1.只能修饰非抽象类(abstract类必须被继承,final类不能被继承)
2.final修饰的类不能被继承,没有子类
修饰方法:1.只能修饰非抽象方法
2.用final修饰的方法不能被子类的方法重写
3.不能修饰构造方法,因为方法重写只出现在类的成员方法,父类的构造方法
和子类的构造方法之间不存在重写关系
修饰变量:1.final可以修饰静态变量、实例变量、局部变量
2.final变量都必须显示初始化,否则会导致编译错误
3.final变量只能赋一次值
特点: 阻止继承和多态
静态变量:定义变量时进行初始化或者在static代码块中赋值
实例变量:可以在定义变量时,或者在构造方法中进行初始化
final static修饰的变量:类加载的时候就已经产生,存储在常量池中,且是唯一的数据
static修饰的变量:类加载的时候就已产生,存储在方法区
final修饰的变量:通过new产生,存储在堆区
三.abstract修饰符
修饰类(抽象类)
1.抽象类可以没有抽象方法,但是包含了抽象方法的类必须被定义为抽象类
2.抽象类中可以有非抽象的构造方法
抽象类的构造方法:接受子类传来的参数,初始化参数,子类堆
内存的某块位置存放父类的初始化参数
3.抽象类不能被final修饰符修饰
4.抽象类不允许实例化
修饰成员方法(抽象方法)
1.没有抽象构造方法,也没有抽象静态方法
2.抽象方法不能被final修饰符修饰
3.抽象方法没有方法体
不能修饰属性
被abstract修饰的内容都是暂未被实现的,比如:类,方法
属性之所以不能被abstract修饰是因为属性不存在"尚未被实现"的状态
四.接口
1.接口是为了解决java中多继承的问题。
2.抽象类抽象到极致就是接口,接口是抽象类的另外一种形式。
3.定义: 使用interface关键字定义接口
4.成员变量:成员变量默认类型是 public static final类型 必须被显式初始化
成员方法: 不能有方法体.eg:public void show();
可以没有权限修饰符,默认是 public abstract
5.不能有任何形式的代码块
6.接口没有构造方法,不能被实例化–>不能 new 接口名();
7.接口的多继承:
①.一个类只能继承一个父类,但是可以实现多个接口,用逗号隔开。
eg:class Student implements A,B{}
一个类实现了某[多]个接口,就要重写接口中没有实现的方法,不然编译报错。
②.一个接口可以继承多个接口
eg:interface C extends A,B{}
五.抽象类和接口的区别
1.子类只能继承一个抽象类,但可以实现任意多个接口
2.接口中的方法都是抽象方法,抽象类中可以有非抽象方法
3.接口中的成员变量只能是静态常量,抽象类中的成员变量可以是各种类型
4.抽象类中可以有静态方法和静态代码块等,接口中不可以
5.接口中没有构造方法,不能被实例化,抽象类可以有非抽象的构造方法,
抽象类不能被实例化,因为有构造方法未实现
六.访问修饰符
private private修饰的变量
1.本类可以访问
2.通过反射访问
private限权的成员变量,继承的子类具有私有变量的拥有权,但是没有使用权
没有访问控制符
1.只能本类和同包的类访问
2.子类没有访问权,也就不能掉用default修饰的方法,所以不能重写
protected 只能本类、同包的类以及子类访问
public 所有类都能访问
一个java文件中,public类只能出现一个
七.包装器
包装器类型都重写了equals方法
-
boolean Boolean
byte Byte
short Short
char Character
int Integer
long Long
float Float
double Double
2.自动装箱和自动拆箱
在jdk1.5以后 基本数据类型和其包装器类型之间有自动装箱和拆箱过程。
注:是发生在编译阶段。
自动装箱: Integer i1 = 128; ----> Integer i1 = Integer.valueOf(128);
Integer i2 = 127; ----> Integer i2 = Integer.valueOf(127);
自动拆箱: int a1 = i1; ----> int a1 = i1.intValue();
int a2 = i2; ----> int a2 = i2.intValue();
Integer a = 128 , Integer b = 128;a == b ?—>flase
Integer a = 127 , Integer b = 127;a == b ?—>true/false
自动装箱的时候,如果这个数字在[-128~127]之间那么就是从缓存中获取数据。
如果这个数字不在范围内,那么就是利用new关键字创建Integer对象()。
intValue(): 以 int 类型返回该Integer的值。即返回的是栈中字面量的地址。
当int 和 Integer互相转换的时候会发生自动装箱和自动拆箱。parseInt: Integer.parseInt(“全数字字符串”); 把全数字的字符串转为int类型数据
int a = Integer.parseInt(“123”);—> int : 123;
Integer.MAX_VALUE : 它表示 int 类型能够表示的最大值。
Integer.MIN_VALUE : 它表示 int 类型能够表示的最小值。
Integer.SIZE : 用来以二进制补码形式表示 int 值的比特位数。
八.== 和 equals()区别
1.== 定义:比较内存地址是否相同。
2.equals()定义:Object类中的方法,Object中的equals()是比较内存地址是否相同。
注意:equals(Obj)是一个方法,所以只能是对象调用。equals是一个方法,所以可能被重写。
3.String类重写了equals()方法,所以在String对象调用equals时是比较值。
补充:
toString():当system输出对象的时候,其实是输出对象.toString();可以重写。
getClass():返回当前的真实对象,不可以重写。