java面试题(八)

12、静态变量和实例变量的区别?

   1)语法上的区别

  1. 静态变量也称类变量它是由static修饰的变量
  2. 实例变量不是由static修饰的

   2)运行时的区别

  1. 静态变量在程序运行时就会被创建并加载到内存
  2. 实例变量是对象的属性必需等对象被创建以后才会分配内存空间才能够被使用

    3 ) 作用范围的区别

  1. 静态变量作用于整个类被所有成员所共享,其中一个对象将它值改变,其他对象得到的就是改变后的结果;
  2. 实例变量则属对象私有,某一个对象将其值改变,不影响其他对象; 

13、是否可以从一个static方法内部发出对非static方法的调用?

    答:

        不可以从一个static方法内部发出对非static方法的调用,因为由static修饰的方法和变量是在程序加载时就会被创建并分配内存空间,而非static方法必须等对象被创建后才会被创建,这时在static方法内访问是找不到这个方法的所以不能访问内部不能直接去访问和操作非static修饰的变量和方法

14、Integer与int的区别

   答:

       1、Integer是int的包装类,int则是java的一种基本数据类型 
       2、Integer变量必须实例化后才能使用,而int变量不需要 
      3、Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值 
      4、Integer的默认值是null,int的默认值是0

       关于Integer和int的比较 
1、由于Integer变量实际上是对一个Integer对象的引用,所以两个通过new生成的Integer变量永远是不相等的(因为new生成的是两个对象,其内存地址不同)。

 

2、Integer变量和int变量比较时,只要两个变量的值是相等的,则结果为true(因为包装类Integer和基本数据类型int比较时,java会自动拆包装为int,然后进行比较,实际上就变为两个int变量的比较)

 

3、非new生成的Integer变量和new Integer()生成的变量比较时,结果为false。(因为非new生成的Integer变量指向的是java常量池中的对象,而new Integer()生成的变量指向堆中新建的对象,两者在内存中的地址不同)

 

4、对于两个非new生成的Integer对象,进行比较时,如果两个变量的值在区间-128到127之间,则比较结果为true,如果两个变量的值不在此区间,则比较结果为false

15、Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

      Math.round(11.5) = 12   ;      Math.round(-11.5) = -11   ;

    Math.round()方法是将参数值加0.5后向下取值(四舍五入),与之相关的还有Math.floor();Math.cell ();它们分别是向下取整和向上取整

17、请说出作用域public,private,protected,以及不写时的区别

 1)public:

     表示公共的访问权限,作用域最大,在同一个类中,同一个包中,不同包子类中,任何地方都能够被访问

  2)private:

     私有的访问权限,同一个类中的内部能够互相访问,而其它任何地方都不能访问

  3)protected:

     受保护的权限,在类的内部,同一个包中,不同包子类中能够被访问,如果不同包的类想调用有protected修饰的方法或变量那么这个类必须是这些成员所属类的子类

  4)default:

  默认的访问权限也就是不写时的权限,在类的内部和同一个包中的类能够相互访问

18、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?

   1)、定义上的区别

        方法的重载是指方法名相同,参数列表不同,而Override即重写是指在继承关系中,方法名和参数列表以及方法的返回值相同并且不扩大父类的访问权限

     重载的特点:

  1.         方法名相同
  2.        参数列表不同:a、参数的个数不同,b、参数的类型不同,c、参数的类型顺序不同
  3.        与方法的返回值无关

     重写的特点

  1.    方法名相同
  2.   参数列表完全相同 
  3.   返回值的类型相同
  4.   不能够扩大父类的访问权限

      

19、构造器Constructor是否可被override?

 

因为构造方法是默认的修饰符只能在同一个类中被访问而子类中无法访问,所以构造器Constructor不能被继承,因此不能重写Override,但可以被重载Overload。

Constructor不能被继承,所以Constructor也就不能被override。每一个类必须有自己的构造函数,负责构造自己这部分的构造。子类不会覆盖父类的构造函数,相反必须负责在一开始调用父类的构造函数

22、面向对象的特征有哪些方面

面向对象的编程语言有封装、继承 、抽象、多态等4个主要的特征。

1封装: 封装是保证软件部件具有优良的模块性的基础,封装的目标就是要实现软件部件的“高内聚、低耦合”,防止程序相互依赖性而带来的变动影响。在面向对象的编程语言中,对象是封装的最基本单位,面向对象的封装比传统语言的封装更为清晰、更为有力。面向对象的封装就是把描述一个对象的属性和行为的代码封装在一个“模块”中,也就是一个类中,属性用变量定义,行为用方法进行定义,方法可以直接访问同一个对象中的属性。通常情况下,只要记住让变量和访问这个变量的方法放在一起,将一个类中的成员变量全部定义成私有的,只有这个类自己的方法才可以访问到这些成员变量,这就基本上实现对象的封装,就很容易找出要分配到这个类上的方法了,就基本上算是会面向对象的编程了。把握一个原则:把对同一事物进行操作的方法和相关的方法放在同一个类中,把方法和它操作的数据放在同一个类中。 

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

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

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

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值