第一:抽象类的构造方法有什么用?给继承它的类使用?毕竟不能自身实例化!第二:
class A{
   static void test(){}
}class B extends A{
    static void test(){}
}
man(){
  A a = new B();
  a.test();
}
输出的怎么是A的方法?
static方法不能override,只是被隐藏,这句话怎么解释?
不是应该动态绑定到B的方法吗?知道要去掉static的话执行B的方法。第三:
class C{
  String[] a = null;
  public static void main(String[] args){
    a = args; // 报错,是为什么? 不能对非静态字段进行静态引用,args是静态引用吗?
  }
}
第四:String a = "abc";
String b = "abc";
if(a == b){
  // 知道是true,内存分配的具体流程是怎么样的?
} ; //谢谢

解决方案 »

  1.   

    第三,  args 是静态引用
    第四,String a=“abc”分配一个内存空间,String b=“abc” 发现和a相同 那么就指向a的引用
    a==b其实是判断是不是同一个引用,所以是true  
      

  2.   

    1.请活用搜索引擎,如果很难理解可以跳过.
    2.多态,如果很难理解可以先死记.
    3.main是static方法,a是非static属性.
    4.a指向String池中的"abc",b指向String池中的"abc",比较地址,true,如果很难理解可以跳过.有些不明白的地方可以将来回头再看的,并没有什么影响,毕竟要形象的解释很困难,而问题本身不影响你学习喵~~``
      

  3.   

    1. 继承+本身初始化
    2. 多态的静态绑定
    3. 在static context中应该都属于是static reference
    4. 分配前先在string pool中找 有则重用
      

  4.   

    第三:static方法里不能非 static变量,你这里a是非static
    第四:对于String str = ""方法,在第一句String a = "abc"在内存会有abc,但第二句时,因为内存时已有,就把a指向abc地址,不在重新再在内存里生产对象!
      

  5.   

    你提的问题好高深.第4的个两个引用指向同一个地址,那修改其中一个就会改变另一个。
    意思是没办法创建两个独立,内容一样的String咯?
      

  6.   

    回6楼
    可以用new String("abc");
      

  7.   

    第一 构造方法主要是提供对象的初始化数据 和是不是抽象类没关系
    第二 STATIC 方法 表示一个直接存在的全局成员和所在对象其实没什么很大的关系 所谓重写 是对一个对象的成员的重写
    第三 和第二有相同的概念
    第四 直接看JDK源代码 里面是怎么String.equals(object)的 '==' 运算 实际就调用了equals()方法 
      

  8.   

    1,它的构造方法是给它的子类初始化的时候调用的.它自己不实例化,不代表它的子类不实例化啊
    2,static方法,成员变量是静态绑定,只有成员方法是动态绑定
    3,main是静态的方法,而你的a却是成员的变量,在静态方法里面怎么能访问成员的变量呢,成员要有了对象才有
    效,在你调用main方法的时候,对象还没有出来呢.这个时候怎么知道a是哪个对象的成员呢?当然不能赋值了,args
    只是参数而已.
    4,字符串常量是存在栈里面的.有一个常量池存着.所以它们会相等.这样做是为了提高效率
      

  9.   

    你一定是缺少一本好书,不然不会问这种问题
    推荐《core java》一定适合你。
      

  10.   

    1.它的构造方法是匿名内部类或者是它子类构造方法调用调用父类构造方法时用
    2.static方法不能override,只是被隐藏,就是说static方法不能被重写,而子类中同名方法被父类同样的方法给
       隐藏掉了,调用是只能是父类的方法。
       同样private,static,final方法或者构造器将是静态绑定。
    3. 静态方法不能访问非静态成员变量
    4.由于a,b指向同一个字符串引用,在堆栈中
      

  11.   

    首先,谢谢很多人热心的回答了四道题,非常感谢
    但是,有的人没明白我的意思,可能是我表达问题吧,满意答案在于10楼和12楼,结合起来就差不多了回10楼的兄弟,String 应该在堆栈上开辟资源吧,不应该在栈上吧。
      

  12.   

    谁说抽象类不会实例化?一样要实例化!abstract class A {
      int i;
    }class B extends A {
      public int getI() {
        return i; // 如果A没实例化,那么这个i哪来的?
      }
    }
      

  13.   

    说具体一点是,一个abstract类是不能通过new来直接实例化的,abstract类是不完全定义的,不能定义abstract的构造方法。
    我觉得i不是被实例化的,是继承下来的。
      

  14.   

    to 15楼:  abstract class A {
        int i;
        A() { //这难道不是构造方法吗?
          i = 20;
        }
      }
      class B extends A {
        public int getI() {
          return i;  // 这里的i已经是20了,你怎么解释?
        }
      }
      

  15.   

    1 自己不能用,可以给子类用
    2 a.test === A.test, 因为静态方法不区分对象,所以...3 main 是静态方法,而a不是静态变量4 看其它人的吧!我不重复了!
      

  16.   

    to 16楼:
    我不是说抽象类不能有构造方法,而是说构造方法前不能有abstract修饰符,可能没说清楚。
    (我说的是:不能定义abstract的构造方法;而不是说:不能定义abstract类的构造方法)B类的i是从A继承而来的,不是实例化而来的呀。还有B extends A 说明了 类B拥有他父类的所有成员,
    即使是父类的private成员!不过不能在子类企图访问其父类的private成员,任何的访问动作就会出错。
    所以抽象类是不能实例化的。
      

  17.   

    回19楼,继承撒,那么大一个extends
      

  18.   

    楼上的,我说16楼没实力化B,哪来的成员变量i,
    应该 
    new B().getI(); 这时候才是输出20吧~是不是我太单纯了~呵呵~可能16楼没写的那么详细吧!
      

  19.   

    构造函数是不能被继承的,这点基本知识大家应该了解吧?如果说抽象类没有被实例化,那么它的构造函数怎么会调用而导致i变成20呢?别被蒙了,兄弟们!抽象类绝对是会实例化的,这个实例存在于内存之中。再问大家一个更难的问题:抽象类是否继承了Object?哈哈哈哈。。
      

  20.   


    String在做修改时,是新new一个出来的,所以修改其中一个是不会改变另一个的。
    要创建两个独立内容一样的String可以用new String("abc");的方法
      

  21.   

    问题一:首先,必须明确的回答:抽象类的构造方法对自己是没有任何作用的。因为
    他是不能对自己实例化的。注意:如果抽象类提供了默认的无参构造器则,
    没有任何意义了。因为他提供构造器的作用在于限制子类采用默认构造器。
    且子类必须在自己的构造方法中用super()调用某个该抽象类的构造方法。
    比如:
    abstract class Test1{
    public Test1(int i){

    }
    public Test1(int i,int j){

    }
    /*如果加上该方法则没有任何意义了!
     * public Test1(){

    }*/
    }
    class Test2 extends Test1{
    public Test2(int i){
    super(i);//如果注释掉这一行,则编译出错
    }
    public Test2(int i,int j){
    super(i,j);//如果注释掉这一行,则编译出错
    }
    }
    问题二:对于这个问题,我认识:关键是static方法的理解,和JAVA初始化的问题。因为static申明的是静态方法,什么是静态?就是说在类的对象第一次被调用是初始化,占用一块,静态的存储空间。且在整个运行过程中只初始化一次!而且这个问题涉及到初始化顺序的问题。当:new 一个B对象时,他必须先初始化A,而静态方法会在类第一次被访问的时候就被初始化,所以这个就给A的test()分配了一个静态的存储空间。而当B自己还想有自己的test()方法时,发现自己的静态存储空间中已经有一个test()方法,所以不会再分配一个空间存放这个test()方法。这也就是所谓的static方法不能override,只是被隐藏。当运行的时候,虽然是B去自己的静态存储区找test()方法,但是实际上找到的却是A的方法,这就是为什么执行了A的方法。去掉static,我想就不用多说了!那只是一个简单的转型问题。
    问题三:这个问题,回答是:args当然是静态的!这个问题,可以用反证法来理解:main()作为一个静态方法,要在其所在类的对象第一次被调用是初始化,如果这时候他的参数args却不是静态的,也就是在这时还不用初始化,那你说,怎么去初始化这个方法?其实JAVA中静态是会自动向下“包容”的。静态类中的方法都是静态的,静态方法中的参数都是静态的。
    问题四:我今天已经是第二次回答这个问题了!刚才还有一个朋友问了同一个问题。虚拟机首先给“abc”分配了一个内存空间,然后把String型的引用指向他,然后,创建了一个String型的引用b,但是并没有新建一个对象,只是再次把b指向了已有“abc”所在的内存空间!