黑马程序员技术交流社区

标题: 关于static [打印本页]

作者: xieshuhua    时间: 2012-5-15 12:14
标题: 关于static
请问 System.out.println 方法中:
1、system是不是静态类
2、out是不是静态类。。。
作者: 冯心程    时间: 2012-5-15 12:24
java.lang 类 System

public final class System  extends Object

在 System 类提供的设施中,有标准输入、标准输出和错误输出流;对外部定义的属性和环境变量的访问;加载文件和库的方法;还有快速复制数组的一部分的实用方法。


static PrintStream out  “标准”输出流

out
public static final PrintStream out“标准”输出流。此流已打开并准备接受输出数据。通常,此流对应于显示器输出或者由主机环境或用户指定的另一个输出目标。
对于简单独立的 Java 应用程序,编写一行输出数据的典型方式是:

     System.out.println(data)



System是类    out是其中“输出流”
作者: xieshuhua    时间: 2012-5-15 12:52
冯心程 发表于 2012-5-15 12:24
java.lang 类 System

public final class System  extends Object

system是 final类是吧,和static类又有什么不同哪?
下面的out已经带有static关键字了,谢谢啦~~
作者: 冯心程    时间: 2012-5-15 13:03
谢述华 发表于 2012-5-15 12:52
system是 final类是吧,和static类又有什么不同哪?
下面的out已经带有static关键字了,谢谢啦~~ ...

system他是lang包里的类 他直接继承的是object  你去JDK里面看吧  你进入误区了 我说也说不明白 还是直接看官方的说法  JDK左面就有SYSTEM 去翻翻
作者: 冯心程    时间: 2012-5-15 13:10
谢述华 发表于 2012-5-15 12:52
system是 final类是吧,和static类又有什么不同哪?
下面的out已经带有static关键字了,谢谢啦~~ ...




算了 你别翻了 直接上图
作者: 孙安庆    时间: 2012-5-15 13:49
System是lang包中的类,其中都是静态方法,调用它们可以获取系统相关信息或者环境变量,可以认为是系统工具类
。因为它在lang包下,如果是静态类,将无法被调用,但是内部类可以是静态类,内部类可以作为外部类的静态成员。
如果想在其中定义一个静态内部类可以定义一个子类来继承System类,不过你也知道的,System已经被final修饰过了,
不能作为父类被继承,所以System类已经很安全的被JDK的开发人员封装了
作者: xieshuhua    时间: 2012-5-15 13:57
孙安庆 发表于 2012-5-15 13:49
System是lang包中的类,其中都是静态方法,调用它们可以获取系统相关信息或者环境变量,可以认为是系统工具 ...

嗯,这句话很经典
System已经被final修饰过了,不能作为父类被继承,所以System类已经很安全的被JDK的开发人员封装了。
学习了,呵呵。
不过System被final修饰过,和被static修饰有什么区别哪。
是不是final= static(不能被实例化)+不能被继承?
作者: xieshuhua    时间: 2012-5-15 14:09
刚刚试验了一下,final能够被实例化。
public class cw {
          final class Good{
                 int x=0;
        }
        public static void main(String[] arges){
                cw xx=new cw();
                cw.Good y=xx.new Good();
                System.out.println(y.x);
        }
}
java太复杂了,这是不是意味这System能够被实例化,但是System都是静态成员,不影响其安全性。
作者: 李哲    时间: 2012-5-15 14:15
外部类只能被public, abstract & final修饰。
内部类可以被static修饰。
静态类只能是内部类。
System是final修饰的外部类,不是静态类。out是静态方法,所以可以System.out,out方法产生的是PrintStream类的实例对象,println() 是PrintStream的方法。
即PrintStream ps=System.out;
   ps.println("abc");
   写成一语句:System.out.println("abc");


作者: 李哲    时间: 2012-5-15 14:33
final:最终。作为一个修饰符,
1 可以修饰类,函数,变量。
2 被final修饰的类不可以被继承。为了避免被继承,被子类复写自己的功能。
3 被final修饰的方法不可以被复写。
4 被final修饰的变量是一个常量只能赋值一次,既可以修饰成员变量,也可以修饰局部变量。

  当在描述事物时,一些数据数值固定,那么为增强阅读性,可以给这个值起个名字,方便阅读。
  值不需要改变,所以加上final修饰,作为常量.
  常量的书写规范,所有字母都大写,如果有多个单词组成,单词间通过_连接。
作者: 李哲    时间: 2012-5-15 14:39
System 类包含一些有用的类字段和方法。它不能被实例化。
System 类的构造函数被私有化,如下
private System() {
    }
System 内部也没有提供其他可以产生实例的方法(比如像单例那样)
所以System 不能被实例化。
作者: 孙安庆    时间: 2012-5-15 15:12
谢述华 发表于 2012-5-15 14:09
刚刚试验了一下,final能够被实例化。
public class cw {
          final class Good{

System不能被实例化。JDK里白纸黑字的哦:P
因为木有构造器呢
作者: 李哲    时间: 2012-5-15 15:18
李哲 发表于 2012-5-15 14:33
final:最终。作为一个修饰符,
1 可以修饰类,函数,变量。
2 被final修饰的类不可以被继承。为了避免被继 ...

这个,是毕老师总结的。
惭愧。
作者: ^.^晴天    时间: 2012-5-15 23:31
System.out.println 方法中:
1、system是静态类
2、out也是静态类
作者: xieshuhua    时间: 2012-5-18 13:05
刚看了下IO的章节,再回头看看曾经的问题,总结下希望能对大家有所帮助。
java.io.PrintWriter 这种点 只代表目录的层级关系,一般出现在引用区。
System.out.println()中两个点 有两个含义。
System.out表示 字段(这里为类)-----------后面没有括号,代表不是方法。出现在代码的运行区,而不是引用区,说明不是文件层级关系。
如图所示,out为 PrintStream类(PrintStream永不报异常。。。)。
.println()为PrintStream类的方法。
再附上关系图一张。我们可以看到虽然用到了IO包中的类和方法,但不需要再次导入IO包,我想PrintStream类应该是被实例化为out后直接封装起来了。
有不对的地方,大家帮忙指正谢谢啦~~

PrintStream.println.png (2.05 KB, 下载次数: 60)

PrintStream.println.png

System的字段out.png (6.14 KB, 下载次数: 58)

System的字段out.png

来龙去脉.png (11.1 KB, 下载次数: 56)

来龙去脉.png

作者: 8161776    时间: 2012-5-18 23:38
首先回答你的问题 System不是静态类,他是final修饰的类,
final是最终的意思,
final修饰的类不能被继承,final修饰的方法不能被重写,final修饰的变量就是常量!
这里用的out更不是静态类,用的是System类中静态属性out,来获取一个 PrintStream对象,然后调用PrintStream中的print()方法!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2