static
private int a;//非静态变量、实例变量、非静态属性
private static int b;//静态属性、静态变量、类变量
我们说的静态变量和非静态变量说的都是成员变量。局部变量不可以用static修饰。
public void m1(){}//非静态方法、实例方法
public static void m2(){}//静态方法、类方法
{
System.out.print();//游离块
}
static{
System.out.print();//静态块
}
public class Inner{//非静态内部类
}
Public static class Inner
{//静态内部类
}
静态变量和非静态变量的区别:
静态的方法中,只能直接访问静态的属性和方法
静态的成分优先于对象存在(数据共享)
静态和非静态方法的区别:
- 修饰符不同
- 调用方式不同:静态用类.方法名 非静态用对象.方法名
static块:
static{//静态游离游离块
//静态游离块内容
}
使用static的匿名块时候子类创建对象的执行顺序:父类静态块-->子类静态块-->父类游离块-->父类构造方法-->子类游离块-->子类构造方法
package com.****;
class Father {
static {
System.out.println("Father类中静态块");
}
{
System.out.println("Father类中游离块");
}
public Father() {
System.out.println("father无参构造方法");
}
}
class Son extends Father {
static {
System.out.println("Son类中静态块");
}
{
System.out.println("Son类中游离块");
}
public Son() {
System.out.println("son无参构造方法");
}
}
public class Demo {
public static void main(String[] args) {
//什么叫类加载的时候
Son s1 = new Son();
}
}
结果如下:
final
final修饰的类不能被继承
final修饰的属性不能被子类重写
final修饰的变量不能被再次赋值
final修饰的引用类型时,它就不能再指向新的对象(地址),但是它指向的对象的值可以被改变
abstract
抽象类:被abstract修饰的类。
抽象类不可以直接创建对象
什么时候把类定义为抽象类?
情况1:有抽象方法(被abstract修饰的方法)
抽象方法是只有声明但是没有方法体的方法。
抽象方法必须定义在抽象类中。
情况2:子类继承了父类的抽象类,但是至少有一个抽象方法没有实现,则子类必须定义为抽象类。
情况3:类实现了接口(接口就是更抽象的抽象类),但是没有实现接口中的所有抽象方法。(和情况2类似)
interface(只能修饰类,称为接口)
接口使用interface修饰,是比抽象类更抽象的抽象类
在接口中,只能定义public static fianl修饰的常量和public abstract修饰的抽象类。但是在JDK1.8之后加入了static方法和default方法。加入的好处是为了避免当需要在父类中添加方法时必须重写所有子类的情况。Static和default的方法可以被所有子类调用(static使用接口名.方法名调用,default使用子类对象.方法名)。
接口、类之间的继承模式:
- 接口与接口是多继承(当有别的类实现多继承的接口时必须实现所有的抽象方法)
- 类和接口是多实现
- 类和类是单继承
一个类可以实现多个接口,但是必须实现接口中的所有抽象方法。当子类实现的多个接口中出现同名default方法时(default方法使用格式是子类对象.方法名,因此出现同名对象时不知道调用那一个),它必须做出”选择”。
接口不可以直接创建对象:
1.可以通过实现类创建 接口类 接口名=new 实现类();类似子类向上转型
2.匿名类