一道笔试题

22. 下面代码的运行结果为:()

import java.io.*;
import java.util.*; public class foo{ public static void main (String[] args){ String s; System.out.println("s=" + s); } }

A 代码得到编译,并输出“s=”

B 代码得到编译,并输出“s=null”

C 由于String s没有初始化,代码不能编译通过

D 代码得到编译,但捕获到 NullPointException异常

答案:C

解析:开始以为会输出null什么的,运行后才发现Java中所有定义的基本类型或对象都必须初始化才能输出值。

以上解析错了.

原因是,方法中的局部变量一定要手动初始化,不然编译会报错.

Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The local variable s may not have been initialized

 二. 那么也就是说,全局变量不需要手动初始化,JVM会自动初始化为null或0.

public class Test00001{
static String s;
String x=8;
String y;
/*string类型在代码中属于局部变量,那么局部变量必须赋值,哪怕是null,否则编译通不过的,
* 会提示说此变量未初始化,如果是类的成员变量,则可以不赋值,它会有默认值的。
java为了规避一些运行期间的空指针错误,都会强调局部变量必须赋值,
否则编译器会立即报错,提示用户修改。 */
public static void main (String[] args){ Test00001 t = new Test00001();
System.out.println(t.s);//输出null
System.out.println(t.x);//输出null
System.out.println(x);//报错,没有初始化,或者不是类静态变量
//方法中不能调用类的非静态变量属性??哪怕已经初始化.
System.out.println("s=" + s);//输出null } }

只要能够调用,全局变量(也就是类变量)都有自动的初始化值.    不会产生编译器报错

三.但是又产生一个新问题,很重要,

类的静态方法(函数)中为什么不能调用非静态成员(属性)?
程序最终都将在内存中执行,变量只有在内存中占有一席之地时才能被访问。
类的静态成员(变量和方法)属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问;非静态成员(变量和方法)属于类的对象,所以只有在类的对象产生(创建类的实例)时才会分配内存,然后通过类的对象(实例)去访问。
在一个类的静态成员中去访问其非静态成员之所以会出错是因为在类的非静态成员不存在的时候类的静态成员就已经存在了,访问一个内存中不存在的东西当然会出错:class CA{private:int a; //非静态成员,创建类的实例时分配内存,类的不同实例对应不同的内存区域

yes,上诉就是真正的原因.

所以main方法也是static 类的静态方法,所以他不能直接调用类的非静态属性和方法.   此时,虽然不需要初始化类属性变量,但是因为不能直接调用非静态变量,依然报错.

public class Test04 {
String s;
public static void main(String[] args) {
System.out.println(s);//报错
} }
Unresolved compilation problem:
Cannot make a static reference to the non-static field s

注意这和一开始的局部变量一定要初始化报错,本质不同!

四.那么类中非静态方法可以直接调用非静态变量吗?,可以!

public class Test02 {
String s;
public static void main(String[] args) {
Test02 t = new Test02();
t.test(); //输出null
}
public void test(){
System.out.println(s);
}
}

原因是在 new 实例化一个类的 对象时,会加载这个类的所有属性和方法,将其放到内存中来.

但是,以下又会报错:

public class Test02 {
String s;
public static void main(String[] args) {
Test02 t = new Test02();
t.test();
System.out.println(s);//报错
}
public void test(){
System.out.println(s);
}
}
 Unresolved compilation problem:
Cannot make a static reference to the non-static field s

还是会报 静态方法不能调用非静态变量.

虽然,在静态方法中初始化这个类的对象.

原因暂时不清楚,java ,new一个对象和类静态域,是不是在内存中不是一个地方,  以前看过一个视频,好像是放在

java基础 题和知识点总结, 关于String s是否默认初始化为null......,new一个对象和类静态域,是不是在内存中不是一个地方的更多相关文章

  1. Java基础题:集合、String、性能、线程

    转载自:Java基础题 https://yq.aliyun.com/articles/601786?utm_content=m_1000001149

  2. 【原创】这道Java基础题真的有坑!我也没想到还有续集。

    前情回顾 自从我上次发了<这道Java基础题真的有坑!我求求你,认真思考后再回答.>这篇文章后.我通过这样的一个行文结构: 解析了小马哥出的这道题,让大家明白了这题的坑在哪里,这题背后隐藏 ...

  3. Java基础系列2:深入理解String类

    Java基础系列2:深入理解String类 String是Java中最为常用的数据类型之一,也是面试中比较常被问到的基础知识点,本篇就聊聊Java中的String.主要包括如下的五个内容: Strin ...

  4. java基础(3)--详解String

    java基础(3)--详解String 其实与八大基本数据类型一样,String也是我们日常中使用非常频繁的对象,但知其然更要知其所以然,现在就去阅读源码深入了解一下String类对象,并解决一些我由 ...

  5. 2.7w字!Java基础面试题/知识点总结!(2021 最新版)

    这篇<Java 基础知识总结>是 JavaGuide 上阅读量最高的一篇文章,由于我对其进行了重构完善并且修复了很多小问题,所以,在博客园再同步一下! 文章内容比较多,目录如下: 基础概念 ...

  6. java 基础题 很基础, 很有趣

    都是一些非常非常基础的题,是我最近参加各大IT公司笔试后靠记忆记下来的,经过整理献给与我一样参加各大IT校园招聘的同学们,纯考Java基础功底, 老手们就不用进来了,免得笑话我们这些未出校门的孩纸们, ...

  7. Java基础题

    问题: 1.请对比一下重载和重写的区别. 2.请对比一下接口和抽象类的异同. 3.写出一个单例模式,并说明其优点. 4.用过String.StringBuffer吗,说出他们的异同. 5.什么是值传递 ...

  8. 转载 java基础题(面试必知)

    1.面向对象的特征有哪些方面 1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象包 ...

  9. Java基础之疑难知识点

    问题列表: 1. Java中子类中可以有与父类相同的属性名吗? 2. Java中子类继承了父类的私有属性及方法吗? 3. Java中抽象类到底能不能被实例化? 1. Java中子类中可以有与父类相同的 ...

随机推荐

  1. [原创]css中a标签去掉锚点文本下划线

    我对博客的认识是:记录问题,解决问题,分享知识.如果有轮子,我不需要造轮子. 1.问题解决方式: 设置属性:text-decoration:none; 2.更多属性参数参考 text-decorati ...

  2. Java硬件同步机制Swap指令模拟+记录型信号量模拟

    学校实验存档//.. 以经典的生产者消费者问题作为背景. 进程同步方式接口: package method; /** * P表示通过,V表示释放 */ public interface Method ...

  3. java.lang.NoSuchMethodError: net.sf.cglib.core.Signature

    今天二次开发Dubbo-admin的管理平台,开启tomcat直接报错,错误关键字为“ java.lang.NoSuchMethodError: net.sf.cglib.core.Signature ...

  4. 一道C++练习题,替换一个字符串里所有实例

    做了一道C++练习题,替换一个字符串里面的所有实例. #include <iostream> #include <string> using namespace std; co ...

  5. Spring核心技术AOP案例

    在SpringAOP开发之前,首先要了解一下这几个概念.Target:目标,通俗的说对哪个类做增强,那个类就是目标.JoinPoint:连接点,在实际开发中可以被增强的点.PointCut:切入点,在 ...

  6. python文件打开的几种访问模式

    文件打开的几种访问模式 访问模式 说明 r 以只读方式打开文件.文件的指针将会放在文件的开头.这是默认模式. w 打开一个文件只用于写入.如果该文件已存在则将其覆盖.如果该文件不存在,创建新文件. a ...

  7. jQuery使用ajaxSubmit()提交表单(在不希望页面跳转的情况下)

    原文:http://www.jb51.net/article/48728.htm ajaxSubmit(obj)方法是jQuery的一个插件jquery.form.js里面的方法,所以使用此方法需要先 ...

  8. C语言一些总结

    预处理#include<stdio.h>:头文件. stdio.h 标准输入输出. string.h 字符串预处理,. int main()主函数,返回的是int整型, return 0; ...

  9. 关于java 线程池 ThreadPoolExceutor 之 TestDemo

    public class App { public static void main(String[] args) throws InterruptedException { System.out.p ...

  10. keepalived与nginx安装

    目的: 当用户请求访问时,会通过nginx来访问web服务应用,因此我们必须要保证nginx的高可用,要保证nginx的高可用,我们需要通过keepalived来监控nginx,并对外提供1个虚拟的v ...