解析Java修饰符

开课吧开课吧锤锤2021-07-09 15:10

    Java是当今互联网行业炙手可热的编程语言,像阿里、美团这些大型工厂,技术体系都是建立在Java之上的。这类大型工厂是许多新兴互联网企业的技术风向标,所以Java的应用范围相当广泛,对Java程序员的需求也相当大。

浅谈Java修饰符

    本篇是对Java中修饰符的说明和讨论。

    Java中的修饰符是用来改变定义含义的关键字,修饰符被分类为两种类型。

    1.访问控制修饰符

    2.非访问修饰符

    访问控制修饰符

    Java语言中有四个访问修饰符来控制类,变量方法和构造函数的访问级别。

    默认值(default)

    默认值只在同一个包中可以访问。

    公开(public)

    公开范围内,任何类都可以访问。

    受保护(protected)

    包含的范围和所有的子类,对其它不能访问。

    私有(private)

    私有仅在类中可以访问。

浅谈Java修饰符

    非访问修饰符

    非访问修饰符不会更改变量和方法的可访问性,但它们确实为它们提供了特殊属性,非访问修饰符有5种类型。

    分别是Final、Static、Transient、Synchronized、Volatile。

    Final

    Final修饰符用于将字段声明为final,即它可以防止其内容被修改。声明时必须初始化最终字段,Final关键字可以与变量,方法或类一起使用。

    final变量

    当变量声明为final时,则无法更改其值,变量就像一个常量。

final int a = 5;

    final方法

    当方法声明为final时,则无法重写该方法。

class StudyTonight
{
  final void learn()
  {
    System.out.println("learning something new");
  }
}
class Student extends StudyTonight
{
  void learn()
  {
    System.out.println("learning something interesting");
  } 
  public static void main(String args[]){
    Student object= new Student();
    object.learn();
  }
}

    这将产生编译时错误,因为该方法被声明为final,因此无法重写它。

    注意:final方法可以在子类中继承/使用,但不能重写。

    示例

class Cloth
{
  final int MAX_PRICE = 999;    
  final int MIN_PRICE = 699;
  final void display()       
  {
    System.out.println("Maxprice is" + MAX_PRICE );
    System.out.println("Minprice is" + MIN_PRICE);
  }
}

    一个类也可以声明为final。声明为final的类不能被继承。java.lang包中的String类是final类的一个例子,声明为final的方法可以继承,但不能重写(重新定义)它。

    静态修饰符

    静态修饰符用于创建类变量和类方法,可以在没有类实例的情况下访问它们。

    静态变量

    静态变量被定义为可以在没有该类的任何对象的情况下访问的类成员。静态变量只有一个存储空间,具有静态变量的类的所有对象将具有相同的静态变量实例。静态变量只初始化一次。

    静态变量用于表示类的公共属性,它节省了内存。

    假设一家公司有100名员工。所有员工都有自己的唯一名称和员工ID,但公司名称将与所有100名员工相同,这里的公司名称是共同属性。因此,如果创建一个用于存储员工详细信息的类,则company_name字段将标记为静态。

    示例

class Employee
{
  int e_id;
  String name;
  static String company_name = "funnyZhang";
}

    静态变量的示例

class ST_Employee
{
    int eid;
    String name;
    static String company_name ="StudyTonight";
    public void show()
    {
        System.out.println(eid+" "+name+" "+company_name);
    }
    public static void main( String[] args )
    {
      ST_Employee se1 = new ST_Employee();
      se1.eid = 104;
      se1.name = "Abhijit";
      se1.show();
      ST_Employee se2 = new ST_Employee();
      se2.eid = 108;
      se2.name = "ankit";
      se2.show();
    }

}

解析Java修饰符

    静态变量和实例变量

    静态变量代表大家的公共属性、可以使用类名访问、只加载一次或只获取内存一次。

    实例变量代表唯一的属性、可以通过对象访问、每次创建新对象时都会获取新的内存。

public class Test
{
   static int x = 100;
   int y = 100;
   public void increment()
   {
       x++; y++;
   }
 public static void main( String[] args )
 {
     Test t1 = new Test();
     Test t2 = new Test();
     t1.increment();
     t2.increment();
     System.out.println(t2.y);
     System.out.println(Test.x); 
 }
}
#输出:101 102

    查看两个变量的值差异,静态变量x显示对不同对象的increment()方法所做的更改。实例变量y仅显示该特定实例上的increment()方法对其所做的更改。

    静态方法

    方法也可以声明为static,静态方法不需要其类的实例进行访问。main()方法是静态方法最常见的例子。main()方法声明为static,因为它是在创建类的任何对象之前调用的。

class Test
{
  public static void square(int x)
  {
    System.out.println(x*x);
  }
  public static void main (String[] arg)
  {
    square(8);
  }
}
# 输出:64

    静态代码块

    静态块用于初始化静态数据成员。静态块在main()方法之前执行。

class ST_Employee
{
   int eid;
   String name;
   static String company_name;
   static {
    company_name ="StudyTonight";   
    }
    public void show()
    {
        System.out.println(eid+" "+name+" "+company_name);
    }
    public static void main( String[] args )
    {
      ST_Employee se1 = new ST_Employee();
      se1.eid = 104;
      se1.name = "Abhijit";
      se1.show();
    }
}
# 输出:104 Abhijit StudyTonight

    问:为什么无法从静态上下文引用非静态变量?

    答:当尝试从静态上下文(如main方法)访问非静态变量时,Java编译器会抛出类似“无法从静态上下文引用非静态变量”的消息。这是因为非静态变量与类(对象)的实例相关,并且在使用new运算符创建类的实例时会创建它们。因此,如果尝试访问非静态变量而没有任何实例编译器会抱怨,因为这些变量尚未创建,并且在创建实例并与之关联之前它们没有任何存在。

    示例

class Test
{
  int x;
  public static void main(String[] args)
  {
    x=10;
  }
}
# 编译器错误:无法从静态上下文引用非静态变量计数

    使用类的实例的相同示例

class Test
{
  int x;
  public static void main(String[] args)
  {
    Test tt=new Test();
    tt.x=10;   
  }
}

    问:为什么main()方法在Java中是静态的?

    答:因为可以在没有任何类实例的情况下调用静态方法,并且在创建类的任何实例之前会调用main()。

    Transient修饰符

    当实例变量声明为transient,则在序列化对象时其值不会保留。

    Synchronized修饰符

    当方法同步时,一次只能访问一个线程。

    Volatile修饰符

    Volatile修饰符告诉编译器,程序的其他部分可能会意外更改volatile变量。在多线程程序的情况下使用volatile。volatile关键字不能与方法或类一起使用,它只能与变量一起使用。

    以上就是开课吧广场小编为大家整理发布的“解析Java修饰符”一文,更多Java教程相关内容尽在开课吧广场Java教程频道。

免责声明:本站所提供的内容均来源于网友提供或网络搜集,由本站编辑整理,仅供个人研究、交流学习使用。如涉及版权问题,请联系本站管理员予以更改或删除。
有用
分享
全部评论快来秀出你的观点
登录 后可发表观点…
发表
暂无评论,快来抢沙发!
高并发编程训练营