java基础成员变量和局部变量

成员变量和局部变量

根据定义变量位置的不同,可以将变量分为成员变量和局部变量

       成员变量是在类范围定义的变量

       局部变量是在一个方法内定义的变量

成员变量可以分为:

       实例属性(不用static修饰)随着实例属性的存在而存在

       类属性(static修饰)随着类存在而存在

成员变量无需显式初始化,系统会自动对其进行默认初始化

局部变量可分为:

        形参(形式参数)在整个方法内有效

        方法局部变量(方法内定义)从定义这个变量开始到方法结束一段时间内有效

       代码块局部变量(代码块内定义)从定义这个变量开始到代码块结束这一段时间内有效

局部变量除了形参外,都必须显示初始化,也就是要指定一个初始值,否则不能访问。

示例代码:

[Java] 纯文本查看 复制代码

?

001

002

003

004

005

006

007

008

009

010

011

012

013

014

015

016

017

018

019

020

021

022

023

024

025

026

027

028

029

030

031

032

033

034

035

036

037

038

039

040

041

042

043

044

045

046

047

048

049

050

051

052

053

054

055

056

057

058

059

060

061

062

063

064

065

066

067

068

069

070

071

072

073

074

075

076

077

078

079

080

081

082

083

084

085

086

087

088

089

090

091

092

093

094

095

096

097

098

099

100

101

102

103

104

105

106

107

package object;

/**

 * 成员变量和局部变量

 *

 * */

public class VariableTest {

     

    //成员变量

    public static String staticname = "类属性";

    public String nostaticname = "实例属性";

     

    //没有初始化的成员变量

    public static String staticname1;

    public String nostaticname1;

     

    //定义一个方法

    public void info(){

        //在方法中定义一个局部变量i

        //int i;

        //直接输出是输出不出来的,因为没有初始化

        //System.out.println(i);

        //定义一个局部变量i并初始化

        int i = 10;

        //输出i

        System.out.println(i);

    }

     

    //定义了一个静态的方法

    public static void infos(){

        int i = 20;

        System.out.println(i);

    }

     

    public static void main(String[] args) {

        /*第一问:类属性和实例属性的范围一样吗?*/

        //在没创建实例之前 可以调用类属性,但不能调用实例属性

        System.out.println(VariableTest.staticname);//结果:类属性

        //实例化对象之后,就可以调用实例属性了

        VariableTest vt = new VariableTest();

        System.out.println(vt.nostaticname);//结果:实例属性

        /*--- 结论:在成员变量中,类属性的范围比实例属性大一点 ---*/

         

        System.out.println("----------");

         

        /*第二问:成员变量需要显性初始化吗?*/

        //直接调用没有初始化的类属性

        System.out.println(VariableTest.staticname1);//结果:null

        //用实例化对象调用没有初始化的实例属性

        System.out.println(vt.nostaticname1);//结果:null

        /*--- 结论:成员变量会自动隐性初始化,赋给变量一个默认值  ---*/

         

        System.out.println("----------");

         

        /*第三问:如果用实例化后的对象去调用类属性会怎么样?*/

        //vt.staticname;

        //这样会报错

        //Syntax error, insert "VariableDeclarators" to complete LocalVariableDeclaration

        //翻译:语法错误,插入“变量声明符”来完成局部变量声明

        /*为什么会报错。一开始我以为是因为eclipse出错了

         *后来我直接用文本文档重写了一个test

         *编译文件后,报不是语句的错,然后我又试了一下

         *VariableTest.staticname

         *也是报错,说明这种写法是不正确的,具体为什么有待研究*/

        vt.staticname = "改变了的类属性";

        //如果同时给类属性赋值,就不会报错...有警告

        //The static field Variable Test.static name should be accessed in a static way

        //翻译:静态字段变量测试。静态的名字应该在一个静态方法访问

        System.out.println(vt.staticname);//结果:改变了的类属性

        //这样就不会报错,但是会有警告,同上↑

        /*结论:用实例化后的对象调用类属性,格式正确的情况下,是可以调用的,但有警告

         *通过对象调用类属性,同样可以改变类属性的值*/

         

        System.out.println("----------");

         

        //定义在方法中的局部变量

        /*第四问:定义在方法中的局部变量,出了方法还能访问吗?*/

        //调用方法

        vt.info();//结果:10

        //现在还能用info中的i吗?

        //System.out.println(i);

        //报错:i cannot be resolved to a variable

        //翻译:i 不能转换成一个变量

        /*结论:定义在方法中的局部变量,出了方法就不能被访问了*/

         

        System.out.println("----------");

         

        //定义在代码块中的局部变量

        /*第五问:定义在代码块中的局部变量,出了代码块还能访问吗?*/

        {

            int j = 11;

            System.out.println(j);//结果:11

        }

        //出了代码块

        //System.out.println(j);

        //同样报错,内容与上面的一样

        /*定义在代码块中的局部变量,出了代码块就不能访问了*/

         

        System.out.println("----------");

         

        //后续:一个静态方法

        infos();//结果:20

        //这样依然报错

        //System.out.println(i);

         

    }

}


java允许局部变量和成员变量重名,局部变量会覆盖成员变量的值(就近原则)

[Java] 纯文本查看 复制代码

?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

package object;

/**

 * 局部变量覆盖成员变量

 * */

public class VariableCover {

     

    /*当实例变量与方法中的局部变量同名时,

     *局部变量的值会覆盖实例变量*/

    //定义实例变量

    public String city = "合肥";

    private static String citys = "滁州";

    //定义一个方法

    public void function(){

        String city = "蚌埠";

        //输出

        //方法中的同名局部变量会覆盖实例变量

        System.out.println(city);//结果:蚌埠

        //要想调用实例变量,可以用this

        System.out.println(this.city);//结果:合肥

    }

     

    public static void main(String[] args) {

        String citys = "南京";

        //方法中的同名局部变量会覆盖实例变量

        System.out.println(citys);//结果:南京

        //可以通过类名调用被覆盖的类属性

        System.out.println(VariableCover.citys);//结果:滁州

         

        String city = "上海";

        System.out.println(city);//结果:上海

        //这样也可以

        System.out.println(new VariableCover().city);//结果:合肥

        new VariableCover().function();

    }

}

发布了773 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/heima201907/article/details/104672121