首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从静态函数引用非静态字段,反之亦然是不可能的吗?

这个问题的答案是:从静态函数引用非静态字段,反之亦然是不可能的。

在静态函数中,所有的变量都是静态的,这意味着它们必须在声明时或者在静态初始化块中初始化。因此,从静态函数中引用非静态字段是不可能的,因为非静态字段必须在非静态函数中初始化。

另一方面,从非静态函数中引用静态字段也是不可能的,因为静态字段只能在静态函数中初始化。如果尝试从非静态函数中引用静态字段,编译器将抛出错误,因为非静态函数不能访问静态字段。

因此,从静态函数引用非静态字段,反之亦然是不可能的。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

子类A继承父类B, A a = new A(); 则父类B构造函数、父类B静态代码块、父类B静态代码块、子类A构造函数、子类A静态代码块、子类A静态代码块 执行先后顺序

(1)子类A继承父类B, A a = new A(); 则: 父类B静态代码块->子类A静态代码块->父类B静态代码块->父类B构造函数->子类A静态代码块->子类A构造函数 (2)若子类构造函数中显式调用了父类某构造函数...,则调用该构造函数 class C { C() { System.out.print("C"); } } class A { C c = new C();...执行父类带参构造前要先对父类中对象进行初始化,对父类中c成员进行初始化,调用了C类无参构造,所以调用顺序为: 先调用C类无参构造 再调用A类带参构造 最后调用调用子类构造 (3...)在JVM调用mian方法之前先用进行静态内容初始化。...顺序为:父类静态变量, 父类静态代码块 ,子类静态变量,子类静态代码块。

2.1K30

你真的了解 Java 8 中 lambda 表达式、方法引用函数式接口、默认方式、静态方法

1s -> s.length() 在第二个测试中,我们使用静态方法引用来获取每个字符串长度。 1String::length 在第三个测试中,我们使用实例方法引用。...总结 ① 使用方法 1类名::方法名 ② 方法可以是:静态方法,实例方法 构造函数引用 在上面我们讲了方法引用基本使用方法,其实除了方法引用以外,还有构造函数引用,回想一下,以前我们创建对象是怎么做...② 第二个我们使用构造函数引用创建对象 ClassMate::new 。...③ 我们发现构造函数引用:类名::new ,然后对于使用哪一个构造函数由上下文决定,比如有一个参数和两个参数和无参数构造函数,会自动确定用哪一个。...函数式接口 什么函数式接口呢? 这个名词在 Java 中以前很少听到,但是正是有了 Java 8 横空出世,函数式编程也变得熟悉了。

1.2K20
  • 编程思想 之「多态、初始化顺序、协变返回类型」

    我们把对某个对象引用视为其基类型引用做法,称之为向上转型;把对某个对象引用视为其导出类型引用做法,称之为向下转型。...之所以如此称呼,是因为我们习惯性在类继承体系中把基类放在最上面,而把导出类放在下面,因此导出类到基类过程一个向上看过程,反之亦然。 ?...此外,只有普通方法调用是多态,如果某个方法静态,它行为就是不具有多态性。静态方法与类,而不是与单个对象相关联。任何域访问操作都是由编译器继解析,因此域也不是多态。...以基类1 -> 基类2 -> 导出类继承结构为例,初始化顺序大致如下: 基类1开始,先进行静态初始化,然后依次向外扩散至基类2和导出类; 然后,依次进行基类1静态初始化和构造器初始化; 再依次进行基类...现在,我们已经知道了对象初始化顺序,与之相反,则是对象销毁顺序。由于字段初始化顺序按照声明顺序进行,因此对于字段,销毁顺序意味着与声明顺序相反。

    47420

    C#面试题

    2、继承:值类型不可能派生出新类型,所有的值类型均隐式派生自 System.ValueType。但与引用类型相同,结构也可以实现接口。...静态成员和静态成员区别? 静态变量使用 static 修饰符进行声明,静态成员在加类时候就被加载(上一篇中提到过,静态字段随类型对象存放在Load Heap上),通过类进行访问。...不带有static 修饰符声明变量称做静态变量,在对象被实例化时创建,通过对象进行访问 。 一个类所有实例同一静态变量都是同一个值,同一个类不同实例同一静态变量可以是不同值 。...静态函数实现里不能使用静态成员,如静态变量、静态函数等。 4. 特性是什么?如何使用? 特性与属性完全不相同两个概念,只是在名称上比较相近。...比如: 不正确使用静态字段,导致大量数据无法被GC释放; 没有正确执行Dispose(),托管资源没有得到释放; 不正确使用终结器Finalize(),导致无法正常释放资源; 其他不正确引用,导致大量托管对象无法被

    77820

    编程思想 之「多态、初始化顺序、协变返回类型」

    我们把对某个对象引用视为其基类型引用做法,称之为向上转型;把对某个对象引用视为其导出类型引用做法,称之为向下转型。...之所以如此称呼,是因为我们习惯性在类继承体系中把基类放在最上面,而把导出类放在下面,因此导出类到基类过程一个向上看过程,反之亦然。...此外,只有普通方法调用是多态,如果某个方法静态,它行为就是不具有多态性。静态方法与类,而不是与单个对象相关联。任何域访问操作都是由编译器继解析,因此域也不是多态。...以基类1 -> 基类2 -> 导出类继承结构为例,初始化顺序大致如下: 基类1开始,先进行静态初始化,然后依次向外扩散至基类2和导出类; 然后,依次进行基类1静态初始化和构造器初始化; 再依次进行基类...现在,我们已经知道了对象初始化顺序,与之相反,则是对象销毁顺序。由于字段初始化顺序按照声明顺序进行,因此对于字段,销毁顺序意味着与声明顺序相反。

    1.3K40

    .NET面试题系列 - C# 基础知识(1)

    如果类型对象已经存在,则不会再次调用静态构造函数。 调用类型实例初始化器,初始化类型静态成员。 例如下面的代码中,C#首先将a初始化为5,然后再修改成10。...1.6 类和结构主要区别?结构对象可能分配在堆上?何时考虑使用结构体? 类和结构C#两个最主要研究对象: 结构值类型,它继承自System.ValueType,而类引用类型。...1.6.2 实例构造函数(类型) 类型实例构造函数不能被继承。它负责将类型实例字段初始化。对于静态字段,由静态构造函数负责。 如果类型没有定义任何构造函数,则编译器将定义一个没有参数构造函数。...在程序中,用户无法控制何时执行静态构造函数静态构造函数不应该调用基类型静态构造函数。这是因为类型不可能静态字段基类型分享或继承。...这是因为静态构造函数只负责初始化静态成员,只负责维护类型对象,它和类型实例对象没有关系,所以你加入任何参数(你试图为静态字段或属性赋值?这是不可能,因为根本就没有实例)都是没有意义

    1.9K20

    C# .NET面试系列二:面向对象

    执行顺序:父类静态构造函数,子类静态构造函数,父类静态字段初始化,子类静态字段初始化,父类实例构造函数,父类静态字段初始化,子类实例构造函数,子类静态字段初始化,方法调用父类静态构造函数...父类实例构造函数:如果创建了父类实例,执行父类实例构造函数。实例构造函数用于初始化实例成员,每次创建实例时都会执行。父类静态字段初始化:执行父类静态字段初始化。...子类静态字段初始化:执行子类静态字段初始化。静态字段按照声明顺序初始化。方法调用:最后,可以调用类中方法。方法在实例被创建后才能被调用。...静态成员包括静态字段静态方法等,属于类实例,需要通过实例访问。理解静态变量和静态成员重要性在于它们提供了在类级别上共享数据和行为机制,而不必依赖于类实例。14. 属性能在接口中声明?...重载和重写分别应用于不同场景,取决于你解决问题在类内提供多个版本方法(重载)还是在继承体系中提供对基类虚方法新实现(重写)。17. 静态方法可以访问静态变量?如果不可以为什么?

    22910

    JNI开发中,你需要知道一些建议

    GetFieldId获得字段ID 使用对应方法(例如GetIntField)获取字段下面的值 类似地,要调用一个方法,使用者首先得获得一个类对象引用,然后方法ID(method ID)。...传入NewStringUTF函数数据必须变形UTF-8格式。一种常见错误情况文件或者网络流中读取出字符数据,没有过滤直接使用NewStringUTF处理。...设置到一个实例字段(instance field)反之亦然,或者使用一个类jfieldID却来自另一个类实例。...jmethodIDs:当调用Call*Method函数时时使用了类型错误jmethodID:不正确返回值,静态/静态不匹配,this类型错误(对于静态调用)或者错误类(对于静态类调用)。...使用GetObjectRefType获得引用类型 在Android 4.0 (Ice Cream Sandwich)之前,使用直接指针(见上面)后果就是正确地实现GetObjectRefType不可能

    1.4K30

    类加载过程中几个重点执行顺序整理

    如果有,就直接使用;如果没有,则把相关类.class加载到方法区 2、 在.class加载到方法区时,会分为两部分加载:先加载静态内容,再加载静态内容 3、 加载静态内容:把.class中所有静态内容加载到方法区下静态区域内...实例初始化过程: 1、在堆内存中开辟一块空间 2、 给开辟空间分配一个地址 3、 把对象所有静态成员加载到所开辟空间下 4、 所有的静态成员加载完成之后,对所有静态成员变量进行默认初始化 5...、 所有静态成员变量默认初始化完成之后,调用构造函数 6, 在构造函数入栈执行时,分为两部分:先执行构造函数隐式三步,再执行构造函数中书写代码     6.1、隐式三步:         1,执行...super语句         2,对开辟空间下所有静态成员变量进行显式初始化         3,执行构造代码块     6.2、在隐式三步执行完之后,执行构造函数中书写代码 7,在整个构造函数执行完并弹栈后...异常 字段解析 对字段解析需要首先对其所属类进行解析,因为字段属于类,只有在正确解析得到其类正确直接引用才能继续对字段解析。

    1.4K20

    【C++从小白到大牛】类和对象

    C++中通过引入this指针解决该问题,即:C++编译器给每个“静态成员函数“增加了一个隐藏指针参数,让该指针指向当前对象(函数运行时调用该函数对象),在函数体中所有“成员变量”操作,都是通过该指针去访问...面试题: 1、this指针存在哪里,存在对象里面的 首先明确this指针不可能存在对象里面,我们上文讲过计算对象大小时,没有计算this指针大小,所以反向思维this指针不存在对象里。...类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问 4. 静态成员函数没有隐藏this指针,不能访问任何静态成员 5....问题: 1、静态成员函数能调用静态成员函数? 答:不可以,因为静态成员函数没有this指针,同样也不能访问静态成员变量 2、静态成员函数能调用静态成员函数?...这里引用是将临时变量引用给了r,具有常性,所以要加上const;而赋值将临时变量直接赋值给d,不需要加上const!

    7810

    你知道一个空类里面有什么

    其次,注意到类node中包含引用成员name,以及静态const型成员age,他们之中任一个,都会导致系统拒绝生成默认赋值操作符函数。...就是s1别名),那么 x1 = x2 会让 x1.name 指向 s2 ?...C++基本语法得知这不可能!因为引用一旦指定了关联目标就再也不能修改。那么, x1 = x2 会让 x1.name指向s1值变为"bb"?...这么一来,那其他跟x1无关但使用了字符串s1对象岂不是要平白无故地遭受牵连? 以上分析,针对类静态const型成员age而言,一模一样,因为age也不应该通过类对象赋值操作而发生改变。...总而言之,以下情形发生时系统将拒绝生成默认赋值操作函数: 类中含有引用成员 类中含有静态const型成员 类继承自含有private赋值操作符函数基类 诡异,即便在上述条件下,系统依然会赞同生成默认拷贝构造函数

    89420

    .NET面试题解析(05)-常量、字段、属性、特性与委托

    字段与属性有什么异同? 4. 静态成员和静态成员区别? 5. 自动属性有什么风险? 6. 特性是什么?如何使用? 7. 下面的代码输出什么结果?为什么?...这个其实也很好解决,在默认构造函数后加一个“:this()”就OK了,或者显示在构造函数里初始化字段。...;  委托本质——一个类 .NET中没有函数指针,方法也不可能传递,委托之所可以像一个普通引用类型一样传递,那是因为她本质上就是一个类。...静态成员和静态成员区别? 静态变量使用 static 修饰符进行声明,静态成员在加类时候就被加载(上一篇中提到过,静态字段随类型对象存放在Load Heap上),通过类进行访问。...静态函数实现里不能使用静态成员,如静态变量、静态函数等。 5. 自动属性有什么风险? 因为自动属性私有字段由编译器命名,后期不宜随意修改,比如在序列化中会导致字段值丢失。 6.

    83510

    .NET面试题解析(05)-常量、字段、属性、特性与委托

    字段与属性有什么异同? 4. 静态成员和静态成员区别? 5. 自动属性有什么风险? 6. 特性是什么?如何使用? 7. 下面的代码输出什么结果?为什么?...这个其实也很好解决,在默认构造函数后加一个“:this()”就OK了,或者显示在构造函数里初始化字段。...委托本质——一个类 .NET中没有函数指针,方法也不可能传递,委托之所可以像一个普通引用类型一样传递,那是因为她本质上就是一个类。...静态成员和静态成员区别? 静态变量使用 static 修饰符进行声明,静态成员在加类时候就被加载(上一篇中提到过,静态字段随类型对象存放在Load Heap上),通过类进行访问。...静态函数实现里不能使用静态成员,如静态变量、静态函数等。 5. 自动属性有什么风险? 因为自动属性私有字段由编译器命名,后期不宜随意修改,比如在序列化中会导致字段值丢失。 6.

    1K20

    面试官:说一下类加载过程

    解析 「将类,接口,字段和方法符号引用(在常量池中)转为直接引用」符号引用:用一组符号来描述所引用目标 直接引用;直接指向指向目标的指针 加入我写了一个如下类 public class Student...字节码角度分析一波 「方法」 ? 字节码可以看到方法主要逻辑为 调用父类方法 静态成员变量赋值 执行构造代码块 执行构造函数 ?...字节码可以看到方法主要逻辑为 执行静态变量赋值语句 执行静态代码块中语句 需要注意一点,「Java虚拟机会保证子类方法执行前,父类方法已经执行完毕...构造函数 「有继承情况执行顺序」 父类静态静态代码块,静态成员变量),子类静态静态代码块,静态成员变量)(只会执行一次哈) 父类静态(构造代码块,静态成员变量),父类构造函数 子类静态...(构造代码块,静态成员变量),子类构造函数 卸载 垃圾收集不仅发生在堆中,方法区上也会发生。

    43230

    Java 类一生

    那必不可能,其实这个符号表编译原理层面的内容,还是需要了解一下编译原理这块内容才行,不过我之前也说过,关于编译原理这块自己真的一概不知。...必须,如果类或接口中没有静态变量或方法,编译器会省略生成()方法这步操作 () 方法在多线程环境会被正确同步 4....解析 解析阶段将类符号引用替换为直接引用 符号引用(Symbolic References):还记得之前文章中提到 Class 文件中存内容,还记得那些表?这个符号引用就是那时索引。...读取或设置一个类型静态字段(被final修饰、已在编译期把结果放入常量池静态字段除外)时候 调动类静态方法 对类型使用反射调用。...当使用JDK 7新加入动态语言支持时,执行句柄为静态字段或方法,或构造函数时需要对目标进行初始化(此处需了解 JDK 7 新增动态语言支持,后续有机会会对此出内容单独整理文章说明,欢迎关注)。

    34310

    C#要点

    静态变量静态变量所属类初次使用时被初始化,当静态字段被初始化后,之后每次调用获得值都是初始化时赋给静态字段值,除非在这个过程中显示地给静态字段赋值。...2)静态类不能包含实例构造函数,但仍可声明静态构造函数以分配初始值或设置某个静态状态。 3)静态方法和属性只能访问静态字段静态事件。...l 在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。 l 无法直接调用静态构造函数。 l 在程序中,用户无法控制何时执行静态构造函数。...l 静态构造函数典型用途:当类使用日志文件时,将使用这种构造函数向日志文件中写入项。 l 静态构造函数在为托管代码创建包装类时也很有用,此时该构造函数可以调用 LoadLibrary 方法。...3.9 可访问性 嵌套类型:不嵌套在其他类型中顶级类型可访问性只能 internal 或 public。 这些类型默认可访问性 internal。

    1.1K50

    夯实Java基础系列18:深入理解Java内部类及其实现原理

    , 参数类型外部类类型, 在构造方法内部使用这个参数为1中添加成员变量赋值;   3 在调用内部类构造函数初始化内部类对象时, 会默认传入外部类引用。...让他成为主类实例一部分 然后又想在内部类声明和实例无关静态东西 你让JVM情何以堪啊 4 若想在内部类内声明静态字段 就必须将其内部类本身声明为静态 静态内部类有一个很大优点:可以自由使用外部类所有变量和方法...3 对于静态内部类不能出现静态模块(包含静态块,静态属性,静态方法等) 4 静态使用需要依赖于外部类对象,详见上述对象innerClass 初始化。...总结一下Java类代码加载顺序,万变不离其宗。 规律一、初始化构造时,先父后子;只有在父类所有都构造完后子类才被初始化规律二、类加载先是静态、后静态、最后构造函数。...,进行替换,将无法确定值放到了内部类常量池中,并在构造函数中将其常量池取出到字段中。

    1.2K10

    夯实Java基础系列18:深入理解Java内部类及其实现原理

    , 参数类型外部类类型, 在构造方法内部使用这个参数为1中添加成员变量赋值; 3 在调用内部类构造函数初始化内部类对象时, 会默认传入外部类引用。...让他成为主类实例一部分 然后又想在内部类声明和实例无关静态东西 你让JVM情何以堪啊 4 若想在内部类内声明静态字段 就必须将其内部类本身声明为静态 静态内部类有一个很大优点:可以自由使用外部类所有变量和方法...3 对于静态内部类不能出现静态模块(包含静态块,静态属性,静态方法等) 4 静态使用需要依赖于外部类对象,详见上述对象innerClass 初始化。...总结一下Java类代码加载顺序,万变不离其宗。 规律一、初始化构造时,先父后子;只有在父类所有都构造完后子类才被初始化 规律二、类加载先是静态、后静态、最后构造函数。...可以看到,java将编译时已经确定值直接复制,进行替换,将无法确定值放到了内部类常量池中,并在构造函数中将其常量池取出到字段中。

    41810

    Java面试之关键字

    java技术允许使用finalize()方法在垃圾收集器将对象内存中清除出去之前做必要清理工作。这个方法由垃圾收集器在确定这个对象没有被引用时对这个对象调用。...,而不需要创建对象就可以访问 void:表示该方法没有返回值 main:主方法,程序开始 (String[] args):参数,传递进来一个字符串数组参数 sizeof Java 关键字 不是...但静态内部类需要持有对外部类引用静态内部类能够访问外部类静态静态成员。静态类不能访问外部类静态成员。他只能访问外部类静态成员。...因此main方法作为程序入口方法,在这之前不可能有任何对象被建立,也就是在main之前包括main自身不可能是非静态方法。...所以main方法一定是静态,有类就可以得到执行,进而有更多静态方法或者静态方法得到执行 是否可以从一个静态(static)方法内部发出对静态(non-static)方法调用 不可以,静态函数中不能访问静态成员变量

    642100

    Java虚拟机基础——3类加载机制

    如:通过子类引用父类静态字段,不会导致子类初始化;通过数组定义来引用类,不会触发此类初始化;引用静态扁郎不会触发定义常量类初始化,因为常量在编译阶段已经被放入到常量池中了。...1.3、加载静态内容:把.class中所有静态内容加载到方法区下静态区域内 1.4、加载静态内容: 1.4.1、把.class中静态内容加载到方法区下静态区域内 1.4.2、静态内容加载完成之后...2、对象创建过程 2.1、在堆内存中开辟一块空间 2.2、给开辟空间分配一个地址 2.3、把对象所有静态成员加载到所开辟空间下 2.4、所有静态成员变量默认初始化完成之后,调用构造函数 2.5...、所有静态变量默认初始化完成之后,调用构造函数 2.6、在构造函数入栈时,分为两部分:先执行构造函数隐式三式,再执行构造函数中书写代码 2.6.1、隐式三步 2.6.1、执行super语句...2.6.2、对开辟空间下所有静态成员变量进行显式初始化 2.6.3、执行构造代码块 2.6.2、在隐式三步执行完之后,执行构造函数中书写代码 2.7、在整个构造函数执行完并弹栈后,把空间分配地址赋值给一个引用对象

    56350
    领券