20200423


接口是用来被类实现的,它的权限当然默认是公共的为public。接口内的方法也默认为public abstract,是公共权限的抽象方法。但是在jdk1.8后,接口中也可以有default修饰的静态方法,但是这个方法一定要有方法体。我们可以通过接口名.方法名的方式直接调用该方法

感觉楼上答的都不痛不痒,我从内存模型分析下,这道题从内存模型上可以这样分析:

内存分析:

 

首先主线程调用main方法,在主线程栈中main方法执行,main方法对应的栈帧(一个线程一个栈,一个方法一个栈帧)入栈。

1)当代码执行到

Example ex = new Example();

 

这条语句时,内存模型如下图:

解释:ex作为对象引用保存在栈帧内的局部变量表内,指向在堆中的对象实例,而该对象内的成员str、ch分别指向堆中分配的另外两个对象实例(new String(“good”)、以及数组,数组和对象实例在堆中分配)

 

2)当主线程代码执行到ex.change(ex.str, ex.ch);这段代码,change方法执行,对应栈帧在主线程栈内入栈,方法内的局部变量存放在栈帧的局部变量表内。

该语句执行时,内存模型如下图:

解释:

Change方法的传入的值

 

本质上都是字符数组和good的对象实例在堆中的地址,因此change方法内的局部变量ch、str也是分别指向这两个地址,如上图栈帧2中所示。

当change方法内的语句执行完

str = "test ok";

ch[0] = 'g';

这两句时,内存模型如下图:

 

解释:

1,str = "test ok";

右边这种写法,会直接在运行时常量池内分配字符串“test ok”,并将该地址传递给栈帧2内的局部变量str。

自行百度:

String str = “test”;

String str = new String(“test”);

的区别。

2,ch[0] = 'g';

该语句表示将指向的数组对象的第一个字符内容改成’g’。

 

总结:

由于栈帧1的ex局部变量指向的对象内的成员str指向的对象没有任何变化,因此

System.out.println(ex.str+"and"); 依然打印结果为:good and

 

而成员ch指向的对象内容有所变化,因此

System.out.println(ex.ch);打印结果为:gbc

 

 

 

A:属于运行时常量池导致的溢出,设置-XX:MaxPermSize可以解决这个问题,
B:属于堆空间不足导致的错误,问题比较少见,解决方式和C相同,
 
C:属于java堆内存问题,一般的手段是通过内存映像分析工具,对Dump出来的堆转储存快照进行分析,重点是确认内存中的对象是否是有必要的,也就是要判断是出现了内存泄漏,还是出现了内存溢出,如果是内存列楼,通过工具检查泄露对象打GC Roots的引用链信息,可以准确的确定出泄露代码的位置,不存在泄露,就应该检查虚拟机的堆参数,如果可以继续调大,可以设置-Xmx解决问题
D:java.lang.OutOfMemoryError: nativeGetNewTLA指当虚拟机不能分配新的线程本地空间(Thread Local Area)的时候错误信息,此错误是线程申请一个新的TLA时产生的,这个异常一般只会发生在jRockit虚拟机,只有过于绝对。
法重写
  • 参数列表必须完全与被重写方法的相同;
  • 返回类型必须完全与被重写方法的返回类型相同;
  • 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明为protected。
  • 父类的成员方法只能被它的子类重写。
  • 声明为final的方法不能被重写。
  • 声明为static的方法不能被重写,但是能够被再次声明。
  • 子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为private和final的方法。
  • 子类和父类不在同一个包中,那么子类只能够重写父类的声明为public和protected的非final方法。
  • 重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。
  • 构造方法不能被重写。
  • 如果不能继承一个方法,则不能重写这个方法。
方法重载
  • 被重载的方法必须改变参数列表(参数个数或类型或顺序不一样);
  • 被重载的方法可以改变返回类型;
  • 被重载的方法可以改变访问修饰符;
  • 被重载的方法可以声明新的或更广的检查异常;
  • 方法能够在同一个类中或者在一个子类中被重载。
  • 无法以返回值类型作为重载函数的区分标准。
  •  

     

    A:return;   没有返回值,错误
    B:short → float 无须强制转换,正确
     
    C:long → float  无须强制转换(这个最选项容易出错),正确。
     
    float占4个字节为什么比long占8个字节大呢,因为底层的实现方式不同。
    浮点数的32位并不是简单直接表示大小,而是按照一定标准分配的。
    第1位,符号位,即S
    接下来8位,指数域,即E。
    剩下23位,小数域,即M,取值范围为[1 ,2 ) 或[0 , 1)
    然后按照公式: V=(-1)^s * M * 2^E
    也就是说浮点数在内存中的32位不是简单地转换为十进制,而是通过公式来计算而来,通过这个公式虽然,只有4个字节,但浮点数最大值要比长整型的范围要大。
     
    D:double → float 没有强制转换,错误。
posted @ 2022-04-24 15:52  阿炜12138  阅读(26)  评论(0)    收藏  举报