自学内容网 自学内容网

Java——Static与final修饰的变量与方法(总结)

前言:

        Java语法学过一遍之后,我相信大多数和我一样脑瓜子嗡嗡的,甚至有点乱了,这时候应该自己把之前的能总结的,或者不熟悉的都要总结一遍,以便于后期的学习!!

static修饰的成员变量:        

        首先我们来讨论一下static修饰的成员变量:

        static修饰的成员变量,语法形式:

        (限定修饰符)(public、protected、private)+static+ 变量类型+变量名;

 static修饰的变量究竟怎么用?

        static修饰的便令有什么用?

        首先值得注意的是:被static修饰,意味着在这个变量属于类了,而不属于对象了!!

那是什么意思?

        首先被static修饰的变量被放在了方法区(Java中有5大区:虚拟机栈、本地方法栈、堆区、方法区、程序计数器)。

        拿起的没有被static修饰的方法被放在了哪里呢?

        首先没有被static修饰的方法是不属于类的,是属于对象的,也就是如果我们没有new一个新的对象的话是调用不了的,所以可以理解为没有被static修饰的方法当new一个新对象后是储存在虚拟机栈中的,也就是当这个对象销毁,对应的方法也就调用不了了,对应的所有初始化也会被重置!

例如:

 class  Person{
  public static String name;
  public static int age;

}

 此时我可以直接在main方法中调用:

 class  Person{
  public static String name;
  public static int age;

 public static void main(String[] args) {
  Person.name = "haha";
  Person.age = 12;
  System.out.println(Person.name);
  System.out.println(Person.age);
 }

 打印结果:

那此时有人就问了,你这个main方法就在Person类里面,我是不是可以直接初始化name和age呢?

没错!!

我甚至都不需要写类名,可以直接调用! 

 class  Person{
  public static String name;
  public static int age;

 public static void main(String[] args) {
  name = "haha";
  age = 14;
  System.out.println(name);
  System.out.println(age);
 }

那如果是在其他的方法中可不可以初始化静态变量呢?

 class  Person{
  public static String name;
  public static int age;
  public void init(){
   name = "hehe";
   age = 15;
   System.out.println(name);
   System.out.println(age);
  }

发现没有报错,也是可以滴!

此时我在其他类中的main方法中初始化看看效果!

public class Test {
 public static void main(String[] args) {
  Person.name = "haha";
  Person.age = 18;
  System.out.println(Person.name);
  System.out.println(Person.age);
 }
}

发现此时就必须写类名了,但是此时不需要实例化对象。

所以,这时候,可以总结一下了:

        1.当静态成员在自己类中被调用时,不需要类名.成员名,直接可以初始化。但是不能用this.类名的形式进行初始化,因为此时成员不属于对象的。

        2.当静态成员在其他类中初始化,调用时形式必须是类名.成员名

大家可以踊跃尝试各种情况!

static修饰的成员方法:

        static修饰的成员方法语法形式:

               (限定修饰符)(public、protected、private)+static+ 方法返回类型+方法名;

       static修饰的成员放法和成员变量是一样的,都放在方法区中,调用时可以直接类名.方法名调用!

例如:
 

 class  Person{
  public static String name;
  public static int age;
  public static void init(){
   name = "hahaha";
   age = 17;
  }

 public static void main(String[] args) {
  Person.init();
 }
}

 

        这些对大家都很简单,但是此时有一个问题,刚刚我在静态方法中初始化的时候,我初始化的是静态成员,那此时如果我有几个变量不是静态的那可不可以调用初始化呢?

 class  Person{
  public static String name;
  public static int age;
  public int high;
  public static void init(){
   name = "hahaha";
   age = 17;
   high = 20;//报错了
  }
}

        此时报错出现了,那有人又说,因为没有被static修饰的是属于对象的,那我此时可不可以new一个对象再访问呢?

 class  Person{
  public static String name;
  public static int age;
  public int high;
  public static void init(){
   name = "hahaha";
   age = 17;
   Person person = new Person();
   person.high = 20;
  }
}

没有问题滴!!

总结一下:

1、static修饰的成员方法可以直接访问该类内部的被static修饰的成员变量。

2、static修饰的成员方法在被访问时,一般是通过类名.成员方法名访问。

final修饰的成员变量:

final修饰的基本变量:

语法形式:

(访问限定修饰符)+(static)+final+变量类型+变量名;

        被final修饰的意思就是常量的意思,也就说这个变量不能再被改变!!被final修饰的基本变量放在虚拟机栈中,由于此时变成了常量,所以一开始就必须给该变量赋值,不能定义为:

这是错的!!

还是一样,此时该变量如果要调用该怎么调用?

调用的形式还是和普通的一样,如果在同一个类中,可以直接访问,如果外部需要访问还是要new一个新的对象,然后调用!

值得注意的是:

        1.无论怎么调用,该变量的值不能改变不了。

        2.改变变量是属于对象的!

final修饰的引用类型:

        如果final修饰一个String类,那么是什么意思?

        此时我们都知道,String类型引用堆区的对象,此时如果加final关键字意思就是堆区的这个对象的内容也不能改变了,但是我们还是可以改变String引用的对象的指向的!

例如:
 

此时相当于改变了name引用对象的内容是不可以的!

这里就来区分一下如果没有加final那么两个String类是如何赋值的:

 public static void main(String[] args) {
  String name = "hahaha";
  String name1 = "hehehe";
  name1 = "wawawa";
  System.out.println(name);
  System.out.println(name1);
 }

问:此时name1的改变影不影响name的值?

答案是:不会的!

这个在之前Java--String类-CSDN博客有讲过,也就是String内部是怎样的有关!

不熟悉的可以看看哦!

final修饰的类:

        这里只需要记住一句话:

final修饰的类没有办法继承!

final修饰的成员方法:

这里也需要记住一句话:

final修饰的方法,不能在其他类中重写!(前提是该类被其它类继承)

例如:

 

此时如果重写父类中的方法会报错!!


原文地址:https://blog.csdn.net/m0_75235246/article/details/142345857

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!