zoukankan      html  css  js  c++  java
  • Java变量与修饰符

    Java变量类型

    java变量定义:type variablename,[variable name = value]=value

    • ​ 局部变量:方法中的变量

      ​ 局部变量声明在方法中

      ​ 访问修饰符不能用于局部变量

      ​ 局部变量在栈上分配

      ​ 局部变量没有默认值,所以被声明后,必须经过初始化

    • ​ 实例变量:独立于方法之外的变量,没有static修饰
      ​ 实例变量声明在一个类中,方法体之外

      ​ 实例变量与对象共存亡

      ​ 访问修饰符可以修饰实例变量

      ​ 实例变量设为私有,通过使用访问修饰符可以使实例变量对子类可见

      ​ 实例变量可以直接通过变量名访问,但在静态方法以及其他类中,使用实例对象名.变量名

    • 类变量:独立于方法之外的变量,用static修饰

      ​ 类变量又被称为静态变量,以static关键字声明,在方法体之外声明

      ​ 静态变量除了声明为常量外很少使用,常量是指声明为public/private+final/static的变量

      ​ 静态变量可以通过:ClassName.var方式访问

      ​ 无论一个类创建了多少个对象,类只拥有类变量的一份拷贝

    public class Variable{
        static int Class_var = 0;//类变量
        String instance_str = 'this is';//实例 变量
    	public void method(){
            int i=0; //局部变量
        }
    }
    
        //salary是静态的私有变量
        private static double salary;
        // DEPARTMENT是一个常量
        public static final String DEPARTMENT = "开发人员";
    

    Java修饰符

    访问修饰符

    ​ 修饰符用来定义类,方法或变量,通常放在最前面

    • ​ default:即默认,什么也不写,在同一包内可见,使用对象:类、接口、变量、方法

      接口里的变量都隐式声明为public static final,接口里的方法默认情况下访问权限为Public

      实例:
      String version = "1.5.1";
      boolean processOrder() {
         return true;
      }
      
    • ​ private:在同一类内可见。使用对象:类、变量、接口、方法

      被声明为private的方法,变量只能被所属类访问,类和接口不能声明为private

      声明为私有访问类型的变量只能通过类中公共的getter方法被外部类访问

      public class Logger {
         private String format;
         public String getFormat() {
            return this.format;
         }
         public void setFormat(String format) {
            this.format = format;
         }
      }
      //format为私有变量,可以通过共有的getFormat()和setFormat()进行操作
      
    • ​ public:对所有类可见,使用对象:类、接口、变量、方法

      被声明为public的类,变量、方法,构造方法和接口能够被任何其他类访问

      在不同的包,需要将类导入包内

    • ​ protected:对统一包内的类和所有子类可见,使用对象:变量,对象,方法。不能修饰类(内部类除外),不可修饰接口

      ​ protected需要在以下俩个点来分析

      • 子类与基类在同一包中:被声明为protected的变量,方法和构造器被同一个包中的任何其他类访问
    • 子类与基类不在同一个包中:在子类中,字类实例可以访问其从基类继承而来的protected方法,而不能访问基类实例的protected方法

    访问修饰符的访问权限

    修饰符 当前类 子孙类(同包内) 同一包内 子孙类(不同包) 其他包
    public Y Y Y Y Y
    protected Y Y Y Y/N Y
    default Y Y Y N N
    private Y N N N N

    问题:不是同一个包中的子类访问父类的变量不可访问

    非访问修饰符

    • static修饰符:用来修饰类方法和类变量,

      静态变量:

      ​ static关键字用来声明独立于对象的静态变量,无论一个类实例化多少对象,他的静态变量只有一份拷贝,静态变量也被称为类变量

      静态方法

      ​ static关键字用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量。

      访问方式

      ​ 对类变量和方法的访问可以直接使用 class/obj.variablenameclass/obj.methodname 的方式访问。

         private static int numInstances = 0;
         protected static int getCount() {
            return numInstances;
        }
      
    • final修饰符

      final变量

      被final修饰的实例变量必须显示指定初始值,切不可更改,通过和static一起来创建类常量

        final int value = 10;
        // 下面是声明常量的实例
        public static final int BOXWIDTH = 6;
        static final String TITLE = "Manager";
      //final类的声明
        public final class Test {
         // 类体
      }
      

      final方法

      ​ 父类中的final方法可以被重写,但不可被覆盖,final方法的主要目的是防止该方法的内容被修改

      final类:

      ​ final类不可被子类继承

    • abstract修饰符

      抽象类

      抽象类不能用来实例化对象,声明抽象类的唯一目的是为了将来对该类进行扩充

      一个类不能同时被abstract和final修饰,如果一个类包含抽象方法,该类必须为抽象类

      抽象类可以包含抽象方法和非抽象方法

      abstract class Caravan{
         private double price;
         private String model;
         private String year;
         public abstract void goFast(); //抽象方法
         public abstract void changeColor();
      }
      

      抽象方法

      抽象方法没有方法体,抽象方法必需要在子类中实现

      抽象类可以不包含抽象方法,类有抽象方法必须为抽象类

      抽象方法不能声明成final和static

      继承抽象类的子类必须实现父类的所有所有方法,除非该子类也是抽象类

      public abstract class SuperClass{
          abstract void m(); //抽象方法
      }
       
      class SubClass extends SuperClass{
           //实现抽象方法
            void m(){
                .........
            }
      }
      

      synchronized修饰符

      ​ synchronized关键字声明的方法同一时间只能被一个线程访问,可用于四个访问修饰符

      public synchronized void showDetails(){
      .......
      }
      

      transient修饰符

      ​ 序列化对象包含被transient修饰的实例变量时,java虚拟机会跳过该变量

      ​ 该修饰符包含在定义变量的语句中,用来预处理类和变量的数据类型

    public transient int limit = 55;   // 不会持久化
    public int b; // 持久化
    

    volatile修饰符

    volatile修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值,而且当成员变量发生变化时,会强制线程将变化的值回写到共享内存,这样在任何时可,俩个不同的线程总是看到某个成员变量的同一个值

    public class MyRunnable implements Runnable
    {
        private volatile boolean active;
        public void run()
        {
            active = true;
            while (active) // 第一行
            {
                // 代码
            }
        }
        public void stop()
        {
            active = false; // 第二行
        }
    }
    

    通常情况下,在一个线程调用run()方法(在runnable开启的线程),在另一个线程调用stop()方法。如果第一行缓冲区的active值被使用,在第二行的active值为false时循环停止

  • 相关阅读:
    发送邮件失败Authentication failed; nested exception is javax.mail.AuthenticationFailedException: 535
    文件上传报错:Current request is not a multipart request
    Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback.
    IDEA——错误: 找不到或无法加载主类 com.Main
    浅识微服务架构
    ConcurrentHashMap底层实现原理(JDK1.8)源码分析
    Tiled Editor 图块的两种导入方式
    TileMap Editer 编辑器工具介绍
    Tiled 地图编辑器使用教程-官方demo
    log4net 基础
  • 原文地址:https://www.cnblogs.com/Mr-l/p/11870622.html
Copyright © 2011-2022 走看看