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

成员变量和局部变量

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

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

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

 

成员变量可以分为:

       实例属性 (不用static修饰)

              随着实例属性的存在而存在

      类属性 (static修饰)

              随着类的存在而存在

 

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

 

局部变量可分为:

       形参(形式参数)

              在整个方法内有效

       方法局部变量 (方法内定义)

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

       代码块局部变量 (代码块内定义)

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

 

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

示例代码:

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允许局部变量和成员变量重名,局部变量会覆盖成员变量的值

 

代码示例:

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();
    }
}
/*
文章是我从我的CSDN博客里考过来的,因为那边用的不习惯,比较乱,没有这边纯粹...虽然有些功能是挺好的...全转过来之后,那边就废弃了....
*/

 

时间: 2024-12-27 00:32:14

【java基础】成员变量和局部变量的相关文章

Java基础——成员变量、局部变量和静态变量的区别

之前在刚开始学习Java的时候,就谈了谈Java基础中的变量,虽然知道这货以后会经常用到,但没想到了基本语法这里,竟然有冒出来了成员变量.局部变量和静态变量.变来变去太容易让人搞晕了,挑拣出来梳理一下喽! 要想区分这哥仨,首先,我们得知道它们分别是什么.先从成员变量下刀. 成员变量 我们来研究一个事物: 属性:外在特征:例如人的身高,体重 行为:能够做什么:例如人有说话,打球等行为. 而在Java语言中,最基本的单位是类,类就是用来体现事物的. 用类class来描述事物也是如此: 属性:对应类中

Java基础——成员变量和局部变量

一.局部变量 在Java中,定义在类中的变量被称为成员变量,其作用域是在方法内有效.局部变量在使用时,必须先初始化才能使用,否则不能通过编译.如下代码局部变量未初始化,提示错误: 二.成员变量 1.定义在方法中的变量被成为局部变量,其作用域在整个类中有效.成员变量使用时,不需要初始化变量,系统可以按默认原则进行初始化.初始化原则如下表: 无需初始化,代码如下: 注意,被final修饰的成员变量必须先初始化: 2.如果在某个方法中定义的局部变量和成员变量同名,这种情况是允许的,此时方法中通过变量名

java 线程---成员变量与局部变量

关于成员变量与局部变量: 如果一个变量是成员变量,那么多个线程对同一个对象的成员变量进行操作时,他们对该成员变量是彼此影响的(也就是说一个线程对成员变量的改变会影响到另一个线程) . 如果一个变量是局部变量,那么每个线程都会有一个该局部变量的拷贝,一个线程对该局部变量的改变不会影响到其他的线程. 实例: Servlet容器为了响应多个用户同时访问一个Servlet的HTTP请求,通常会为每个请求分配一个工作线程,这些工作线程并发执行同一个Servlet(即Servlet是单实例的)的servic

Java中成员变量和局部变量的区别

java面向对象过程中,最基本的两类变量就是成员变量和局部变量 成员变量是写在类中并且写在方法外部,一般写在每个类的头部,用于初始化或者方法操作,作用域是整个类被实例化到被销毁,中间变量都可以被外部方法(权限为public时)或者内部方法所共享使用,并且可以保持变量的值,就是多个方法可以复用该变量,成员变量一般要加权限修饰符,并且定义成员变量的时候系统会给初始值0 而局部变量作用域只在方法内部,当方法调用完毕,该变量也自动消失,并且只有方法本身可以使用,其他方法或类都不能使用该变量,也就是方法本

java中成员变量和局部变量在内存中的分配

对于成员变量和局部变量:成员变量就是方法外部,类的内部定义的变量:局部变量就是方法或语句块内部定义的变量.局部变量必须初始化. 形式参数是局部变量,局部变量中基础数据类型的引用和值都存储在栈中,对象引用存在栈中,对象存在堆中.栈内存中的局部变量随着方法的消失而消失. 成员变量存储在堆中的对象里面,由垃圾回收器负责回收. 如以下代码: class BirthDate { private int day; private int month; private int year; public Bir

Java:成员变量、局部变量和静态变量

梳理一下: 根据定义变量位置的不同,可以将变量分成两大类:成员变量和局部变量. 成员变量(俗称全局变量):在类里定义的变量.又分为实例变量和类变量(也成为静态变量). 实例变量:不以static修饰,需要先将类实例化,才能通过实例访问,不能通过 类.实例变量 来访问实例变量,也就是只要实例存在,程序就可以访问该实例的实例变量 类变量:以static修饰,只要类存在,程序就可以访问该类的类变量 下面的示例讲述了关于静态内部类以及本类的实例变量和类变量的访问规则: 局部变量:在方法里定义的变量.根据

Java中成员变量、局部变量、局部内部类、局部内部类方法作用域问题。

public class A { String s = "outer class member variable"; //成员变量 public void Method() { //成员方法 final String s1 = "inner class variable"; //局部变量 class InnerClass { //局部内部类 public void innerMethod() { //局部内部类方法 int test = 20; System.out

java当中成员变量和局部变量的区别

1:成员变量定义在类中,整个类中都可以访问.2:局部变量定义在函数,语句,局部代码块中,只在所属的区域有效.3:成员变量存在于堆内存的对象中.4:局部变量存在于栈内存的方法中.5:成员变量随着对象的创建而存在,随着对象的小事而消失.6:局部变量随着所属区域的执行而存在,随着所属区域的结束而释放.7:成员变量都有默认初始化值.8:局部变量没有默认初始化值.

Java中成员变量和局部变量区别

在类中的位置不同 重点 成员变量:类中,方法外 局部变量:方法中或者方法声明上(形式参数) 作用范围不一样 重点 成员变量:类中 局部变量:方法中 初始化值的不同 重点 成员变量:有默认值 局部变量:没有默认值.必须先定义,赋值,最后使用 在内存中的位置不同 了解 成员变量:堆内存 局部变量:栈内存 生命周期不同 了解 成员变量:随着对象的创建而存在,随着对象的消失而消失 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失 原文地址:https://www.cnblogs.com/libi

Java基础 成员变量的继承与覆盖

通过继承可以得到父类的成员变量,子类的成员变量包括从父类继承的成员变量(包括从祖先类中继承的成员变量)以及子类中重新定义的成员变量.本次介绍内容包括:可以继承哪些成员?如果子类和父类出现了相同的成员变量如何处理? 1.可以继承的成员变量 可以继承的成员变量与成员变量的访问控制类型有关,成员变量的访问控制类型包括public.protected.缺省的和private. 子类继承父类之后,可以继承父类的public和protected类型的成员变量.例如: public class Parent{