第六章 类与对象
判断题
- 用static修饰的变量是类变量。(T)
static修饰的成员变量又称为类变量。不加static修饰的成员变量又叫对象变量。对象变量依附于具体的对象实例,它的值因具体对象实例的不同而不同,而类变量为该类的所有对象共享,它的值不因类的对象不同而不同。
如果使用import语句引入了整个包中的类,那么可能会增加编译时间。但绝对不会影响程序运行的性能,因为当程序执行时,只是将真正使用的类的字节码文件加载到内存。(T)
2.在Java程序中,可以使用protected来修饰一个类。(F)
3.在Java程序中,可以使用private来修饰一个类。(F)
4.如果一个成员变量被修饰为final的,就是常量,常量必须赋给初值,而且不能再发生变化。(T)
5.不允许使用final来修饰abstract方法(T)
final方法不允许被子类重写,abstract方法必须被子类重写
6.类可以有两种重要的成员:成员变量和方法,类还可以有一种成员:内部类。(t)
类可以有两种重要的成员:成员变量和方法,类还可 以有一种成员:内部类。
nJava支持在一个类中声明另一个类,这样的类称作内 部类,而包含内部类的类成为内部类的外嵌类。
n一个类把内部类看作是自己的成员。
n外嵌类的成员变量在内部类中仍然有效,内部类中的 方法也可以调用外嵌类中的方法。
n内部类的类体中不可以声明类变量和类方法。外嵌类 可以用内部类声明对象,作为外嵌类的成员。
7.匿名类的类体中不可以声明static成员变量和static方法。(T)
在使用匿名内部类时,要记住以下几个原则:
· 匿名内部类不能有构造方法。 (因为匿名内部类是没有类名的)
· 匿名内部类不能定义任何静态成员、方法和类。
· 匿名内部类不能是抽象类。(因为在创建匿名内部类的时候,会立即创建匿名内部类的对象。从而也可知匿名内部类必须实现它的抽象父类或者接口里包含的所有抽象方法)
· 匿名内部类不能是public,protected,private,static。
· 只能创建匿名内部类的一个实例。
· 一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
· 因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。
· 内部类只能访问外部类的静态变量或静态方法。
匿名类和内部类中的中的this :
有时候,我们会用到一些内部类和匿名类。当在匿名类中用this时,这个this则指的是匿名类或内部类本身。这时如果我们要使用外部类的方法和变量的话,则应该加上外部类的类名。
关于内部类的作用:
一个内部类对象可以访问创建它的外部类对象的内容, 甚至包括私有变量!Java编译器在创建内部类对象时,隐式的把其外部类对象的引用也传了进去并一直保存着。这样就使得内部类对象始终可以访问其外部类对象,同时这也是为什么在外部类作用范围之外向要创建内部类对象必须先创建其外部类对象的原因。
如果内部类里的一个成员变量与外部类的一个成员变量同名,也即外部类的同名成员变量被屏蔽了,怎么办?没事,Java里用如下格式表达外部类的引用:
外部类名.this
Java中的静态内部类是没有了指向外部的引用,类似C++中的嵌套类。Java内部类也可以是局部的,它可以定义在一个方法甚至一个代码块之内(记住:匿名内部类就是局部内部类的形式之一)。在java的事件处理的匿名适配器中,匿名内部类被大量的使用。
如果是在一个方法中的匿名内部类,可以利用这个方法传进你想要的参数,不过记住,这些参数必须被声明为final。即如果匿名内部类需要访问外部类的局部变量,则必须使用final修饰符来修饰外部类的局部变量,否则系统将报错。
8.类及其属性、方法可以同时有一个以上的修饰符来修饰。(T)
9.package语句必须放到java程序的最开始。(T)
10.一个类的静态方法不可以访问该类的非静态成员变量。(T)**
11.实例变量只能通过对象名访问,类变量既可以通过某个对象名也可以通过类名来访问。(T)**
12.final类中的属性和方法都必须被final修饰符修饰。(F)
final定义的类,其中的属性、方法不是final的。
其实,可以做个假设: 如果,final定义的类,其中的属性和方法默认是final的,那结合生活,举个例子
例如:
假设,房子 中 有一个 家具类 的对象作为属性(很合理哈…),现在假设,一旦住进了房子,以后不会搬家,那么这个
房子类就应该定义成final的,那么根据上面的假设:家具一旦被初始化后,也是不能更改指向的引用(家具一旦被确定后,就不能换新的)。
但是,如果说某天,家里的家具坏了,必须要换一个(很正常…),(换新家具,相当于变量引用了一个新对象,
而final修饰的变量一旦被赋值,则引用不能被修改),很明显不符合情理,形成了悖论… 家里的家具明明可以换的,不然坏了,不能换新的怎么用。。
https://blog.csdn.net/weixin_33854644/article/details/93600684
13.final类不能派生子类,final方法不能被覆盖(T)
14.Java中类和方法都不允许嵌套定义。(F)
ava允许在一个类的内部定义一个类,这样的类称为嵌套类。例:
class OuterClass {
…
class NestedClass {
…
}
}
嵌套类分为两类:静态和非静态。 用static 修饰的嵌套类称为静态嵌套类,未使用static修饰的嵌套类称为内部类。
class OuterClass {
…
static class StaticNestedClass {
…
}
class InnerClass {
…
}
}
嵌套类是其所在类的成员。非静态嵌套类(内部类)可以访问所在类的其他成员(包括用private修饰的)。 静态嵌套类不能访问所在类的其他成员。嵌套类可以拥有private, public, protected, or package private等访问权限。 (外部类只能有public 或 package private两种访问权限)
15.引用一个类的属性或调用其方法,必须以这个类的对象为前缀。(F)
如果类是一个静态类,则可以直接使用类名.属性或者类名.方法的方式进行调用,如果类是非静态类,则需要通过new 来实例化一个类的对象,通过这个类的对象来调用方法和属性
16.类也是一种数据类型(type)。(T)
17.对象是类的实例(instance)。(T)
18.声明构造方法时,可以使用private访问修饰符(F)
19.在定义一个类的时候,如果类的成员被private所修饰,该成员不能在类的外部被直接访问。(T)
20.类及其属性、方法可以同时有一个以上的修饰符来修饰。(T)**
21.构造方法可以是静态的。(F)
22.构造方法不能被重载(F)
23.类及其属性、方法可以同时有一个以上的修饰符来修饰。(T)
24.构造方法没有返回类型,甚至连void也没有。(T)
选择题
- 在Java中用什么关键字修饰的方法可以直接通过类名来调用?.
答:static - 若在某一个类定义中定义有如下的方法:abstract void performDial( );该方法属于
A.接口方法 B.最终方法 C.抽象方法 D.空方
答:c
答:C.抽象方法
-
【单选题】类的实例方法表示的是( ) 。
A. 父类对象的行为 B. 类的属性 C. 类对象的行为 D. 类的行为
答:c类对象的行为 -
对于类与对象的关系,以下说法错误的是( C)。(2分)
A.类是对象的类型B.对象由类来创建C.类是同类对象的抽象D.对象是创建类的模板
ps:**“”对象由类来创建“”这句话是错的还是对的?我也不大确定
- ** 【单选题】关于类中成员变量的作用范围,下述说法中正确的是()。(2.0分)
A. 只有用public修饰的变量才能在所有方法中使用 B. 用private修饰的成员变量可以在main方法中直接使用 C:类中所有成员变量在所有成员方法中有效**
答案:c.类中所有成员变量在所有成员方法中有效
ps:这题要注意看题:类中两个字别看漏了
- 方法体内定义的变量称局部变量,下述关于局部变量的说法中错误的是( ) “因为局部变量 本身就是 一个访问权限 的设定。 只能在局部调用,也就是说局部变量的生命周期在{}之中除了这个方法外界是没办法访问你这个变量,所以不需要用任何修饰符修饰,比如private ,public protected,等但是能加final,也不能加static,静态的关键词”
A.局部变量仅在所定义的代码块内(花括号对内)有效
B.局部变量不能加修饰词修饰
C.局部变量不能与类中的成员变量同名
D局部变量未经赋值不能使用
答:C局部变量不能与类中的成员变量同名
- Int型public成员变量MAX_LENGTH,该值保持常数100,则定义这个变量的语句是(D )。
(2分)
A.public int MAX_LENGTH=100B.final int MAX_LENGTH=100C.Public const int MAX_LENGTH=100D.public final int MAX_LENGTH=100
- 为AB类的一个无形式参数无返回值的方法method书写方法头,使得使用类名AB作为前缀就可以调用它,该方法头的形式为(A )。
A.static void method( )
B.public void method( )
C.final void method( )
D.abstract void method( )
9.以下代码的输出结果为( )。
public class Pass{
static int j = 20;
public void amethod(int x){
x = x2;
j = j2;
}
public static void main(String args[]){
int i = 10;
Pass p = new Pass();
p.amethod(i);
System.out.println(i+" and "+j);
}
}
答:10 and 40
10.下列关于使用包中的类哪个说法是正确的。C
A.类不可以使用其所在包中的private类
B.类可以使用其他包中的所有类
C.类可以使用其他包中的public类
11.一个*.java文件中可以包含多少个public类?
最多1个
12.:【单选题】以下对封装的描述正确的是。
A. 只能对一个类中的方法进行封装,不能对属性进行封装 B. 如果子类继承了父类,对于父类中进行封装的方法,子类仍然可以直接调用 C. 封装的意义不大,因此在编码
答:封装的主要作用在于对外隐藏内部实现细节,增强程序的安全性
13以下( )添加到ComputerBook中不会出错***(D)为什么?我也不知道捏***
class Book{
protected int getPrice(){
return 30;
}
}
public class ComputerBook extends Book{
}
A.
protected float getPrice(){}
B.
protected int getPrice(int page){}
C.
int getPrice(){}
D.
public int getPrice(){return 10;}
14【单选题】以下描述正确的有
A. 方法的重写应用在一个类的内部 B. 方法的重载与返回值类型无关 C. 构造方法不能重载 D. 构造方法可以重写
:方法的重载与返回值类型无关
ps:构造方法不能被继承,不能重写,但构造方法可以重载。
在一个类中,可以有多个构造方法(方法参数不同) ,即重载,来实现对象属性不同的初始化;但是子类中不能定义一个方法无void无返回值的方法,编译错误,即子类无法继承构造方法,但是子类的构造器中可以调用父类的构造方法(默认自动调用无参构造)。
15【单选题】类中的一个成员方法被下面哪个修饰符修饰时,该方法只能在本类被访问?
A. public B. protected C. private D. Default
:private
16【单选题】以下哪些修饰符可以便其修饰的变量只能对同包类或于类有效
A. public B. protected C. private D. default
:protected
17单选题】在 Java 中,负责对不再使用的对象自动回收的是()。
A. 垃圾回收器 B. 多线程机制 C. 编译器 D. 虚拟机
:虚拟机
18以下说法错误的是( b)
(2分)
A.
静态方法可以直接访问本类的静态变量和静态方法
B.
静态方法可以直接访问本类的非静态变量和非静态发方法
C.
非静态方法可以直接访问本类的静态变量和静态方法
D.
非静态方法可以直接访问本类的非静态变量和非静态方法
19
在Java中,一个类可同时定义许多同名的方法,这些方法的形式参数的个数、类型或顺序各不相同,传回的值也可以不相同,这种面相对象程序特性称为( c)。
(2分)
A.
隐藏
B.
覆盖
C.
重载
D.
Java不支持此特性
20
下面(c )修饰符修饰的变量是所有同一个类生成的对象共享的。
(2分)
A.
public
B.
private
C.
static
D.
final
21
一个对象是( c)的实例。
(2分)
A.
程序
B.
类
C.
方法
D.
数据
22【单选题】声明一个类需要_______关键字。
A. public
B. private
C. class
D. 以上都是
:class
23
下面哪句说法是正确的?( A)
(2分)
A.
在类中若无显式定义构造函数,会自动产生一个缺省构造器。
B.
必须显式定义一个构造函数。
C.
每个类都有一个缺省构造函数。
D.
缺省构造函数可以有参数也可以没有参数。
-24
现有声明Circle x = new Circle(),如下哪句是最确切的。( )
(2分)
A.
x包含了一个int型数据。
B.
x包含了一个Circle类型的对象。
C.
x包含了一个Circle对象的引用。
D.
x可将一个int型数据赋值给x。
现有声明Circle x = new Circle(),如下哪句是最确切的。(C )
A.x包含了一个int型数据。
B.
x包含了一个Circle类型的对象。
C.
x包含了一个Circle对象的引用。
D.
x可将一个int型数据赋值给x。
25
执行下面的程序,输出结果是( 10)。
public class Test {
int x= 12;
public void method(int x) {
x+=x;
System.out.println(x);
}
public static void main(String[] args){
Test t = new Test();
t.method(5);
}
}
26在空格处填上哪行代码不会出现语法或运行时错误:
public class Test {
java.util.Date date;
public static void main(String[] args) {
Test test = new Test();
System.out.println(_________________);
}
}
答:test.date
列哪个叙述是正确的?A
(1分)
A.
当类中没有定义任何构造方法时,Java编译器将为这个类提供默认构造方法。
B.
Java编译器提供的默认构造方法,也可以为成员变量重新赋值。
C.
Java编译器会为所有的类提供默认构造方法。
D.
如果在一个类中定义的构造方法都是有参数的,Java编译器将为这个类提供默认构造方法。
填空题
4-1
给出以下代码:
public class Test {
public int t=4;
public static void main(String[] args) {
new Test().NumberPlay();
}
public void NumberPlay() {
int t=2;
t = t+5;
this.t = this.t-2;
t = t-this.t;
System.out.println(t+this.t+"ok");
}
}
答:7ok
解析:注意,最后一行代码,t为5,this.t为2
所以要相加起来为7
请写出以下程序运行结果:
class Letter {
char c;
}
public class Main {
static void f(Letter y) {
y.c = 'z';
}
public static void main(String[] args) {
Letter x = new Letter();
x.c = 'a';
f(x);
System.out.println(x.c);
}
}
答:z
为什么是z,不知道???
请写出以下程序运行结果:
class A
{
int x;
String s;
};
class HelloWorld
{
public static void main(String[] args)
{
A a= new A();
System.out.println(a.s);
System.out.println(a.x);
}}
答:null
0
请写出以下程序运行结果:
public class Test {
private int i = 0;
Test increment() {
i++;
return this.clone();
}
public Test clone() {
Test t = new Test();
t.i = i;
return t;
}
public Test() { System.out.print(i); }
void print() {
System.out.printf("i = %d", i);
}
public static void main(String[] args) {
Test x = new Test();
for ( int i=0; i<10; i++ )
x = x.increment();
x.print();
}
}
00000000000i = 10
这个题其实也不大知道
请说出A类中System.out.println的输出结果。
class B{
int x=100,y=200;
public void setX(int x){ x=x; }
public void setY(int y){ this.y=y; }
public int getXYSum(){ return x+y; }
}
public class A {
public static void main(String args[]){
B b=newB();
b.setX(-100);
b.setY(-200);
System.out.println("sum="+b.getXYSum());
}
}
-100