精华内容
下载资源
问答
  • 详解Java中静态方法

    万次阅读 多人点赞 2019-05-20 17:01:40
    定义: 在类使用static修饰的静态方法会随着类的定义而被分配和装载入内存;而非静态方法属于对象的具体实例,只有在类的对象创建时在对象的内存才有这个方法的代码段。 注意: 非静态方法既可以访问静态数据...

    定义: 在类中使用static修饰的静态方法会随着类的定义而被分配和装载入内存中;而非静态方法属于对象的具体实例,只有在类的对象创建时在对象的内存中才有这个方法的代码段。

    注意: 非静态方法既可以访问静态数据成员 又可以访问非静态数据成员,而静态方法只能访问静态数据成员;
    非静态方法既可以访问静态方法又可以访问非静态方法,而静态方法只能访问静态数据方法。

    原因: 因为静态方法和静态数据成员会随着类的定义而被分配和装载入内存中,而非静态方法和非静态数据成员只有在类的对象创建时在对象的内存中才有这个方法的代码段。

    引用静态方法时,可以用类名.方法名或者对象名.方法名的形式。
    对以上描述进行验证的代码示例:

    import java.util.*;
    
    public class TestStatic {
        public static void main(String[]args){
            System.out.println(S.getStatic());//使用类名加前缀访问静态方法
            S s=new S();
            System.out.println(s.getStatic());//使用实例化对象名访问静态方法
            System.out.println(s.get());
        }
        public static class S
        {
            private static int a;
            private int t=0;
    
            //静态初始器:由static和{}组成,只在类装载的时候(第一次使用类的时候)执行一次,往往用来初始化静态变量。
            static{
                a=10;
            }
    
            //静态方法只能访问静态数据成员
            public static int getStatic()
            {
                return a;
            }
    
            public int getT()
            {
                return t;
            }
    
            //非静态方法可以访问静态方法和非静态方法
            public int get()
            {
                getT();
                getStatic();
                t=a;//非静态方法可以访问非静态数据成员和静态数据成员
                return t;
            }
        }
    }
    

    总结:
    (1)static修饰的静态方法会随着类的定义而被分配和装载入内存中,编译器只为整个类创建了一个静态变量的副本,也就是只分配一个内存空间,虽然可能有多个实例,但这些实例共享该内存,特别值得注意的是,任何一个对象对静态数据成员的修改,都会影响其它对象。
    (2)静态不能引用非静态这一特性,是由于静态的会随着类的定义而被分配和装载入内存中这一关键点决定的;如果静态引用了非静态的,根本无法从内存中找到非静态的代码段,势必会出错,这种做法是Java虚拟机决不允许的。

    展开全文
  • java中静态方法,非静态方法和构造方法的执行顺序问题一直是面试总会遇到的一个问题,很多初级程序员都会在这个上面出现问题,也包括博主我,所以今天我将自己亲历写出来,让大家看一看,结果显而易见。 /** * @...

    java中静态方法,非静态方法和构造方法的执行顺序问题一直是面试总会遇到的一个问题,很多初级程序员都会在这个上面出现问题,也包括博主我,所以今天我将自己亲历写出来,让大家看一看,结果显而易见。

    /**
     * @author 文先生
     * @date 2019/05/15
     * QQ 1452561187
     * 项目:springboot-shiro-demo1.0.1
     * 包:com.example.springboot
     **/
    public class A {
        static {
            System.out.println("输出静态方法===A");
        }
    
        public A() {
            System.out.println("输出构造方法===A");
        }
    
        {
            System.out.println("输出非静态方法===A");
        }
    }
    /**
     * @author 文先生
     * @date 2019/05/15
     * QQ 1452561187
     * 项目:springboot-shiro-demo1.0.1
     * 包:com.example.springboot
     **/
    public class B extends A {
        static {
            System.out.println("输出静态方法===B");
        }
    
        public B() {
            System.out.println("输出构造方法===B");
        }
    
        {
            System.out.println("输出非静态方法===B");
        }
    }
    /**
     * @author 文先生
     * @date 2019/05/15
     * QQ 1452561187
     * 项目:springboot-shiro-demo1.0.1
     * 包:com.example.springboot
     **/
    public class C {
        public static void main(String[] args) {
            B b = new B();
        }
    }

    这时我们来看一看控制台

    输出的顺序为:

    输出静态方法===A
    输出静态方法===B
    输出非静态方法===A
    输出构造方法===A
    输出非静态方法===B
    输出构造方法===B

    所以我们很明显得出,实例对象时先输出父类静态方法,在输出子类静态方法,在输出父类非静态方法和构造方法,随之又输出子类非静态方法和构造方法。

    展开全文
  • Java中静态方法不能使用this

    千次阅读 2020-06-25 12:26:22
    Java中静态方法不能使用this 在static方法内部不能调用非静态方法,如果要调用对象的非静态方法,需要在静态方法中传入对象的引用,例子如下: class Test2{ public void method1(){ this.method2(); } public...

    Java中静态方法不能使用this

    • 在static方法内部不能调用非静态方法,如果要调用对象的非静态方法,需要在静态方法中传入对象的引用,例子如下:

      class Test2{
      	public void method1(){
      		this.method2();
      	}
      	public void method2(){
      		System.out.println("HelloWorld2");
      	}
      
      }
       
      public class Test{
      	public void method0(){
      		System.out.println("HelloWorld0");
      	}
      	public static void method1(){
      		System.out.println("HelloWorld1");
      	}
      	
      	public static void main(String args[]){	
          	//this.method0();  该条代码报错
      		new test().method0(); 
      		method1(); 
      		new Test2().method1(); 
      	}	
      }
      
      • 那么问题来了,听说this代表的也是对象的引用,那为什么this.method0()会报错?

        因为this代表的是对象的引用,再直白讲,它引用的是类的当前实例,记住,它只是引用实例,并不能创建类的实例。那么this.method0()现在有没有Test的实例?没有,所以,现在this引用的是一个内存中不存在的东西,当然报错了。

      • 那为什么Test2中的为什么可以使用this呢?我看它好像也没有对象的引用啊?

        这是一个先有鸡再蛋的故事。我想用Test 2的method1()方法,怎么用?直接用Test2.method1()行不行?不行,它不是静态方法。所以,肯定是需要新建一个对象,然后通过对象才能用method1()方法吧。所以,new Test2().method1()这里的new Test2()其实已经是新建了一个实例,这个实例能被它的那个this引用到。

    • 所以,通过上面的例子后,你大概能明白为什么this不存在于静态方法中了吗?

      • 那就是静态方法属于的类的方法,不需要实例化,直接通过类名调用。所以调用的静态方法的时候,你都不传实例给this,肯定报错啊。
      • 这个原理和静态方法中不能调用非静态方法类似。静态方法属于类的,它也叫类方法;非静态方法属于对象的。你调用静态方法的时候也没传入对象,肯定也报错。
    • 记住一点,你写代码是一回事,cpu执行你的代码又是一回事。cpu执行你的代码是从main进入,一步一步执行到。所以,你要从计算机的角度来看问题。就好比如Test2类中的this.method2(),从我们的角度来看,this没有引用实例。但从计算机的角度而言,执行了new Test2().method1(),传入了实例给method1(),this引用了实例

    展开全文
  • java中静态方法中调用非静态方法

    万次阅读 2019-04-18 00:26:40
    java初学者经常会遇到的...即在静态方法中不能引用非静态变量 为什么? 因为我们知道静态方法可以在没有创建实例时使用,而申明为非静态的成员变量是一个对象属性,它只有在对象存在时引用,因此如果在对象未创建实...

    java初学者经常会遇到的问题:无法从静态上下文中引用非静态变量 

    ?non-static variable mainframe cannot be referenced from a static context 
    即在静态方法中不能引用非静态变量 
    为什么? 

    因为我们知道静态的方法可以在没有创建实例时使用,而申明为非静态的成员变量是一个对象属性,它只有在对象存在时引用,因此如果在对象未创建实例时我们在静态方法中调用了非静态成员方法自然是非法的,所以编译器会在这种时候给各错误. 

    简单说来,静态方法可以不用创建对象就调用,非静态方法必须有了对象的实例才能调用.因此想在静态方法中引用非静态方法是不可能的,因为它究竟引用的是哪个对象的非静态方法呢?编译器不可能给出答案,因为没有对象啊,所以要报错. 


    class HelloWorld 

    int a1 = 6; 

    public static void main(String[] args) 

      
       System.out.print(a1); 




    编译时报如下错: 

    HelloWorld.java:7: 无法从静态上下文中引用非静态 变量 a1 
                    System.out.print(a1); 
                                     ^ 
    1 错误 
    解决办法有两种,这是两种不同的思维方式,但结果却是一样的,殊途同归的道理: 

    第一种:既然我们无法在静态上下文中引用非静态变量/方法,那么我们就顺着思路想,是不是在静态上下文中引用静态变量/方法就可以了(YES); 
    class HelloWorld 

    static int a1 = 6; 

    public static void main(String[] args) 

       System.out.print(abc.a1); 



    第二种:一开始我们提到了,静态方法/变量可以在未创建实例时使用,而非静态成员变量/方法只能在创建了实例之后才可以使用; 

    因为非静态的变量a1没有实例化,改为如下程序 

    class HelloWorld 

    int a1 = 6; 

    public static void main(String[] args) 

       HelloWorld abc=new HelloWorld(); 
       System.out.print(abc.a1); 





    编译通过。

    展开全文
  • JAVA中静态方法和非静态方法的区别

    千次阅读 多人点赞 2019-02-25 16:17:18
    静态成员变量一样,属于类本身,在类装载的时候被装载到内存,不自动进行销毁,会一直存在内存,直到JVM关闭; 非静态方法(non-static method) 又称实例化方法,属于实例对象,实例化之后才会分配内存,...
  • Java学习笔记之静态方法(类方法),非静态方法(成员方法),静态变量(类变量),非静态变量(成员变量)之间的关系 首先明白这几个名词的意思: 静态方法:即类方法,在类之,以static关键字申明的方法。 ...
  • Java中静态方法与非静态方法的区别

    千次阅读 2017-10-21 23:44:49
    (1)静态方法中只能调用静态成员或者静态方法,不能直接调用非静态成员或方法,如果需要调用,则需要先实例化; (2)静态方法是在类使用staitc修饰的方法,在类定义的时候已经被装载和分配。而非静态方法
  • 2、非静态方法可以访问类的任何成员,静态方法只能访问类静态成员; 3、因为静态方法在类实例化前就可以使用,而类的非静态变量必须在实例化之后才能分配内存; 4、static内部只能出现static变量和其他...
  • 转载 静态方法和实例方法的区别主要体现...静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制。 下面几个例子展示了这一区别。
  • 静态方法中不能调用非静态方法,那么在静态方法中通过实例化一个非静态的对象, 来实现对非静态方法的调用应该怎么理解 public class test1{ public static void main(string []args){//静态方法 test2 t=new test...
  • 静态方法只能调用静态方法(或者变量),非静态方法可以调用静态方法(或者变量)类的静态成员(变量和方法)属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问(类名.方法|类名.变量);非静态成员...
  • 如果静态方法能调用动态方法的话,那如果别人通过类名调用静态方法时实例对象可能并不存在,但是方法内又调用了对象的方法,由于对象不存在,所以动态方法也不存在,程序肯定报错,所以java直接在编译阶段检查这种...
  • java中静态方法调用非静态方法

    千次阅读 2019-01-25 09:11:35
    我们都知道,静态static方法中不能调用非静态non-static方法,准确地说是不能直接调用non-static方法。但是可以通过将一个对象的引用传入static方法中,再去调用该对象的non-static方法。  其实这个事实的应用很...
  • java中静态方法和非静态方法的区别

    千次阅读 2017-06-24 11:35:56
    在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。静态方法在访问本类的成员时,只允许访问静态成员...
  • java中静态方法为什么不可以调用非静态方法

    千次阅读 多人点赞 2018-12-07 20:51:49
    它存储于一块固定的内存区域(静态区),所以,可以直接被类名调用。 它优先于对象存在,所以,可以被所有对象共享。     static可以用来修饰的成员变量和成员方法,被修饰的成员是属于类的,而不是单单是属 于...
  • 对于java中静态方法,非静态方法和构造方法的理解: 静态方法是随着的java中虚拟机的类的加载而加载,是跟随绑定在一起的。 public class Main{ static{ System.out.println("输出静态方法"); }  public Main()...
  • java中静态方法和实例方法的区别

    千次阅读 2019-05-10 11:09:52
    1.在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建...静态方法是在类使用staitc修饰的方法,在类定义...
  • public class Circle { private double radius = 1.0; double getAre() { return radius * radius * Math.PI;... //radius不是静态的,静态方法可以通过类对象调用非静态成员变量、非静态方法 } }
  • Java中静态方法不能引用非静态变量

    千次阅读 2017-09-21 17:30:08
    静态方法静态变量都是属于类的,不需要初始化对象即可引用,而非静态方法或者变量都是要用类的对象来引用,当我们在一个静态方法,比如Java中的main函数应用某个非静态变量,就会出现错误。  此时有两种方法...
  • 一直不能理解java 这三者的执行顺序。
  • 在类还有一个叫做静态代码块和构造代码块(即没有静态修饰的只被{}的代码),创建对象的时候会默认先加载静态代码块和构造代码块,这里的print会被打印出来,然后加载构造方法,而本类静态方法只是在调用的...
  • 在Parent我们提供两个方法,一个是静态方法staticMethod(),一个是非静态方法nonStaticMethod()。在Child类我们覆盖着两个方法java 代码 class Parent{   public void nonStaticMethod() {
  • Java中多个线程同时访问一个静态方法是否存在线程安全问题? 比如以下代码,两个线程同时对方法中b修改不同的值,会有线程安全问题吗? new Thread(new Runnable() { @Override public void run() { ...
  • java中静态方法不能被重写(覆盖)

    千次阅读 多人点赞 2018-01-23 18:51:28
    如果父类含有一个静态方法,且在子类也含有一个返回类型、方法名、参数列表均与之相同的静态方法,那么该子类实际上只是将父类的该同名方法进行了隐藏,而非重写。换句话说,父类和子类含有的其实是两个没有...
  • 最近在学java,遇到如题所示问题
  • java中 静态方法和非静态方法的调用

    千次阅读 2013-09-10 21:03:37
    如果是这个类内调用自己的方法,直接写方法名传入参数就可以  ...public void say(String word){// 非静态方法,需要new 一个对象后,使用new 出来的对象调用, System.out.println(word); } public st
  • java中静态方法和非静态方法的存储

    千次阅读 2015-03-31 13:56:08
    将某 class 产生出一个 instance 之后,此 class ...答案是不会,我们用field表示字段,用method表示方法,那么加上static区分后就 有四种: class field:有用static修饰的field class method:有用static修饰的me

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,140,084
精华内容 456,033
关键字:

java中静态方法

java 订阅