一道笔试题

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. python 实现3-2 问候语: 继续使用练习 3-1 中的列表,但不打印每个朋友的姓名,而为每人打印一条消息。每条消息都包含相同的问候语,但抬头为相应朋友的姓名。

    names = ['linda', 'battile', 'emly'] print(names[0].title() + " " + "good moning!&quo ...

  2. 超级强大的vim配置(vimplus)--续集

    An automatic configuration program for vim 安装(github地址:https://github.com/chxuan/vimplus.git, 欢迎star ...

  3. 企业级hbase HA配置

    1 HBase介绍HBase是一个分布式的.面向列的开源数据库,就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类 ...

  4. 20145310 《Java程序设计》第1周学习总结

    20145310 <Java程序设计>第1周学习总结 教材学习内容总结 第一周主要学习教材前两章的知识.第一章主要学习了java的历史,版本的迁移以及一些相关的专有名词之间的联系和下载安装 ...

  5. 起源游戏临时实体(Temp Entity)

    如何查看实体 https://wiki.alliedmods.net/Temp_Entity_Lists_(Source) 这里是部分游戏的临时实体列表 # 还可以通过在游戏内输入来获取游戏的临时实体 ...

  6. Ubuntu 16.04下EasyOpenJTAG+OpenOCD的安装和使用【转】

    本文转载自:http://www.linuxdiyf.com/linux/24086.html Ubuntu 16.04下EasyOpenJTAG+OpenOCD的安装和使用 发布时间:2016-09 ...

  7. XML CDATA是什么?

    XML CDATA是什么? 投稿:mdxy-dxy 字体:[增加 减小] 类型:转载   这篇文章主要为大家介绍下XML CDATA是什么,学习xml的朋友可以参考下     All text in ...

  8. 【Semantic segmentation】Fully Convolutional Networks for Semantic Segmentation 论文解析

    目录 0. 论文链接 1. 概述 2. Adapting classifiers for dense prediction 3. upsampling 3.1 Shift-and-stitch 3.2 ...

  9. String被设计成不可变和不能被继承的原因

    String是所有语言中最常用的一个类.我们知道在Java中,String是不可变的.final的.Java在运行时也保存了一个字符串池(String pool),这使得String成为了一个特别的类 ...

  10. JVM与垃圾回收机制(GC)和类的生命周期

    JVM运行时数据区 GC(垃圾回收机制) 什么是垃圾回收机制: 在系统运行过程中,会产生一些无用的对象,这些对象占据着一定的内存,如果不对这些对象清理回收无用的是对象,可能会导致内存的耗尽,所以垃圾回 ...