CoreJava学习第七课-三个修饰符

三个修饰符

一. abstract 抽象--->和多态有关

1.4种访问修饰符可以修饰的范围

private 属性 方法 构造方法  
default 属性 方法 构造方法
protected 属性 方法 构造方法  
public 属性 方法 构造方法

2.abstract 抽象:可以用来修饰类和方法。

1.类    ①抽象类只能声明引用,不能创建对象  供子类继承②不能用new来创建抽象类,不会创建出独立的抽象类的;但抽象类可以作为子类的一部分存在,创建子类之前,还是会先创建父类对象。
2.方法   抽象方法只有声明, 没有实现。供子类实现(实现是一种特殊的覆盖,覆盖一般在两个普通的类之间发生;实现是在一般的类和抽象类之间发生)
a).如果一个类具有抽象方法,那么这个类就必须是抽象类; 抽象类未必有抽象方法
b).一个类继承抽象类,如果这个类不希望也成为抽象类,就必须实现父类中所有的抽象方法

c).抽象类也拥有构造方法, 供子类用super(...)调用
d).抽象方法可以使方法的声明和实现分离,声明提取到父类,实现留在子类, 更好的体现"子类的共性放在父类"设计思想
java语法:
	1.编译语法:  抽象类和抽象方法都是给编译器用的。
	2.虚拟机语法:已经通过编译后,在运行时,抽象类和抽象方法都会被当成普通类,普通方法使用。

二.static 静态--->和类有关

1.static 修饰

CoreJava学习第七课-三个修饰符_第1张图片

 

1.属性      静态属性不属于任何对象, 全类共有         可以用类名直接访问
​
2.方法      静态方法可以直接用类名调用,和对象无关
            静态方法只能访问类的静态成员
            非静态方法只能被子类的非静态方法覆盖,静态方法只能被子类的静态方法覆盖, 而且没有多态   
            (对引用调用静态方法,等价于对引用的类型调用静态方法)
        [在非静态方法中,无论方法或属性是否是静态的,都能够访问;而在静态方法中,只能访问静态属性和方法]
3.初始代码块  初始化操作时,执行初始化代码块的内容
            静态初始代码块 在类加载的时候执行一次
class MyClass{
    {
        System.out.println("这是初始代码块!");//初始化操作时,执行初始化代码块的内容
    }
    static{
        System.out.println("hehe");//静态初始代码块,在类加载的时候执行一次
    }
    public MyClass(){
        System.out.println("MyClass()构造方法");
    }
}
结果:
    hehe
    这是初始代码块!
    MyClass()构造方法

2.类加载

​ 类加载发生在创建对象之前,且只做一次。

​ 当JVM第一次使用一个类的时候,需要读取这个类对应的字节码文件,获取类的信息并保存起来

CoreJava学习第七课-三个修饰符_第2张图片

类加载的过程:
  1.如果需要,先加载父类
  2.按照代码顺序,初始化静态属性,并执行静态初始代码块
  (从网上摘录https://blog.csdn.net/dawn_after_dark/article/details/74091898)
  	1,一般情况:执行顺序为:静态代码块>非静态代码块>构造方法>类的方法
    2,在继承机制中,创建子类对象时会先初始化父类对象再初始化子类对象,所以这里又涉及到了代码块的执行顺序。 
  简单概括为:父类静态代码块>子类静态代码块>父类非静态代码块>父类构造函数>子类非静态代码块>子类构造函数 
  以上执行顺序会依次进行,若没有就跳过,直到结束
类加载的时机:
  1.第一次创建对象
  2.第一次访问类的静态成员  

三.final

1.final修饰

final可修饰 
    1.方法    不能被子类覆盖
    2.类      不能被子类继承
    3.变量    一旦赋值,不能改变   常量
              用final修饰的成员变量没有默认值     
              利用初始化属性的方式为常量赋值的, 应设置为static, 需要注意常量名全大写
              class B{
                final int M = 10;//赋值方式1:初始化赋值
    
                final int N;
                public B(int i){//赋值方式2:构造方法赋值
                    this.N = i;
                }
                public B(){//赋值方式2:构造方法赋值
                    this.N = 10;
                }
            }

2.修饰符组合

    static , final ,private   不能和abstract同时出现
    abstract和多态相关,父类方法声明成abstract,由子类去实现,
    而final修饰的类是不能被继承的;
    static和类有关,与对象无关,对static修饰的类调用类中的方法,只会调用本类的方法,不会调用子类的方法;
    private修饰的方法和属性不会被子类拥有,所以谈不上方法覆盖之类的,无法与abstract同时出现。

总结

static 修饰范围 abstract 修饰范围 final 修饰范围
属性、方法、初始代码块 类、方法 类、方法、变量(属性、局部变量、方法参数)
static 不可修饰 abstract 不可修饰 final 不可修饰
局部变量、类    

你可能感兴趣的:(CoreJava学习)