java修饰符详解

  1. 访问修饰符

    public:公共的

    protected:受保护的(不能修饰类)

    default(默认不写)

    private:私有的(不能修饰类)

    修饰符 当前类 同一包内 被继承的类(同包) 被继承的类(不同包) 其他包
    public 能访问 能访问 能访问 能访问 能访问
    protected 能访问 能访问 能访问 能/不能 不能访问
    default 能访问 能访问 能访问 不能访问 不能访问
    private 能访问 不能访问 不能访问 不能访问 不能访问

    注:

    protected:

    • 基类的 protected 成员是包内可见的,并且对子类可见
    • 若子类与基类不在同一包中,那么在子类中,子类实例可以访问其从基类继承而来的protected方法,而不能访问基类实例的protected方法
  2. 特征修饰符

    abstract:抽象的
    1. 修饰方法

      用abstract修饰符修饰的方法 只有方法的结构 没有方法执行体叫做抽象方法

      注:native修饰的方法虽然也没有方法体 但不是抽方法,过程是其他语言写的

      public class Person(){
          //被abstract修饰的方法没有方法体
          public abstract void medth();
      }
      
    2. 修饰类

      用abstract修饰符修饰的类 叫做抽象类

      public abstract class Person(){
          //抽象类里面可以有抽象方法 也可以有普通方法
          //抽象方法
          public abstract void medth();
          //普通方法
          public void medth1(){
              System.out.println("这是一个普通方法");
          }
      }
      
    3. 特点

      • 抽象类中不是必须要有抽象方法

      • 抽象方法必须放在抽象类中或者接口中,普通类中不允许有抽象方法

    4. 如何使用

      • 抽象类中含有构造方法,但是我们不能通过调用构造方法直接创建对象
      • 抽象类只能通过子类继承来做事
      //定义一个抽象类
      public abstract class Person(){
          public abstract void run();
      }
      //定义一个类 并继承Person
      public class Son extends Person(){
          //重写Person中的run方法
           @Override
          public void run() {
              System.out.println("这是我继承我的父类重写的方法");
          }
      }
      public static void main(String[] args) {
          son son=new son();
          son.run();
      }
      

      以上程序执行结果为:

      这是我继承我的父类重写的方法
      

      5.类和类之间的关系:

      • 抽象类---单继承---抽象类
      • 抽象类---单继承---具体类 (一般不会出现)
      • 具体类---单继承---抽象类 不可以(将父类的抽象方法具体化或子类也变成抽象类)
    final:最终的 不可改变的
    • 修饰变量

      如果存储的是值类型:变量内的值不让更改---常量

      如果存储的是引用类型:变量里面的地址引用不让更改---对象唯一

    • 修饰属性

      属性如果没有赋值 有默认值存在的

      属性用final修饰后必须给属性赋初始值,否则会编译错误

    • 修饰方法

      方法是最终的方法 不可以更改(覆盖)

      final修饰的方法,要求不可以被子类重写(覆盖)

    • 修饰类本身

      类是最终的 不可以更改、

      (太监类)此类不可以被其它子类继承

    static:静态的
    • 修饰变量:

      • static修饰的成员变量也叫做静态变量,也叫作类变量,说明这个变量属于类的,而不是属于对象的
      • 被所有的对象共享,在内存中只有一个副本,static成员变量的初始化顺序按照定义的顺序进行初始化
      • 静态变量必须要静态成员才能调用或者访问
      public class Test(){
          //定义一个静态变量
          static String name;
          //这里定义一个静态方法  注意:要想使用静态变量 方法也必须定义成静态方法 
          //如果不定义成静态方法 调用静态变量就会报错
          public static void medth(){
              name="定义的静态变量";
              System.out.println(name);
          }
          public static void main(String[] args){
              medth();
          }
      }
      

      以上程序执行的结果为:

      定义的静态变量
      
    • 修饰方法:

      被static修饰的方法也叫做静态方法,因为对于静态方法来说是不属于任何实例对象的

      public class Test(){
      	//定义一个静态变量
          static String name;
          //定义一个普通的变量
          int age;
          //定义一个静态方法
         public static void medth(){
             	//打印输出静态name	
               System.out.println(name);
              //打印输出普通变量age
               System.out.println(age);
            }
          public static void main(String[] args) {
              medth();
            }
      }
      

      以上程序执行的结果:

      • age是访问不到的,会报错误:无法从静态上下文中引用非静态变量age

      注:

      静态变量和普通变量的区别:

      • 静态变量属于类变量 成员变量属于对象变量
      • 静态变量存储在方法区的静态区 成员变量存储在内存中的堆
      • 静态变量随着类的加载而加载,随着类的消失而消失
      • 成员变量随着对象的加载而加载,随着对象的消失而消失
      • 静态通过类名调用 成员变量通过对象调用

    特点:

    • 静态元素在类加载时就初始化了
    • 静态元素存储在静态元素区中,每一个类有一个自己的区域,与别的类不冲突
    • 静态元素只加载一次(只有一份)全部的类对象及类本身共享
    • 由于静态元素区加载的时候,有可能没有创建对象,可以通过类名字直接访问
    • GC机制时无法管理静态元素的,可以认为是常驻内存
    • 非静态成员中可以访问静态成员
    • 静态成员中可以访问静态成员
    • 静态成员中不可以访问非静态成员
    • 在静态元素中不能出现this或super
    native:本地的

    java源代码中看到native就已经看不到后续的代码了

    后续会调用其他语言C++ C执行的内存操作 帮我们操作内存

posted @ 2020-09-10 17:07  yuanStudy  阅读(230)  评论(0)    收藏  举报