您的位置:首页 > 编程语言 > Java开发

JAVA基础部分(三)

2016-05-20 11:05 253 查看
1、抽象类和接口

抽象类

  抽象方法必须用abstract关键字进行修饰,如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用abstract关键字修饰.
  抽象类就是为了继承而存在的,它和普通类一样可以通过拥有成员变量和方法.
  抽象方法必须为public或protected,如果为private则不能被子类继承,默认为public.
  抽象类不能用来创建对象,
  如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法,如果子类没有实现父类的抽象方法,则必须定义为abstract类

接口

  接口可以含有变量和方法,接口中的变量会被隐式的指定为public static final变量且只能是这个类型,方法会被隐式的定义为public abstract方法也且只能是该类型.
   

抽象类和接口的区别

抽象类可以提供成员方法的实现细节,接口中只能存在public abstract方法;
抽象类中的成员变量可以是各种类型的,而接口中的变量只能是public static final类型;
接口中不能含有静态代码块和静态方法,而抽象类可以;
一个类可以实现多个接口但是只能继承一个抽象类.
2、面向对象的特征有哪些方面
 1.封装:

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

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

 2.抽象:

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

3、java中实现多态的机制是什么?

  靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。

4、说出一些常用的类,包,接口,请各举 5 个

  常用的类:BufferedReader、BufferedWriter、FileReader、FileWirter、String、Integer、java.util.Date、List、HashMap

  常用的包:java.lang、java.io、java.util、java.sql

  常用的接口:Remote、List、Map、Document、Servlet

5、什么是 java 序列化,如何实现 java 序列化?或者请解释 Serializable 接口的作用。

  我们有时候将一个 java 对象变成字节流的形式传出去或者从一个字节流中恢复成一个 java对象,例如,要将 java 对象存储到硬盘或者传送给网络上的其他计算机,这个过程我们可以自己写代码去把一个 java 对象变成某个格式的字节流再传输,但是,jre 本身就提供了这种支持,我们可以调用 OutputStream 的 writeObject 方法来做,如果要让 java 帮我们做,要被传输的对象必须实现 serializable 接口,这样,javac 编译时就会进行特殊处理,编译的类才可以被 writeObject
方法操作,这就是所谓的序列化。需要被序列化的类必须实现Serializable 接口,该接口是一个 mini 接口,其中没有需要实现的方法,implements Serializable 只是为了标注该对象是可被序列化的。

  例如,在 web 开发中,如果对象被保存在了 Session 中,tomcat 在重启时要把 Session 对象序列化到硬盘,这个对象就必须实现Serializable 接口。如果对象要经过分布式系统进行网络传输或通过 rmi 等远程调用,这就需要在网络上传输对象,被传输的对象就必须实现Serializable 接口。

6、GC 是什么?为什么要有 GC?

GC 是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java 提供的 GC 功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java 语言没有提供释放已分配内存的显示操作方法。

7、垃圾回收的特点

  不允许程序员直接控制内存空间的使用,内存空间的分配和回收都有JRE负责在后台自动运行;

6、垃圾回收在什么时候运行

  一般在CPU空闲或者空间不足的时候自动运行

8、GC 是什么?为什么要有 GC?什么样的对象符合垃圾回收条件

  该对象不再被访问时,不能被任何活动的线程访问.

9、Java内存泄露

  特点:
  内存中存在该对象的引用;对象是无用的;
  这些对象就可以判定为Java中的内存泄露,而且这些对象不能被GC回收

10、JVM内存区域组成:栈内存和堆内存

栈内存在函数中定义的基本类型变量和对象的引用变量都是在函数的栈内存中分配内存;
堆内存用来存放由new创建的对象和数组以及对象的实例变量;
在函数中定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后该空间被自动释放,在堆中分配的内存有GC来管理;
  比较:

堆内存的优势是可以动态分配内存大小,生存期也不必告诉编译器,因为是运行时动态分配的,所以速度慢;
栈内存的优势是速度快,数据可以共享,缺点是大小和生存期确定,不够灵活.
11、Java引用类型

强引用:如 A a= new A().如果对象具有强引用,那么GC绝不会回收它,当内存空间不足时,JVM宁愿抛出OutOfMemoryError错误,使程序异常终止也不会随意回收具有强引用的对象;
软引用:如果内存空间充足,则GC就不会回收它,如空间不足就会回收这些对象;
弱引用:一旦被垃圾回收器线程发现,不管当前内存空间是否充足,都会被回收;
虚引用:如果一个对象仅持有虚引用,则在任何时候都可能被垃圾回收器回收.
12、Java反射机制

  反射机制指的是程序在运行时能够获得自身的信息.在Java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息.例如使用jdbc时加载驱动class.forname("com.mysql.jdbc.Driver").
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: