关于java面向对象的题目总结(自用)

JavaSE_OOP技能考试

  1.  以下关于面向对象概念的描述中,不正确的一项是(B)。
    A.在现实生活中,对象是指客观世界的实体 
    B.程序中的对象就是现实生活中的对象 
    C.在程序中,对象是通过一种抽象数据类型来描述的,这种抽象数据类型称为类(classD.在程序中,对象是一组变量和相关方法的集合  
         //这道题B错误,那就意味着其他三个选项的内容可以作为对于面向对象概念的诠释;
    
  2.  public class Foo {
    	int value;
    	Foo(int value) {
    		this.value = value;
    	}
    	public boolean equals(Object obj) {
    		if (obj instanceof Foo) {
    			Foo foo = (Foo) obj;
    			return value == foo.value;
    		} else {
    			return false;
    		}
        }
        运行下面程序段:
        ArrayList list = new ArrayList();
        HashSet set = new HashSet();
        list.add(new Foo(1));
        set.add(new Foo(1));
        System.out.println(list.contains(new Foo(1)) + ","
    			+ set.contains(new Foo(1)));
    //控制台输出的结果是( )。
    
    //这道题主要考察的是set列表在调用contains方法时,会先先调用hashcode方法,判断两个值是否相等,在调用equals方法是否相等所以结果是true和flase
    
  3. public class A{}
        public class B extends A implements D {}
        public class C extends A {}
        public interface D {}
        变量a、b、c、d的定义如下:
        A a = new A();  B b = new B();  
        C c = new C();  D d = null;
        则下列语句会有编译错误的是( )D
    A.   
      a = b; //b是a的子类,属于向上转型,自动转型是对的
    B.   
      d = b;  //b是实现接口d,所以也是向上转型
    C.   
      d = (D)a; //D接口, 接口实现多继承, 一个类可以实现多个无关紧要接口,因为题目要求是编译错误,这个在编译的过程中并不会报错。
    D.   
      c = (C)b; //b,c之间没有关系,所以错误
    
    
  4. class COne {
            public void f() {
            System.out.println("COne.f");
            }
        }
     
        class CTwo extends COne{
    	public void f() {
    		System.out.println("CTwo.f");
            }  
        }
    
        class CThree {
    	public void g(COne one) {
    		System.out.println("g(Cone)");
    		one.f();
        }
    
        public void g(CTwo two) {
    	System.out.println("g(Ctwo)");
    	two.f();
            }
        }
        public class Main {
    	public static void main(String[] args) {
    		COne one = new CTwo();
            CThree three = new CThree();
    		three.g(one);
            }
        }
        //控制台输出的结果是( )
    //COne one = new CTwo();属于是向上转型,将CTwo对象向上转型给COne对象名是one,所以该对象,表面类型时COne,真实类型时CTwo。如果该对象被当做参数传递那么就会使用表面类型,如果调用子类的重写方法则会使用真实类型,所以最后会输出
    // g(Cone),使用表面类型传递传输,在重载方法里面使用COne参数对象的方法
    //CTwo.f,在重载方法里面one.f()是对象名调用子类的重写方法,使用真实类型所以是CTwo.f
    
  5. class Foo {
    	private int value = 5;
    	public Foo() {
    	System.out.println("Foo()");
    	System.out.println(value);
            }
        }
    
        class Bar extends Foo{
    	private int value = 10;
    	public Bar() {
    	System.out.println("Bar()");
    	System.out.println(value);
            }
        }
    
        public class Main {
    	public static void main(String[] args) {
    	Bar bar = new Bar();
            }
        }
        //控制台输出的结果是( )。
    //new Bar();就会调用Bar对象的无参构造方法,然后在无参构造方法的第一行省略了super();调用了父类的无参构造方法,所以第一行的父类无参构造方法会先实现因此输出结构为
    //Foo() 
    // 5
    // Bar()
    // 10 
    
  6. //实现Point类的equals方法,具体逻辑为:“成员变量x和y分别相等的Point对象被视为相等”。
        public class Point {
    	private int x;
    	private int y;
    		...
    	public boolean equals(Object obj) {
    		//<填入代码>
    	}
        }
    //填入代码的那一行应该填什么能够满足题目的要求
    //判断两个变量是否相等的Point对象,那么首先应该判断是否为Point对象可以用关键字instanceof判断数据类型是否相等,然后判断两个值是否相等因此答案为
    //if(!(obj instanceof Point)) return false;
    //    if(((Point)obj).x == this.x && ((Point)obj).y == this.y){
    //         return true;
    //    }
    //            return false; 
    
    
  7. 下面说法正确的是A
    A.   
      一个接口可以继承另外一个接口 
    B.   
      一个类只能实现一个接口 //可以实现多个无关紧要的接口
    C.   
      Java语言支持多继承 //只支持单继承或者多重继承
    D.   
      抽象类中的非抽象方法不可以调用其抽象方法 //可以调用,具体的应用场景,就是子类实现了这个抽象类然后在其他类中调用
    
    
  8. 下面描述正确的是:D
    A.   
      str是字符串变量,“java”.equals(str) 和 str.equlas("java")在任何时候都是等价的 //错误,当str为空时,会报空指针异常,这个时候就不会等价了
    B.   
      成员访问修饰符按照可访问的范围由大到小的顺序是 public  default protected private //错误protected在不同包下的子类也可以访问,范围比缺省要大一点
    C.   
      abstractfinal 共同修饰一个类时,final应该放在abstract 的前面 //错误,一个是必须继承,一个是不能继承,本就自相矛盾,无法在一起就不存先后之分了
    D.   
      当某一个类的int类型常量值(用static final修饰)经过修改并重新编译后。用到的该常量的其他类也必须重新编译后才能用的新修改后的值 
    
    
  9. 运行下面程序段:
        Calendar c = Calendar.getInstance();
          c.set(Calendar.YEAR, 2008);
          c.set(Calendar.MONTH, 1);
          c.set(Calendar.DATE, 32);	
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/M/dd");
        System.out.println(sdf.format(c.getTime()));
        控制台输出的结果是(  )。
    //因为月份是固定12个月,所以是按数组存放的,0-11,所以1代表的2月份又因为2008年2月份是润年所以有29号,32天减去29天余3天,2月份进一,所以最后的答案应该是2008/3/03
    
  10. //下面各选项可以在A的子类中使用的是()AC
    class A {
    protected int method (int a,  int b) {
    return 0;
    }
    }
    A.   
      public int method (int a,  int b) { return 0; } 
    B.   
      private int method(int a,  int b) { return 0; } 
    C.   
      private int method(int a,  long b) { return 0; } 
    D.   
      public short method(int a,  int b) { return 0; } 
    //首先子类继承父类,然后重写父类的方法,修饰符是可以改变的,改变的规则是>=父类修饰符的返回,范围修饰符的范围从大到小依次是public protected default private,所以A是可行的,但是C方法中的参数类型已经改变了,所以C方法跟父类方法不是用一个方法了,在子类中也可以使用,也是符合题意的要求
    
  11. 下列代码执行的结果是:
    class Base
    {
    void test() { 
    System.out.println("Base.test()");
    }
    }
    public class Child extends Base {
    void test() {
    System.out.println("Child.test()");
    }
    public  static void main(String[] a) {
    Child anObj = new Child();
    Base baseObj = anObj;
    baseObj.test();
    } 
    }
    //Child anObj = new Child();
    //Base baseObj = anObj;这两行代码是代表向上转型
    //所以baseonj的表面类型时Base,真实类型则是Child
    //baseObj.test();调用子类的重写方法,这个时候使用的真实类型
    //所以等价于anObj.text();因此结构Child.test()
    
  12. class  HasStatic{ 
    2private  static  int  x=1003public  static  void  main(String  args[  ]){ 
    4HasStatic  hs1=new  HasStatic(  ); 
    5.        hs1.x++; 
    6HasStatic  hs2=new  HasStatic(  ); 
    7.        hs2.x++; 
    8.        hs1=new  HasStatic( ); 
    9.        hs1.x++; 
    10HasStatic.x--; 
    11System.out.println(“x=+x); 
    12} 
    13} 
    //最后x的值是多少
    //因为x是被static修饰的所以被称为类属性,意味着所有此类的对象都使用这个共同的类属性,所以x一次+1,+1,+1,-1结果为102
    
  13. 关于java.lang.String类,以下描述正确的一项是( AA.   
      String类是final类故不可以继承; 
    B.   
      String类是final类故可以继承; 
    C.   
      String类不是final类故不可以继承; 
    D.   
      String类不是final类故可以继承; 
    //关于这个题目首先是知道String是否为final修饰的类,
    //其次如果是final修饰又能不能继承
    //观察源码可以知道String类是被final修饰的类
    //如果被final修饰的类将不能够被继承,被final修饰的方法将不能够被子类重写,被final修饰的常量将不能被修改;
    
  14. 下列关于interface的说法正确的是:(  D  ) 
    A.   
      interface中可以有private方法 //错误,接口就是从来实现的,被private修饰则不能被子类实现
    B.   
      interface中可以有final方法 //错误,被final修饰,则不能被子类继承
    C.   
      interface中可以有方法实现//错误,接口本来就是用来被实现了的,自己不能实现方法; 
    D.   
      interface可以继承其他interface//可以,接口的继承同样也使用关键字extends
        
    
  15.  class Person { 
               private int a; 
               public int change(int m){return m;} 
              } 
          public class Teacher extends Person{ 
               public int b; 
               public static void main(String arg[]){ 
                 Person p = new Person(); 
                 Teacher t = new Teacher(); 
                 int i; 
                 // point x 
                } 
              } 
    
    /*
    下面哪些放在// point x行是正确的?
    A.   
      i = b;被private修饰的属性,只能在本类中被访问,并且main方法是除外的,因main方法是特殊的,他是方法的入口。故错误
    B.   
      i = p.a; 同上只能在本类中方法错误
    C.   
      i = p.change(30); 正确,可以调用public修饰的方法,并且参数的返回类型也与i的类型一致
    D.   
      i = t.b;  正确,被public修饰可以使用对象名.属性名访问
    */
    
    
  16. //下列选项中放置于“《插入代码》”处会编译出错的是C
    interface IFace{}
    class CFace implements IFace{}
    class Base{}
    public class ObRef extends Base{
        public static void main(String argv[]){
          ObRef ob = new ObRef();
          Base b = new Base();
          Object o1 = new Object();
          IFace o2 = new CFace();
         //《插入代码》
         }
    }
    /*
    A.   
      o1=o2; //正确object类是所有类的父类,所以属于向上转型,自动转型正确
    B.   
      b=ob; //ObRef继承了base类,所以同上也属于向上转型,正确
    C.   
      ob=b; //反过来属于向下转型,需要强制转换错误,正确写法:ob=(ObRef)b
    D.   
      o1=b; //同A,向上转型
    */
    
  17. Abstract method cannot be static. True or False ?A
    A True
    B False
    //直接翻译原文意思不难看出:
    //抽象方法不能够被static修饰,对还是错的
    //显然是对的,抽象方法是必须给继承的,如果被static修饰将矛盾的
    //同样抽象方法也不能够被final private修饰,违反本身的意愿
    
  18. //What will be the output when you compile and execute the following program.
    class Base
    {
    void test() {
    System.out.println("Base.test()");
    }
    }
    public class Child extends Base {
    void test() {
    System.out.println("Child.test()");
    }
    static public void main(String[] a) {
    Child anObj = new Child();
    Base baseObj = (Base)anObj;
    baseObj.test();
    }
    }
    /*Select most appropriate answer.
    A Child.test()
    Base.test()
    B Base.test()
    Child.test()
    C Base.test()
    D Child.test()*/
    //Child anObj = new Child();
    //Base baseObj = (Base)anObj;
    //属于向上在转型,可以自动转换,甚至可以省略(Base)
    //所以baseObj的表面类型时Base,真实类型时Child
    //baseObj.test();所以当他调用子类的重写方法时,使用的是真实类型
    //因此结构为 Child.test(),D
    
    
  19. 下列关于修饰符混用的说法,错误的是(D ):
    Aabstract不能与final并列修饰同一个类
        //正确,一个是必须被继承,一个是不能继承,当然不能一起出现
    Babstract类中可以有private的成员
        //正确,抽象类中可以有,抽象方法,非抽象方法,构造方法,属性,而属性被什么修饰不做要求;拓展接口中只能包含*常量*和*抽象方法*,其他都不可
    Cabstract方法必须在abstract类中
        //正确,在编译器中如果在非抽象类中写一个抽象方法会马上报错,会让你将这个类改成抽象类
    Dstatic方法中能处理非static的属性
        //错误,静态方法使用静态资源,而不能使用非静态的资源
    
    
  20. 下列说法正确的有(CAclass中的constructor不可省略
        //错误,可以省略,如果你不写,会自动给一个无参构造的没有方法的构造方法,但是你如果写了,那么就不会在自动给
    B. constructor必须与class同名,但方法不能与class同名
        //前半句是对的,普通方法也可以同名
    C. constructor在一个对象被new时执行
        //正确,当被new就是调用构造方法,所以构造方法一般用来初始化属性
    D.一个class只能定义一个constructor
        //错误,可以定义多个,可以根据开发的需求自己写需要的构造方法
    
    
  21. //使用final修饰的变量将变成常量,其中不能再被改变;使用final修饰的方法将无法被子类重载;使用final修饰的类将无法再被其他类继承。
    	//TRUE
    
  22. //抽象方法不能含有方法体,并且必须定义在抽象类中。
        //TRUE
    
  23. //抽象类是指在class前加使用abstract关键字修饰,且可以存在抽象方法和普通方法的类。
    	//TRUE
    
  24. //接口中只有常量,没有变量;只有抽象方法,并且全部都是public方法。	//TRUE
    
  25. //抽象类和接口都不能实例化,都没有构造方法。
    	//FLASE
    //确实都不能实例化,但是抽象方法有构造方法
    
  26. //接口并不要求实现类和接口在概念本质上一致的,仅仅是实现了接口定义的约定或者能力而已。接口定义了“做什么”,而实现类负责完成“怎么做”,体现了功能(规范)和实现分离的原则。
    	//TRUE
    
  27. //内部类作为外部类成员,权限修饰符和其他成员一样,可声明为private、默认、protected或public。
    	//TRUE
    
  28. //匿名内部类适合创建那种只需要使用一次的类,它可以实现一个或多个接口,或者继承一个父类。
    	//TRUE
    
  29. //垃圾回收机制回收任何对象之前,总会先调用它gc( )方法,该方法是Object类提供的方法。不要主动调用某个对象的该方法,应该交给垃圾回收机制调用。
    	//FLASE
    //其中错误在GC是由System提供的
    
  30. //final修饰的方法不能被重写,但可以被重载
    	//TRUE
    
  31. //抽象方法的类必须是抽象类,同样抽象类也必须包含抽象方法
    	//FLASE
    //抽象类可以不包含抽象方法
    
  32. //抽象类不能被new,抽象类的构造方法也不能被调用
    	//FLASE
    //抽象类确实不能被实例化,但是构造方法被子类继承就可以调用了
    
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值