Static --- 静态
Static可以修饰变量、方法、代码块以及内部类。
静态变量
static修饰的变量称之为静态变量,或者也叫类变量。
静态变量在类第一次使用的时候加载【注:这里的使用指的是实际使用,如创建对象或者调用类中的方法或成员】。静态变量在类加载的时候加载到了方法区中的静态区,并且在静态区中给予了默认值。静态变量是先于对象而存在的。可以不通过对象来调用静态变量而是通过类来调用,当然也可以用对象来调用。由于本类的所有对象所存储静态变量都是该静态变量在静态区中的地址,所以对象共享静态变量。
【在实际开发过程中,如果一些特征是可以共用的,则可以设置为静态的。如果是独有的,则不能设置为静态的,较为常见的是音频、图片、视频等占用内存较大的资料,一般会在初始化或第一次使用的时候被定义为静态变量进行加载】
静态方法
static修饰的方法称之为静态方法或者也叫类方法。静态方法随着类的加载而加载到了方法区中的静态区,只存储在静态区而不执行,在方法被调用的时候到栈内存中执行。静态方法先于对象而存在的。静态方法可以通过类来调用,也可以通过对象来调用。
【这里说明一下:方法区只进行加载和存储,程序内所有需要执行或运算的都会在栈内存中运行,所以说是静态方法在类加载的时候加载到静态区,而被调用的时候再在栈内存中开辟空间,进行运行】
在这之前大家接触过较为常见的静态方法有:
Arrays.toString()、Arrays.sort()、System.arraycopy()、Arrays.copyOf()
那么为大家解释一下问题,在main中可以使用this/super吗?---不可以,因为main函数是静态函数,所以很多初学者会问到,为什么同类中不写static的方法不能用main函数调用,这是因为非static的方法需要用对象来调用。。。
需要注意的是静态方法能被重载,能被继承,但是不能被重写。父子类中可以存在方法签名一致的静态方法,但是这不是重写。--- 静态方法不能重写。--- 如果父子类中存在了方法签名一致的方法,要么都是静态的,要么都是非静态的。
在调用静态方法的时候看的是声明类而不是实现类。
在调用非静态方法的时候看的是实现类而不是声明类。
静态代码块
在类中用static{}包起来的代码,就称之为静态代码块。只在类第一次真正使用(指利用这个类创建对象或者调用方法)的时候在栈内存中执行一次。
【一般情况下,静态代码块的用途是为静态变量进行初始化,因为静态变量一般情况下是共享的音频、视频、图片等占用内存较大文件,所以静态代码块最合适】
思考一个问题:静态变量可以定义在静态代码块中吗?--- 不行,因为静态代码块需要执行调用,所以也会在栈中运行,而静态变量类在被加载的时候加载
那么思考一个问题:
创建子类时执行顺序:父类静态 -> 子类静态 -> 父类非静态 -> 子类的非静态
final --- 最终的
final可以修饰数据、方法以及类
final修饰数据的时候,称之为常量---定义好之后值不可改变。---对于基本类型而言指的是实际值不可变,而对于引用类型而言,指的是地址不可变,但是对象属性或者元素值可以改变
final修饰的方法称之为最终方法。---不可以被重写。---可以重载,可以被继承
final修饰的类称之为最终类---不能被继承【所以父类不能定义为final类】
abstract
发现每一个子类都对父类中的某个方法做了重写,那么此时父类中的方法再声明方法体就没有任何的意义,所以可以将父类的这个方法声明为抽象方法。
抽象方法:用abstract修饰,如 public abstract voidsayHi();
抽象类: 抽象方法必须放在抽象类中。抽象类也是用abstract修饰
【注意:抽象类不能显式创建对象,抽象类也不能是final最终类,抽象方法不能用private和static修饰】
一个类继承了抽象类之后必须重写其中所有的抽象方法,除非这个类本身也是抽象类
抽象类中可以没有抽象方法,但是无论是否含有抽象方法,抽象类都不能用于创建对象。
接口
接口有点象一个规范、一个协议,是一个抽象的概念;而类则是实现了这个协议,满足了这个规范的具体实体,是一个具体的概念。接口的主要作用是统一结构,便于分工合作。
接口中定义的方法都是抽象方法(jdk1.7及其以前)。用interface关键字来声明一个接口。用implements让类和接口之间产生联系,这种联系称之为实现。一个类实现了接口之后必须实现这个接口中所有的抽象方法,除非这个类本身也是抽象类
在java中,接口和类之间是多实现的关系---一个类可以实现多个接口
单继承,多实现---一个类只能继承一个类,一个类可以实现多个接口---针对的是类
java中允许接口之间的继承,并且接口之间是多继承
接口中的方法默认是用public abstract来修饰
接口中可以定义属性,默认是用publicstatic final修饰
接口和抽象类的异同点有哪些?
都不能创建对象,都可以有抽象方法,实体类在继承了抽象类或者是实现了接口之后必须实现其中的抽象方法,除非这个类也是抽象类。
抽象类中可以有构造函数,可以有普通属性和实体方法;接口中没有构造函数,只能定义抽象方法和静态常量。抽象类之间是单继承,接口之间是多继承,以及接口和类之间是多实现。抽象类中的抽象方法只要不是private就行,而接口中的方法只能是public。
抽象类可以继承抽象类,抽象类也可以实现接口