技术帮
 

面向对象面试题1

本网站内容基本都是原创作品,未得到作者同意也欢迎转载
转载请注明出处:技术帮
说你呢,赶紧长按二维码,然后点击识别图中二维码

任何技术难题可进QQ群提问:【小崔说编程
对于提问的原则是:没有你不能问的,只有我不会答的

1474898515444058446.png 面向对象的特征有哪些方面?

主要有封装,继承,多态,也可以加上个抽象.

封装

封装是保证软件部件具有优良的模块性的基础,封装的目标就是要实现软件部件的高内聚,低耦合,防止程序相互依赖性而带来的变动影响.在面对对象的编程语言中,对象是封装的最基本的单位,面向对象的封装比传统语言的封装更为清晰,有力.

面向对象的封装就是把一个对象的属性和行为的代码封装在一个模块中,也就是一个类中,属性用变量定义,行为用方法进行定义,方法可以直接访问同一个对象中的属性.通常情况下,只要记住让变量和访问这个变量的方法放在一起,将一个类中的成员变量全部定义成private,只有这个类自己的方法才可以访问到这些成员变量,这就基本上实现对象的封装.就很同意找出要分配带这个类上的方法来,就基本上算是会面向对象的编程了.把握一个原则,:把对同一事物进行操作的方法和相关的方法放在同一个类中,把方法和他操作的数据放在同一个类中.

例如,人要在黑板上画圆,这一共涉及三个对象:人、黑板、圆,画圆的方法要分配给哪个对象呢?由于画圆需要使用到圆心和半径,圆心和半径显然是圆的属性,如果将它们在类中定义成了私有的成员变量,那么,画圆的方法必须分配给圆,它才能访问到圆心和半径这两个属性,人以后只是调用圆的画圆方法、表示给圆发给消息而已,画圆这个方法不应该分配在人这个对象上,这就是面向对象的封装性,即将对象封装成一个高度自治和相对封闭的个体,对象状态(属性)由这个对象自己的行为(方法)来读取和改变。一个更便于理解的例子就是,司机将火车刹住了,刹车的动作是分配给司机,还是分配给火车,显然,应该分配给火车,因为司机自身是不可能有那么大的力气将一个火车给停下来的,只有火车自己才能完成这一动作,火车需要调用内部的离合器和刹车片等多个器件协作才能完成刹车这个动作,司机刹车的过程只是给火车发了一个消息,通知火车要执行刹车动作而已。

 

抽象

抽象就是找出一些事物的相似和共性之处,然后将这些事物归为一个类,这个类只考虑这些事物的相似和共性之处,并且会忽略与当前主题和目标无关的那些方面,将注意力集中在与当前目标有关的方面。例如,看到一只蚂蚁和大象,你能够想象出它们的相同之处,那就是抽象。抽象包括行为抽象和状态抽象两个方面。例如,定义一个Person类,如下:

classPerson

{

           String name;

           int age;

}

人本来是很复杂的事物,有很多方面,但因为当前系统只需要了解人的姓名和年龄,所以上面定义的类中只包含姓名和年龄这两个属性,这就是一种抽像,使用抽象可以避免考虑一些与目标无关的细节。我对抽象的理解就是不要用显微镜去看一个事物的所有方面,这样涉及的内容就太多了,而是要善于划分问题的边界,当前系统需要什么,就只考虑什么。

 

继承

在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并可以加入若干新的内容,或修改原来的方法使之更适合特殊的需要,这就是继承。继承是子类自动共享父类数据和方法的机制,这是类之间的一种关系,提高了软件的可重用性和可扩展性。


多态

多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。多态性增强了软件的灵活性和扩展性。例如,下面代码中的UserDao是一个接口,它定义引用变量userDao指向的实例对象由daofactory.getDao()在执行的时候返回,有时候指向的是UserJdbcDao这个实现,有时候指向的是UserHibernateDao这个实现,这样,不用修改源代码,就可以改变userDao指向的具体类实现,从而导致userDao.insertUser()方法调用的具体代码也随之改变,即有时候调用的是UserJdbcDao的insertUser方法,有时候调用的是UserHibernateDao的insertUser方法:

UserDao userDao = daofactory.getDao(); 

userDao.insertUser(user);


1474898515444058446.png 什么是面向对象?

把数据及对数据的操作方法放在一起,作为一个相互依存的整体——对象。对同类对象抽象出其共性,形成类。类中的大多数数据,只能用本类的方法进行处理。类通过一个简单的外部接口与外界发生关系,对象与对象之间通过消息进行通信。程序流程由用户在使用中决定。

面向对象是一种程序设计方法,它以对象作为基本的单元来构建系统,它利用对象将系统的复杂性隐藏在对象里(也就是常说的封装),从而构建大型的工业级系统和大型系统(注意是工业及系统和大型软件系统而不是播放器等小型的系统)。面向对象包括三个过程:面向对象分析(OOA)、面向对象设计(OOD)、面向对象编程(OOP)。

1。什么是面向对象的分析?

  面向对象的分析指的是分析要开发的系统的各个方面,从而找出类和对象(不是你想有什么对象就有什么对象的)。

2.什么是面向对象的设计?

  是指我们设计出一些特殊的类(如:抽象类,目的:来表达系统中不同对象的共性)和机制(让系统的对象互相协作,提供系统的功能);

3.什么是面向对象的编程?

  是指我们用特定的面向对象编程语言来实现我们的设计,实现我们发现的对象和类。


使用面向对象的困难在于找出系统的对象和类很困难,这常常需要经验、洞察力、严密的逻辑思维能力和创造力(这是最重要的),以及设计特殊的类和机制很困难。但是一旦做好了分析和设计,一切都变得极其简单。所以大多数人都会选择使用面向过程而不是用面向对象。


不要以为面向对象就是你的教材里讲的那些东西,面向对象还有许许多多的概念,而这些概念常常被忽略、吴用。


1474898515444058446.png 简述 private、 protected、 public 修饰符的访问权限。


private : 私有成员, 在类的内部才可以访问。 

protected : 保护成员,该类内部和继承类中可以访问。 

public : 公共成员,完全公开,没有访问限制。 


public:不同包、同一包、类内都可用

private:类内

protected: 不同包的子类、同一包、类内都可用

不写时:同一包内、类内


1474898515444058446.png override与重载的区别


其实很本质的区别就是看函数特征:

覆写(Override)的两个函数的函数特征相同

重载(Overload)的两个函数的函数名虽然相同,但函数特征不同。

函数特征包括函数名,参数的类型和个数。


Override 是在继承的时候,如果你写的函数与要继承的函数函数特征相同,那么,加上这个关键字,在使用这个子类的这个函数的时候就看不见父类(或超类)的函数了,它被覆盖掉了。

比如:Derived继承了Base,Base里面有void A(int a)

那么如果你Derived里面觉得A写得不好或不适合这个类,你想重新再写一遍A里的代码,那么就写override void A(int a)这样,原来的那个函数就被你新写的这个覆盖掉了。

Overload 是重载,就是说函数名相同,函数特征不同,系统会根据你提供的参数来调相应的函数。

比如:void A(int a)和void A(int a,int b)

如果你用的是A(1)那么调的是第一个,如果是A(1,1)那么调的是第二个。


1474898515444058446.png super()与this()的区别?


This():当前类的对象,super父类对象。

Super():在子类访问父类的成员和行为,必须受类继承规则的约束

而this他代表当前对象,当然所有的资源都可以访问.

在构造函数中,如果第一行没有写super(),编译器会自动插入.但是如果父类没有不带参数的构造函数,或这个函数被私有化了(用private修饰).此时你必须加入对父类的实例化构造.而this就没有这个要求,因为它本身就进行实例化的构造.

而在方法中super和this使用的方法就差不多了.只不过super 要考虑是否能访问其父类的资源.


1474898515444058446.png 给定如下Java代码程序片断:


class A{
              public A(){
                     System.out.println(“A”);
              }
       }
 
       class B extends A{
              public B(){
                     System.out.println(“B”);
              }
 
              public static void main(String[] args){
                     B b=new B();
              }
       }

上述程序将()(单选)

 

a) 不能通过编译

b) 通过编译,输出为AB

c) 通过编译,输出为B

d) 通过编译,输出为A


答案 B 注意顺序先A再B,构造函数


1474898515444058446.png 给定JAVA代码如下,编译运行后,输出结果是()(单选)

public class test{
   static int i;
   public int test(){
    i++;
     return i;
  }
public static void main(String args[]){
 Test test=new Test();
  test.test();
   System.out.println(test.test());
  }
}

 

a) 0

b) 1 

c) 2 

d) 3

答案  C 在打印的方法中又调了一次方法


1474898515444058446.png 给定JAVA代码如下,关于super的用法,以下描述正确的是( )(单选)


class C extends B
{
    public C()
    {
         super();
    }
}

 

a) 用来调用类B中定义的super()方法

b) 用来调用类C中定义的super()方法

c) 用来调用类B中的无参构造方法

d) 用来调用类B中第一个出现的构造方法


答案  C 继承的特性


1474898515444058446.png 下面哪些说法是正确的()(多选)

 

a) 接口里可定义变量,并且变量的值不能修改

b) 任何情况下,类都不能被private修饰

c) 类可以被protected修饰

d) 接口不能实例化


答案  ACD  内部类是可以用private修饰的


1474898515444058446.png 下列哪一种叙述是正确的()(单选)

 

a) abstract修饰符可修饰属性、方法和类

b) 抽象方法的body部分必须用一对大括号{ }

c) 声明抽象方法,大括号可有可无

d) 声明抽象方法不可写出大括号


答案  D


1474898515444058446.png 在Java中,下面关于抽象类的描述正确的是()(多选) 

a) 抽象类可以被实例化

b) 如果一个类中有一个方法被声明为抽象的,那么这个类必须是抽象类

c) 抽象类的方法都必须是抽象的

d) 声明抽象类必须带有关键字abstract


答案  BD



1474898515444058446.png 代码题(用oop的思想编码,注意代码规范)


用java写一个微波炉,注意物品正加热时不能开门,带皮带壳食物不能被加热。


用Java写一个冰箱,注意家用冰箱多数分为冷冻柜和冷藏柜两个柜(冰箱随机)



Java语言程序设计试卷(一)

一、单项选择题(30分,每题1.5分,共20题)

1.以下选项中,合法的赋值语句是__________。

A) a = = 1; B) ++ i; C) a=a + 1= 5;  D) y = int ( i );

2.下列语句执行后,i的值是__________。

int i=10;

do { i-=2; } while( i>6 );

System.out.println(i);

A) 10 B) 8 C) 6 D)4

3.定义主类的类头时可以使用的访问控制符是__________。

A) private B) protected C) public D) private protected

4.对于一个三位正整数 n,取出它的十位数字k(k为整型)的表达式是__________。

A) k = n / 10 % 10 B) k = ( n - n / 100 * 100 )%10

C) k = n % 10 D) k = n / 10

5.下列语句序列执行后,k 的值是__________。

int i=10, j=18, k=30;

switch( j - i )

case 8 : k++;

case 9 : k+=2;

case 10: k+=3;

default : k/=j;

}

A) 31 B) 32 C) 2 D) 33

6.以下由 for 语句构成的循环执行的次数是__________。

for ( int i = 0; true ; i++) ;

A) 有语法错,不能执行 B) 无限次

C) 执行1次 D) 一次也不执行

7.对于构造函数,下列叙述不正确的是(      )。

 A、构造函数也允许重载。    

 B、子类无条件地继承父类的无参构造函数。

 C、子类不允许调用父类的构造函数。  

 D、在同一个类中定义的重载构造函数可以相互调用

8.在使用interface声明一个接口时,只可以使用(      )修饰符修饰该接口。

 A、private                          B、protected    

 C、private  protected               D、public

10.在Java中,存放字符串常量的对象属于(      )类对象。

   A、Character          B、String      C、StringBuffer       D、Vector

12.在编写异常处理的Java程序中,每个catch语句块都应该与(      )语句块对应,使得用该语句块来启动Java的异常处理机制。

   A、if  -  else      B、switch      C、try        D、throw

13.应用程序的main方法中有以下语句,则输出的结果是  (    )。

int  b[][]={{1,  2,  3},  {4,5},  {6,7}};

int  sum=0;

for(int  i=0;i<b.length;i++)  

{            

 for(int  j=0;j<b[i].length;j++)

{

     sum+=b[i][j];            

}            

}

System.out.println("sum="+sum);

A、  28          B、6          C、9              D、13  

14、下面的程序段执行后输出的结果是(  )。

     StringBuffer  buf=new  StringBuffer("Beijing2008");

     buf.insert(7,"@");

    System.out.println(buf.toString());

A、  Beijing@2008      B、  @Beijing2008    

C、  Beijing2008@      D、  Beijing#2008   

15.以下        不是Java合法的标识符。

A.girl      B._boy     C.8save      D.first_bg

16.Java语言的类间的继承关系是       。

A.多重继承    B.单重继承   C.多线程继承  D.`拒绝继承

17.Java源文件和编译后的文件扩展名分别为          。

A、.class和 .java  B、.java和 .class  C、.class和  .class   D、.java和 .java

18.实现线程体的方式除了继承Thread类,还可以实现      接口。

A、Cloneable     B、Runnable     C、Iterable      D、Serializable

19.给出下列的程序,其叙述正确的是

public class Man

static int arr[] = new int[10]; 

public static void main(String a[])

System.out.println(arr[1]); 

}

A)编译时将发生错误    B)编译时正确但是运行时出错

C)输出为0             D)输出为null

20.有一个test.java源程序,程序如下,程序的输出结果为(  )

   class A

{

public static void main(String arg[])

{

System.out.println("This is a Test!");

}

}

A、编译出错              B、This is a Test!

C、运行时抛出异常        D、能通过编译,但是没有输出结果

二、填空题(30分,每空2分,共15个空)

1.在Java程序中,通过类的定义只能实现单重继承,但通过       的定义可以实现多重继承关系。

2.设x = 2 ,则表达式 ( x + + )* 3 的值是        。

3.Java中的数据流包括字节流和         流两种。

4.Java程序主要分为两种类型:             和               。

5. 在类声明中提供类标志的关键字是         ;Java程序用{ }将多条语句组合在一起,语句之间必须用        隔开。

6.一个Java源程序编译后会生成一个扩展名为          的字节码文件。

7.通常类名可由字母、数字、下划线以及      组成,但类名的第一个字符不能 是         。

8. 当一个方法中有多个参数时,参数之间是用           隔开。

9. 布尔型的数据不对应于任何整数值,它只有两个值       和        。

10. 变量的数据类型转换分为自动类型转换和            两种。设 x = 2 ,则表达式 ( x + + )/3 的值是         。

三、分析下列程序,写出运行结果(20分,每题10分,共2题)

【程序1】//Pro1.java 

class A

{

int x=100;

}

class Pro1 extends A

{

int x=200;

void prt()

{

System.out.println("Property_x="+x);

}

public static void main(String args[])

{

new Pro1().prt();

}

}

运行结果为:






【程序2】//Pro2.java 

public  class  Pro2 

{

public static void main(String[] args) 

       {

int num=1,max=20;

while (num++ <max)

           {

if (num%2= =0)

System.out.print(num+"  ");

 }

}

}  

运行结果为:




四、编程题(20分)

说明:程序编写要规范,语句要有层次关系。

1.(8分)打印如下图形。

*

***

*****

*******

*********

程序: