一道笔试题

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. WebSocket使用SuperWebSocket结合WindowsService实现实时消息

    SuperWebSocket在WebService中的应用 最开始使用是寄托在IIS中,发布之后测试时半个小时就会断开,所以改为WindowsService 1. 新建Windows服务项目[Test ...

  2. HBuilder android 打包指南(V客学院技术分享)

    前提:确保配置文件(manifest.json)已配置完,没有异常. 打包选项如下: Android 包名 :在Android系统中是判断一个App的唯一标识,不同的App可以有同样的名字,但是它的包 ...

  3. CSS 媒体类型

    CSS 媒体类型 媒体类型允许你指定文件将如何在不同媒体呈现.该文件可以以不同的方式显示在屏幕上,在纸张上,或听觉浏览器等等. 一.媒体类型 一些CSS属性只设计了某些媒体.例如"voice ...

  4. JavaScript常用算法

    一.排序算法 1.Array.sort(function)(JavaScript原生排序算法)参数:比较函数(可选)若无参数,则按照首字母的ASCII码排序,比较函数的作用为确定排序 function ...

  5. wix toolset将 cab 打包进msi

    在***wxs中添加配置 <MediaTemplate EmbedCab="yes" /> 下面是一个简单配置:(包含写注册表) <?xml version=&q ...

  6. 第三周JAVA程序设计基础学习总结

    20145322学号 <Java程序设计>第3周学习总结 ## 教材学习内容总结 之前第三章说过Java中主要有基本类型和类类型两种类型系统,第四章主要谈类类型. 类定义时使用class关 ...

  7. Ubuntu16.04安装搜狗拼音输入法(中文输入法)[转]

    本文转载自:https://www.cnblogs.com/darklights/p/7722861.html 虽然网上有很多教程,但是我觉得我的很适合那些真正的小白... 1.下载文件 由于我要给多 ...

  8. Java之JNDI详解

    转载自(http://blog.csdn.net/u010430304/article/details/54601302) JNDI的基本应用         JNDI是Java Naming and ...

  9. 关于Java -cp引用jar是否支持通配符

    其实是支持的: JDK6支持java -cp后面跟通配符'*',试了一下发现还是需要注意: 错误方式(Wrong way): java  -cp /data/apps/lib/*.jar com.ch ...

  10. ipvs+ldirectord实现高可用ipvs

    一.heartbeat准备 1.接上文 2. 安装heartbeat-ldirectord组件包 [root@node1 heartbeat]# -.el6.x86_64.rpm 3.ldirecto ...