保定网站建设设计公司,网站 电信已备案 联通,网站策划书主题,emlog wordpress第一题
1.题目#xff1a; 2.解析#xff1a;
首先#xff0c;我们来分析Hello1类的结构和给定代码的执行流程#xff1a;
Hello1类中有两个成员变量#xff0c;一个静态的a和一个非静态的b。静态变量a属于类本身#xff0c;而非静态变量b属于类的每一个实例#xff…第一题
1.题目 2.解析
首先我们来分析Hello1类的结构和给定代码的执行流程
Hello1类中有两个成员变量一个静态的a和一个非静态的b。静态变量a属于类本身而非静态变量b属于类的每一个实例对象。
Hello1类的构造器对成员变量b进行了初始化将其值设置为ba。因为a是静态的它的值在所有实例之间是共享的。
add方法分别将a和b的值加1。
接下来我们根据提供的代码段逐步分析 Hello1 h1new Hello1(); 这一步创建了一个Hello1类的实例h1。在构造器中b的值被初始化为ba即336。所以h1.b的值为6。静态变量a的值在构造过程中没有被改变仍然是3。 h1.add(); 调用h1对象的add方法a的值加1变为4h1.b的值加1变为7。 Hello1 h2new Hello1(); 这一步创建了另一个Hello1类的实例h2。在构造器中b的值再次被初始化为ba但此时a的值已经是4因为上一步h1.add()改变了a的值所以h2.b的值为347。静态变量a的值在构造过程中依然没有被改变仍然是4。 h2.add(); 调用h2对象的add方法a的值再加1变为5h2.b的值加1变为8。 System.out.println(h1.ah1.a h2.bh2.b); 打印h1.a和h2.b的值。因为a是静态的所以所有实例共享它的值这里h1.a和Hello1.a以及h2.a都是5。而h2.b的值在上一步已经被更新为8。
所以最终的输出结果为
h1.a5 h2.b8
注意虽然代码中写的是h1.a但实际上因为a是静态的你也可以直接通过类名Hello1.a来访问它结果是一样的。这里写h1.a只是表明是通过h1这个对象来访问静态变量a但实际上访问的是类级别的变量。
3.收获
静态变量不会变非静态变量是每个类的对象 第二题
1.题目 2.解析
在Java中类的访问权限控制是通过修饰符来决定的。在您提供的代码中类C有三个成员变量
private int a3;这个变量是私有的只能被类C自身访问。double b4.5;这个变量没有明确的访问修饰符因此它的访问权限是默认的也称为包级访问权限意味着它只能被同一个包内的其他类访问。protected int c5;这个变量是受保护的可以被类C自身、同一个包内的其他类以及子类无论子类是否在同一个包内访问。
类D和类C在同一个包com中因此类D可以访问类C中具有包级访问权限的变量和受保护的变量。
基于上述分析
类D不能访问a因为a是私有的。类D可以访问b因为b具有包级访问权限。类D可以访问c因为c是受保护的。
因此正确答案是
C. 不能访问a可以访问b和c。
3.收获
private让变量变为私有的
第三题
1.题目 2.解析
执行以下代码
A a1 new B(); a1.print();
首先A a1 new B(); 这行代码创建了一个 B 类的实例并将其引用赋值给了 A 类型的变量 a1。由于 B 是 A 的子类所以这是合法的。
接下来调用 a1.print();。这里有几个关键点需要注意
变量 a1 的类型是 A但是实际上它引用的是一个 B 类的对象。在 Java 中如果子类重写override了父类的方法那么当使用子类对象调用该方法时将执行子类中的方法实现。在这个例子中B 类重写了 A 类中的 print 方法。
因此当调用 a1.print(); 时实际执行的是 B 类中的 print 方法而不是 A 类中的 print 方法。
B 类中的 print 方法只打印 a 的值并没有对其进行自增操作。B 类中的 a 是 B 类自己的成员变量其值为 5由于 int a 5; 在 B 类中被定义。
所以输出结果为
a5
因此正确答案是 C. a5
3.收获
将子类赋值给父类
A a1 new B()
第四题
1.题目 2.解析
在Java中当一个类继承自另一个类时子类可以通过调用super()来调用父类的构造函数。这是子类构造函数中初始化父类部分所必需的。
在类B中构造函数需要调用父类A的构造函数来初始化从A继承的字段a和b。由于A的构造函数接受两个int类型的参数因此需要在B的构造函数中使用super(a, b);来调用它。
接下来子类B还需要初始化自己的字段c这可以通过this.c c;来完成。
因此完整的B类构造函数应该如下所示
class B extends A { private double c; public B(int a, int b, double c) { super(a, b); // 调用父类A的构造函数 this.c c; // 初始化子类B的字段c }
} 选项A中的super.A(a,b);是不正确的因为调用父类构造函数的正确语法是super(参数列表);而不是super.类名(参数列表);。
选项B中的A(a,b);也是不正确的因为这不是调用父类构造函数的正确语法。而且this.bb;在这里是多余的因为父类构造函数已经初始化了b。
选项C也是错误的因为它试图通过super(a);只传递一个参数给父类构造函数而父类A的构造函数需要两个参数。此外this.bb;同样是多余的。
3.收获
子类继承父类使用super函数继承需要的属性 第五题放一放