A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘源 中级黑马   /  2012-8-4 12:01  /  1389 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘源 于 2012-8-4 17:26 编辑

部分代码如下:  
String s1 =new String("abc");
  Class<? extends String> c1 =s1.getClass();
  Class<? extends String> c2 =String.class;
  Class<?> c3 = Class.forName("java.lang.String");
  上面的代码中c1和c2和c3是同一个字节码。   那是不是说,同一个类中的不同对象都是同一个字节码呢。
<? extends String>,那个的含义是什么啊,难道,同一个类和他的子类也是同一个字节码吗?求高手帮忙,解释下。
还有字节码到底有什么用啊。
问题已经解决”。

3 个回复

正序浏览
先来说说字节码有什么作用,字节码是在编译的时候生成的。它是与系统无关的,任何平台下只要有JVM就能运行字节码。
可以认为JVM将java程序翻译成了另一段文字。而不是想其他的语言一样直接编译成了机器码。机器码可以直接运行,而字节码需要JVM的支持。
Person p=new Person();就这样写肯定编译失败,因为没有Person类,JVM会先去内存中查找是否已经加载Person类,没有加载,需要先加载Person类,然后才能创建对象。
至于Class<? extends String> c1这句话中的泛型感觉没太大意义,因为API中关于String类有一句public final class String,所以String类没有子类,c1,c2都是String类的字节码文件,当然是同一个了。

同一个类和他的子类也是同一个字节码吗?
  1. import java.lang.Class;
  2. import java.io.*;
  3. class Test2
  4. {
  5.         public static void main(String[] args)throws Exception
  6.         {
  7.                  BufferedReader r=new BufferedReader(new FileReader("d:\\a.txt"));
  8.          Class<? extends BufferedReader> r1 =r.getClass();
  9.          Class<? extends BufferedReader> r2 =LineNumberReader.class;                 
  10.                  System.out.println(r1==r2);       
  11.         }
  12. }

复制代码
运行结果为false,所以不是同一个字节码
回复 使用道具 举报
同一个类和他的子类也是同一个字节码吗?
不是的,一个类一份字节码。你原来程序当中的三份字节码都是String类得到的,不存在什么子类父类。
<? extends String>这个是泛型范围而已,并不是说子类的
这个表示泛型的范围是String类及其子类。即Class<? extends String>中Class的范围是String类及其子类。如果定义Class<? extends String> c2 =System.class;之类的就会报错。应为System类并不是String类及其子类,即不包括在这个范围呢。Class<? extends String>当然也只是指定了一个范围,最后得到的是什么类的字节码还要看后面给的是什么,但是对于后面给的规定了一个范围。
这样讲不知道你明不明白
回复 使用道具 举报
1 字节码:一个类被类加载到内存中,占用一片存储空间,就个空间就是字节码.
   所以, 同一个类中的不同对象都是同一个字节码

2 字节码作用:
             就可以判断不同对象是否是同一个类
             去访问类中的成员变量以及构造函数以及方法
             是学习反射等高新技术的前提

3 <? extends String>,那个的含义:这个括号表示是泛型符号

                        ? extends String 表示这个类型参数c1必须继承了String ,但没有类能继续String,因为它是一个final类

                       但是为什么不报错呢? 因为对于泛型的东西,虚拟机只看编译的时候,也可以说是不够严谨吧,因为泛型的这些东西也是java1.5版本后引进的

      如有错误,谢谢大家的指正。

  
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马