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)!