String s = new String(“xyz”);创建了2个StringObject
在执行String s = new String(“xyz”);时,会先创建一个字符串对象指向字符串常量池中的"xyz",然后再创建一个s对象,由于这时字符串常量池中已经存在xyz则s对象直接指向字符串常量池中的xyz
从main方法入栈到开始执行change(a,b),内存图如下
随后执行x.append(y);由于java是值传递,这里的x拥有a的地址值,所以这时对x进行操作,会影响到a的数据
随后执行y = x;这里是让y的地址等于x的地址,对b的地址值并没有影响
此时System.out.println(a+","+b);
得出的结果就是 AB,B
局部内部类可以用abstract和final修饰
B正确:自动转换,如果是float t = -412.0;就错了
应该是float t = -412.0f;
A局部变量不需要初始化
类方法:静态方法
实例方法:非静态方法
在静态方法中无法使用this关键字
java中没有原生类
String类型的变量s没有赋值,无法打印,编译报错
Java的异常体系分Error和Exception不仅仅存在于Exception中
首先看这一部分
这个Two类中的属性是Byte,其初始值是null
当执行这部分的代码时就会输出two.x的默认值null
这部分创建了一个新的对象two2并调用fix(two)方法返回了一个对象给two2赋值
由于java是值传递,这里tt指向two的地址,可以对two的属性进行更改
内存图如下
当执行tt.x = 42;后
这时two.x就被更改为42
随后调用结束返回拥有two的所有属性的对象tt给two2赋值
此时two2和two指向同一个地址
所以
这里的输出是42 42
如何忽略安全访问修饰符的安全检查?
setAccessible(true)
15.简述每一个输出的原因
public class A {
public String Show(D obj) {
return "A and D";
}
public String Show(A obj) {
return "A and A";
}
}
public class B extends A{
public String Show(Object obj) {
return "B and B";
}
public String Show(A obj) {
return "B and A";
}
}
public class C extends B{
}
public class D extends B{
}
public class Test {
public static void main(String[] args) {
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
System.out.println("1---"+a1.Show(b));
System.out.println("2---"+a1.Show(c));
System.out.println("3---"+a1.Show(d));
System.out.println("4----"+a2.Show(b));
System.out.println("5----"+a2.Show(c));
System.out.println("6----"+a2.Show(d));
System.out.println("7---"+b.Show(b));
System.out.println("8---"+b.Show(c));
System.out.println("9---"+b.Show(d));
}
}
1—A and A
2—A and A
3—A and D
4----B and A
5----B and A
6----A and D
7—B and A
8—B and A
9—A and D
这里的继承关系图如下
重点在于创建的对象类型是什么,以及会调用哪个方法,这里考察的是多态的性质
条件:继承,重写,父类引用指向子类对象Parent p = new Child();(向上转型)
首先是前三个:
这三个对象的类型都是A
传入的参数类型分别是B C D
当传入BC类型的对象时,由下图可以看出,A类的方法中并没有对应的参数,那么会向上转型变为A,输出"A and A"
而当传入D时,A类中有D类型参数的方法,则直接输出"A and D"
接着是中间三个:
这三个都是利用Parent p = new Child();的形式创建出来的对象
根据多态的性质,向上转型
在
中,有A类型参数的方法,所以
前两个输出B and A而在A类中有D类型的方法,所以输出A and D
最后是后三个:
这三个都是通过B b = new B();生成的三个B类型的对象,分别传入BCD类型的参数,转型的方式与第二部分的相同,故输出的内容相同
1、True 基本类型比较值
2、True 128陷阱
3、False 引用类型比较地址
4、True 自动拆箱
5、False 自动装箱
6、False 引用类型判断地址
7、True 自动装箱