1,abstract:可以修饰类和方法。修饰后就变成了抽象方法,抽象类
(1)如果修饰类的话,此类必须被继承使用,abstrcat最大程度的将子类的共性抽出来。abstract虽然不能生成对象,但可以声明,作为编译时类型,final与abstract不能同时出现。
(2)一个有抽象方法的类,一定是抽象类,但一个抽象类的不一定有抽象方法。
(3)抽象类不可创建对象,但可以有构造函数(子类可以继承)。
(4)子类继承抽象类,必须实现其中的抽象方法,除非子类也是抽象类。
(5)abstract不可与private、static、final、native、synchronized
2.static
(1)作用:方便在没有创建对象的情况下时调用(方法/变量)。只要在类加载了,就可以通过类名调用。
(2)在静态方法中不能调用非静态的成员变量或成员方法,但非静态的方法可以访问静态的成员变量或方法。
(3)静态变量:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类加载的时候会被初始化。非静态成员是对象所拥有,在创建对象的时候,存在多个副本,对象拥有的副本互不影响。
(4) static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。
(5)static是不允许用来修饰局部变量
题:public class Test extends Base{
static{
System.out.println("test static");
}
public Test(){
System.out.println("test constructor");
}
public static void main(String[] args) {
new Test();
}
}
class Base{
static{
System.out.println("base static");
}
public Base(){
System.out.println("base constructor");
}
}
base static test static base constructor test constructor
先加载类,再new 执行构造。
3,final
(1)修饰类:这个类不会被继承,final类中的所有成员方法都会被隐式地指定为final方法。
(2)修饰变量:对于一个基本类型的变量,一旦在初始化了之后就不能再改变。如果是引用类型的变量,在初始化之后便不能改变其引用,但是它指向的对象的内容是可变的。
(3)修饰方法:把方法锁定,以防任何继承类修改它的含义,。类的private方法会隐式地被指定为final方法。
题:
MyClass myClass1 = new MyClass();
MyClass myClass2 = new MyClass();
System.out.println(myClass1.i);
System.out.println(myClass1.j);
System.out.println(myClass2.i);
System.out.println(myClass2.j);
class MyClass {
public final double i = Math.random();
public static double j = Math.random();
}
结果:
0.4527538724400425
0.56876948705211
0.4132824472418981
0.56876948705211
可见final与static的区别。
4 this
(1)是一个引用,它指向自身的引用。一般在类的构造函数中使用,区分开形参和成员变量。
5.super:
(1)用来引用父类的成分。一种是引用被子类隐藏的父类成员,一种是引用父类的构造。
(2)可用super.成员变量或成员方法。如在父类未找到,则继续向上寻找。
(3)在子类的构造函数中如没有super方法,就会默认super()方法调父类构造。
(4)对于父类中包含有参数的构造方法,子类可以通过在自己的构造方法中使用super关键字来引用,而且必须是子类构造函数方法中的第一条语句。