一、继承、多态、方法重写
1.继承
继承就是在一个现有类的基础上,通过添加新的方法或者重定义已有的方法(重写)的方式,产生一个新的类。
继承是面向对象的三个基本特征——封装、继承和多态之一,我们在使用java编写的每一个类都是在继承,因为在java语言中,java.lang.Object类是所有类的父类,如果我们新定义的一个类没有明确的指定是继承哪一个父类,那么java就默认它继承Object类。
继承的益处:通过继承可以降低工作量和程序的复杂性,提高程序可扩展性。
继承到的东西:通过继承,子类继承到了父类中的所有公有属性和公有方法。
继承的关键字:extends
类的继承格式:public class 子类名 extends 父类名{}
在java中,类之间可以通过extends实现继承,接口之间也可以通过extends实现继承,不同的是,一个类只能继承一个类,而一个接口则可以继承多个接口。
接口的继承格式:public interface子接口名 extends 父接口名,.......{}
2.多态
多态即“一个接口,多种实现”,在父类中声明的方法,可以在子类中进行重写 (声明为final的除外),这样,父类的引用在引用子类对象时,可以做出不同的响应。
多态存在的必要条件:存在继承关系和方法重写。
Jvm(java虚拟机)在调用方法时,是不确定调用的是子类的方法还是父类的方法,只有在调用的瞬间才知道调用的是谁的方法。
多态的作用:(1)、应用程序不必为每一个派生类编写功能调用,只需要对抽象基类进行处理即可,这样大大提高了程序的可复用性。
(2)、派生类的功能可以被基类的方法或引用的变量所调用,这样提高了程序的可扩充性和可维护性。
3.方法重写
方法的重写:即保持方法的定义不变,但是方法的内部实现和父类的不同。
实现方法重写的必要条件:(1)、必须要存在继承关系
(2)、子类中要重写的方法名必须要和父类的方法名保持一致,子类重写方法所带的参数要和父类方法所带的参数一致。
二、数据类型、值传递和引用传递的区别?String是什么传递?
1.数据类型
Java中的数据类型可分为基本数据类型(八种)和引用类型。
基本数据类型:
字节型 byte
整型int
长整型 long
短整型 short
字符型 char
单精度 float
双精度 double
布尔型 boolean
引用类型:主要有class(类类型,包括自己定义的类) interface 和数组。
2.值传递和引用传递的区别
值传递是对目标变量的值重新拷贝一份,传到新的变量中,这样形成的是两份独立的变量,如果对其中一个变量作改变是不会影响到另一个变量的值的。而引用传递则是指在创建对象时,对象名保存的是对象实例在内存中的地址,如果对对象名做修改,对象实例是不会发生改变的;
值传递是通过值的形式来传递的,而引用传递是传递地址来实现的;
值传递适用于所有的基本数据类型,而引用传递适用于所有的引用类型。
3.String是什么传递?
因为String属于引用类型,所以String传递属于引用传递。
三、set、list、map如何遍历,他们分别有哪些子类,map中是否可以放入null的key或者value ?Set和list呢?
Set和map中的对象都是无序的,不能通过索引来取得其中的对象,只能先通过他们各自的对象得到迭代器,然后通过迭代器完成遍历;list中的对象都是有序的,因此可以直接通过索引List.get(Index)来完成遍历。
Set的子类有:AbstractSet、ConcurrentSkipListSet、JobStateReasons、CopyOnWriteArraySet、EnumSet、HashSet、LinkedHashSet、TreeSet.
List的子类有:AbstractList、ArrayList、AbstractSequentialList、AttributeList、CopyOnWriteArrayList、LinkedList、RoleList、
RoleUnresolvedList、Stack、Vector.
Map的子类有:AbstractMap、Attributes、
AuthProvider、ConcurrentHashMap、ConcurrentSkipListMap、EnumMap、HashMap、Hashtable、IdentifyHashMap、
LinkedHashMap、PrinterStateReasons、Properties、Provider、RenderingHints、SimpleBindings、TabularDataSupport、TreeMap、UIDefaults、WeakHashMap.
Map中可以放入null的key和value;Set中可包含null,但最多只有一个,不然就造成了复杂,这和集合的定义冲突;List中队null不限制,所以可以放多个null。
四、Swing界面相关、swing组件的继承体系图,事件监听器体系图
Swing界面相关的继承体系图:
Swing组件的继承体系图:
事件监听器体系图:
五、递归和循环的区别?
递归:即方法调用自身的方法。
循环:当满足某个条件时,让程序不停的执行同一个方法。
递归的调用代码简洁,但是效率低,因为每一次调用都要进行压栈、保护现场和恢复现场等操作,而循环的调用的效率比递归要高,但是代码相对要复杂。
六、I/O流继承体系结构图和分类、文件复制的实现和原始数据类型读写
1.I/O流继承体系结构图和分类?
I/O流继承体系结构图:
I/O流分类:java.io包中定义了多个流类型(类或者抽象类)来实现I/O功能,可从不同的角度对其分类:
按数据流的流动的方向不同可分为输入流和输出流;
按处理数据单位不同可分为字节流和字符流;
按功能不同可分为节点流和处理流。
2.文件复制的实现和原始数据类型读写?
文件复制的实现:文件复制其实是将一个文件以数据流的形式,通过输入数据流(InputStream)将这些数据流输入到一个中间容器(虚拟的容器)中(),在通过输出数据流(OutputStream)将中间容器中的数据流输出到目标地址的文件中,这样一个文件的复制就完成了。
原始数据类型读写:DataInputStream和DataOutputStream这两种流主要用来读写指定的数据类型。其中DataInputStream可以完成指定数据类型的读取,而DataOutputStream完成指定数据类型的写入。首先通过DataOutputStream中的write()方法将指定的数据类型写入到指定的目标地址中,然后再使用DataInputStream中的read()方法,读出刚刚写入到目标地址中的数据。
七、线程有几种创建方式,线程在程序中有几种状态?
线程主要有三种创建方式:第一种是通过继承Thread类,并重写run()方法完成一个线程的创建;第二种是通过定义一个实现Runnable接口的,实现他的run()方法,来完成线程的创建;第三种方法是以匿名内部类的方式创建,即可以在一个方法中创建线程,当方法被调用时,线程即启动。
线程在程序中有七种状态:初始状态、可运行状态、运行状态、终止状态、阻塞状态、锁池状态、等待队列。
1.线程的实现有两种方法,不管通过哪一种方法,当我们new了一个对象后,线程就进入初始状态;
2.当该对象调用了start方法,就进入可运行状态;
3.进入可运行状态好后,当该对象被操作系统选中,获得cpu时间片就会进入运行状态;
4.运行状态后情况就复杂了
(1)、run()方法或者main()方法结束后,线程进入终止状态;
(2)、当线程调用了本身的sleep()方法或者其他线程的join()方法,就会进入阻塞状态(该状态即停止当前线程,但并不释放所占有的资源)。当sleep()结束或者join()结束后,该线程进入可运行状态,继续等待os分配时间片;
(3)、线程调用了yield()方法,意思是放弃当前获得的CPU时间片,回到可运行状态,这时与其他进程处于同等竞争状态,OS有可能会接着又让这个进程进入运行状态;
(4)、当线程刚进入可运行状态(注意,还没运行),发现将要调用的资源被synchroniza(同步),获取不到锁标记,将会立即进入锁池状态,等待获取锁标记(这时的锁池里也许已经有了其他线程在等待获取锁标记,这时它们处于队列状态,既先到先得),一旦线程获得锁标记后,就转入可运行状态,等待OS分配CPU时间片;
(5)、当线程调用wait()方法后会进入等待队列(进入这个状态会释放所占有的所有资源,与阻塞状态不同),进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒(由于notify()只是唤醒一个线程,但我们由不能确定具体唤醒的是哪一个线程,也许我们需要唤醒的线程不能够被唤醒,因此在实际使用时,一般都用notifyAll()方法,唤醒有所线程),线程被唤醒后会进入锁池,等待获取锁标记。
八、Static的用法和注意事项,==和equals的区别?
static用法:
Static指的是静态属性,可以是静态变量可以是静态方法,当一个变量或者方法定义为静态的时候,则可直接通过类名调用使用,而不需要创建对象。
static注意事项:
1.当一个方法被定义为静态的方法是,它所能使用的变量的类型也只能是定义为静态的变量,但是一个非静态的方法却可以使用静态的变量;
2.一个程序很重要的一点就是可重复性,而static的“记忆性”破环了这种可重复性,造成不同时刻运行程序的结果不同;
3.普通的local变量的存储空间分配在stack上,一次每次调用方法时,分配的空间都可能不一样,而static具有全局唯一性的特点,因此每次调用时,都指向同一块内存,这就造成一个很严重的问题——不可重入性。
==和equals的区别:
对于基本数据类型的变量,==判断两个变量的值是否相等;而equal不能用于基本数据类型的,只能用于类变量,对于基本数据类型要用其包装类进行比较。
对于对象变量,==比较的是等号两边对象在内存中存放的地址是否相等,而equals比较的是来两个对象的值是否相等,不是比较两个变量的地址是否相等。