System.in.read()问题

2023-11-17

来源:http://zhidao.baidu.com/question/74164319

 

Q:

System.in.read()中in是一个字段即静态常量(JAVA帮助文档中:public static final InputStream in),那么
问题一:in可以使用InputStream中的所有方法么?如果可以就是说静态常量可以引用该类的所有方法。但是我调试的时候静态常量只能引用该类的静态方法。
例如:
class A{
     public static  void test(){
     System.out.println("HA HA");
     }
}
class B{
     public static A printTest;
}

class Run
{
     public static void main(String[] args)
     {
           B.printTest.test();
     }
}

把class A中test方法的static去掉或者改为别的就会出错。

问题二:在InputStream中read()方法在JAVA帮助文档中是这样的:abstract int read()   抽象方法不是没有方法体么?那么是如何执行输入功能的?

A:
楼主听我来为你分析一下:
in在System类中的声明方式为“public static final InputStream in”,也就是说in是一个static的field,即in属于System这个类,而不属于某个System类的对象,实际是因为System是用final修饰的,所以你也不可能用new关键字来创建出一个System类的对象。所以,要访问in这个InputStream类型的对象,你只能用System.in这样的方式,而且用System.in这样的方式访问到的就是一个普通的InputStream类型的对象,你可以调用InputStream类里的所有实例方法(没有static修饰的方法),也可以调用InputStream类里的所有类方法(但是用对象来调用类方法是不建议这样子操作的)。你举的例子中main方法中的"B.printTest.test();"一句我们来分析一下,因为B类中的A类型对象printTest用static修饰了,所以访问它(printTest)的时候要用"B.printTest"这样的方式,而这样的方式得到的就是一个普通的A类型的对象,所以它可以访问A类中的所有实例方法和静态方法,当你写的A类中的test方法前面有static修饰时,表示test是一个静态方法,所以要访问这个test方法最好是通过A.test()这样的方式,但是java语言并不强制要求这一点,也就是说你也可以通过任何A类的对象来访问test方法,比如你现在代码中写的"B.printTest.test()"就是这样,因为刚才说了"B.printTest"就是一个A类的对象。所以,你这样写是可以执行的,但是不好。如果你把test方法前的static去掉,那就符合我们说的“实例方法要通过类的具体的一个对象来访问”这一个原则了,所以把test方法前面的static去掉是可以的。这样子我们编译的过程没有错,但是执行的时候就会出错,为什么呢?因为你目前在B类中声明printTest时候没有为它实例化,换句话说这个时候printTest是null,所以当然会出错了,你只要把它实例化一下就可以了,如下:

================================

class A {
    public void test() {
    System.out.println("HA HA");
    }
}

class B {
    public static A printTest = new A();
}

class Run {
    public static void main(String[] args) {
           B.printTest.test();
    }
}

================================

第二个问题:
InputStream类中的read方法是abstract的,但是我们通过System.in得到的不是一个直接的InputStream对象,InputStream类本身为abstract的,你也不可能创建出这个类的一个对象来,实际上,我们通过System.in得到的是某一个InputStream的子类的对象,这就是java中多态的概念,即父类的变量可以引用子类的对象。查看一下java的源文件就可以知道这个in是通过native code得到的,所以你不用过分关心它到底是什么类型的,只要知道它就是一个InputStream类的子类的对象,我们可以通过它使用所有InputStream类的方法就可以了。

-------------------------------------------------------------

问题一:
我们从JDK中可以看到 其实in只是System 中的一个字段,就是一条静态属性,所以使用它的时候和我们自定义的类中使用静态属性的使用方法是一样的,即只能由静态方法调用静态属性,因为in不是System的对象所以不存在调用System中的方法的情况.在你说的例子中因为A的对象printTest是静态对象所以可以直接用B类名调用,所以他只能调用静态方法或者由静态方法调用,所以方法test必须是静态方法,如果你要把test中的static去掉,那在class B中就对printTest的定义也就必须去掉static.如果是在不薄白可以找些JAVA基础的书,每本里都会有关于static的使用说明的.
问题二:
抽象的方法是没有方法实体的,要使用它就必须由他的子类来重载,这是java的多台的一个表现,我们在使用对象调用一个抽象方法的时候其实并不是调用它本身,其实是调用它的子类中重载过的方法,比如我们一般使用inputstream的对象调用read方法,但是实际上我们调用的都是inputstream的子类,比如Fileinputstream等中的read()方法,因为在他的那些子类中read()方法都有实体的,但是内容不一样,这样一个方法在不同的类中表现的内容不一样,这样也可以很好的体现java的多态性

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

System.in.read()问题 的相关文章

随机推荐

  • C++11中thread_local的使用

    C 11中的thread local是C 存储期的一种 属于线程存储期 存储期定义C 程序中变量 函数的范围 可见性 和生命周期 C 程序中可用的存储期包括auto register static extern mutable和thread
  • 区块链的跨链技术介绍完整版

    如果说共识机制是区块链的灵魂核心 那么对于区块链特别是联盟链及私链来看 跨链技术就是实现价值网络的关键 它是把联盟链从分散单独的孤岛中拯救出来的良药 是区块链向外拓展和连接的桥梁 自比特币七年前诞生以来 数以百计的竞争币被开发出来 有着各种
  • 深入了解Aviator表达式引擎:高性能的轻量级计算引擎

    在软件开发过程中 我们经常需要对数学和逻辑表达式进行求值和计算 传统的方式可能会导致性能瓶颈和复杂的代码逻辑 在这篇博客中 我们将介绍Aviator表达式引擎 一个轻量级且高性能的计算引擎 用于解析和执行数学和逻辑表达式 什么是Aviato
  • 递归算法深入浅出三:递归求Fibonacci斐波那契数列

    递归算法概述及常见算法列表 传送门 http blog csdn net nthack5730 article details 65537530 斐波那契数列 斐波纳契数列 又称黄金分割数列 指的是这样一个数列 1 1 2 3 5 8 13
  • 如何获取Hive库表字段分区信息

    如何获取Hive库表字段分区信息 使用Hive关联的Mysql读取Hive的库表字段分区信息 也可以使用Hive的sys数据库查询相关的信息 但是会比较慢 所以直接使用Mysql去读 Hive在Mysql保存的信息如下图所示 获取Hive的
  • C语言-函数栈帧(每次调用函数,开辟函数的大概流程)

    思路 emm 有点懵 这一块 只知道个大概 如果后期我深挖的话 我再回头来补充 上图 括号的位置 便是每次创建 调用函数的时候 所产生的函数栈帧 也可以理解为每次调用函数 在电脑里开辟的一块空间 这空间实际就是一个栈 ebp栈底指针 esp
  • Ubuntu14.04 安装搜狗输入法

    Ubuntu14 04 安装搜狗输入法 一 安装fcitx 1 点击System Settings 2 选择Software Updates 3 点击Other Software 4 添加软件源 ppa fcitx team nightly
  • wpf 读取网络图片

    wpf读取网络图片 private void ViewImage string fileUri BitmapImage bitImage new BitmapImage bitImage BeginInit bitImage UriSour
  • 域名解析的过程

    互联网的域名解析不是靠一个DNS服务器完成的 而是分到多个DNS服务器上的 那么怎么分 net com edu 根 分别对应自己的服务器 根这个服务器虽然不负责具体的层级域名的解析 但是他知道 net com edu等是由哪些服务器解析的
  • 使用Visual Studio Team Explorer管理项目源代码

    最近参与了WPMind站长张欣发起的一个WP7开源项目 其中用到了Visual Studio Team Explorer进行源代码管理 以下是使用Visual Studio Team Explorer管理Codeplex上源代码的一些说明
  • 使用nginx部署项目

    开发工具 VScode 项目上线 部署项目 1 确保自己的代码是最新的 1 提交代码 git add git commit m 备注 git push git merge 分支名 git pull 2 确认是最新代码 2 VScode 1
  • python中遇见module ‘random‘ has no attribute ‘seed‘原因

    是因为我设置 py文件名为random与这个模块好像冲突 具体啥原因我也解释不清楚 修改文件名就可以了 import random random seed 10 print random random print random random
  • React生命周期

    React生命周期 4个阶段 1 挂载卸载过程 初始化 2 更新过程 3 销毁阶段 4 错误处理阶段 挂载卸载过程 构建并插入真实DOM 1 1 constructor 1 2 componentWillMount 1 3 render 1
  • 悟道·天鹰 Aquila + 天秤 FlagEval,打造大模型能力与评测标准双标杆

    为推动大模型在产业落地和技术创新 智源研究院发布 开源商用许可语言大模型系列 开放评测平台 2 大重磅成果 打造 大模型进化流水线 持续迭代 持续开源开放 01 悟道 天鹰 Aquila 开源商用许可语言大模型系列 悟道 天鹰 Aquila
  • 如祺出行冲刺自动驾驶商业化,人少的地方机会多?

    网约车 正在迎来让人 不明觉厉 的新一轮竞赛 网约车监管信息交互系统的数据显示 截至今年6月30日 全国共有318家网约车平台公司取得网约车平台经营许可 环比增加5家 网约车监管信息交互系统6月份共收到订单信息7 63亿单 环比上升3 7
  • 华为三层交换机 配置

    1 拓扑图 2 汇聚层交换机设置
  • 第十四篇 Inception V3——论文翻译

    文章目录 摘要 1 引言 2 通用设计原则 3 基于大滤波器尺寸分解卷积 3 1 分解到更小的卷积 3 2 空间分解为不对称卷积 4 利用辅助分类器 5 有效的网格尺寸减少 6 Inception v2 7 通过标签平滑进行模型正则化 8
  • 【PAT乙级】旧键盘打字

    题目描述 旧键盘上坏了几个键 于是在敲一段文字的时候 对应的字符就不会出现 现在给出应该输入的一段文字 以及坏掉的那些键 打出的结果文字会是怎样 输入格式 输入在 2 行中分别给出坏掉的那些键 以及应该输入的文字 其中对应英文字母的坏键以大
  • C# System.UnauthorizedAccessException:“对路径“C:\xxx”的访问被拒绝。

    C 程序运行时提示 对路径 C xxx 的访问被拒绝 System UnauthorizedAccessException 对路径 C Excel2007 xlsx 的访问被拒绝 解决办法是 启动visual studio时选择右键 gt
  • System.in.read()问题

    来源 http zhidao baidu com question 74164319 Q System in read 中in是一个字段即静态常量 JAVA帮助文档中 public static final InputStream in 那