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

- 参数列表必须完全与被重写方法的相同;
- 返回类型必须完全与被重写方法的返回类型相同;
- 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为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 没有强制转换,错误。

浙公网安备 33010602011771号