关闭

java面向对象(面试题)

标签: java
740人阅读 评论(0) 收藏 举报
分类:

1.super()和this()的区别?

this():当前类的对象,super父类对象。
super():在子类访问父类成员和行为,必须承受继承规则的约束,而this代表当前对象,所有的资源都可以访问。在构造函数中,如果第一行没有写super(),编译器会自动插入,但是如果弗雷没有无参构造函数,或这个函数被私有化了,此时必须加入对父类的实例化构造。而this没有此类要求,它本身就进行了实例化的构造。

2. 作用域 public,protected,private,以及不写时的区别?

public:不同包、同一包、类内都可用
private:类内
protected:不同的子类、同一包、类内都可用
不写时:同一包内、类内

3. JAVA 的事件委托机制和垃圾回收机制

java事件委托机制,一个源产生一个事件并将它送到一个或多个监听器那里。在这种方法中,监听器简单的等待,直到它收到一个时间。一旦事件被接受,监听器将处理这个事件,然后返回。
垃圾回收机制(GC),垃圾收集是将分配给对象但不再使用的内存回收或释放的过程。如果一个对象没有指向它的引用或者其赋值为null,JVM的垃圾回收机制就会自动对此对象进行垃圾回收。

4. 什么是 java 序列化,如何实现 java 序列化?

序列化:
可以将一个对象保存到一个文件,通过流的方式在网络上传输,可以将文件的内容读取,转化为一个对象。处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后
的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。
序列化的实现:
将需要被序列化的类实现 Serializable 接口,该接口没有需要实现的方法, implements Serializable 只是为了标注该对象是可被序列化的,然后使用一个输出流(如: FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用 ObjectOutputStream 对象的 writeObject(Object obj)方法就可以将参数为 obj 的对象写出(即保存其状态),要恢复的话则用输入流。

5. 一个”.java”源文件中是否可以包括多个类(不是内部类)?有什么限制?

可以。如果这个类的修饰符是public,其类名与文件名必须相同。

6. 排序都有哪几种方法?请列举。用 JAVA 实现一个快速排序?

这里写图片描述

7. Overload 和 Override 的区别。

overload(重载),一个类多个方法,名称相同,参数个数类型不同
override(重写),子类覆盖父类的方法,将子类传与父类的引用调用的还是子类的方法。

8. 如在 COLLECTION 框架中, 实现比较要实现什么样的接口?

coleection框架中实现compareble接口和comparator接口

9. 编程:编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如”我 ABC”4,应该截为”我 AB”,输入”我 ABC 汉 DEF”, 6,应该输出为”我 ABC”而不是”我 ABC+汉的半个”。

public class Mysplit {
    public static void main(String[] args) throws Exception{
        String source = "abc卫门agag";
            split(source, 5);
    }
    public static void split(String source,int num) throws Exception{
        int k = 0;
        String temp = "";
        for (int i = 0;i < source.length() ;i++ ) {
            byte[] b = (source.charAt(i)+"").getBytes();
            k += b.length;
            if (k > num) {
                break;
            }
            temp += source.charAt(i);
        }
        System.out.println(temp);
    }
}

10.抽象类和接口的区别?

(1)接口可以被多重 implements,抽象类只能被单一 extends
(2)接口只有定义,抽象类可以有定义和实现
(3)接口的字段定义默认为:public static final, 抽象类字段默认是”friendly”(本包可见)
当功能需要累积时用抽象类,不需要累积时用接口。

11.什么是类的反射机制?

通过类(Class 对象),可以得出当前类的 fields、 method、 construtor、 interface、superClass、 modified 等,同时可以通过类实例化一个实例、设置属性、唤醒方法。 Spring 中一切都是返射、 struts、 hibernate 都是通过类的反射进行开发的

12.类的返射机制中的包及核心类?

java.lang.Class
java.lang.refrection.Method
java.lang.refrection.Field
java.lang.refrection.Constructor
java.lang.refrection.Modifier
java.lang.refrection.Interface

13.得到 Class 的三个过程是什么?

  • 对象.getClass()
  • 类.calss或Integer.type(int) Integer.class(java.lang.Integer)
  • Class.forName();

14.如何将数值型字符转换为数字( Integer, Double)?

Integer.parseInt("1234");
Double.parseDouble("0.12");

15.如何格式化日期?

SimpleDateFormate sdf = new SimpleDateFormate("yyyy-MM-dd hh:mm:ss");
Date date = new Date();
String str = sdf.format(date);
Java.util.Date d1 = sdf.parse("yyyy-mm-dd");

16.java 中会存在内存泄漏吗,请简单描述.

会。int类型的数值有一定的范围,如果超出数值范围,结果就是内存泄漏。

17.JAVA 语言如何进行异常处理,关键字: throws,throw,try,catch,finally 分别代表什么意义?在 try 块中可以抛出异常吗?

Try:执行部分,产生异常
Catch:捕捉异常
Finally:不管有没有异常都执行
Throws:在方法声明处声明要抛出的异常,调用者必须对其进行处理。
Throw:抛出一个异常,在 try 中可以抛出异常, 一般与声明的异常相同。自定义异常要继承于 Exception 或 Exception 的子类

18.String and StringBuffer 的区别?

String:长度给定不可变,当多个字符串联合时要先转为StringBuffer,再联合,速度慢。
StringBuffer:长度可变,可以将多个字符串值直接联合,效率高

19.用 java 代码编写堆栈

public class Stacks {
    static String[] months = {"Jan","Feb","Mar","Apr","May",
            "June","Aug","Sep","Oct","Nov","Dec"};

    public static void main(String[] args) {
        Stack stack = new Stack();
        //进栈,先进元素压入栈底,最后的元素在栈顶
        for (int i = 0; i < months.length; i++) {
            stack.push(months[i]+"");
        }
        System.out.println("stk = " + stack);

        stack.addElement("************");
        System.out.println("element 5 = " + stack.elementAt(5));
        System.out.println("popping elements: ");
        //出栈后进先出,栈顶元素最先被输出
        while (!stack.empty()) {
            System.out.println(stack.pop());
        }
    }
}

20.集合的通用方法有那些?通用方法是什么?(操作)

集合 List 的遍历方法有:
    Iterator:
    Enumeration
    For
    Get
    set

Collection 的通用方法有:
    Iterator()
    Add()
    Clear();
    remove()

21.说出 ArrayList,Vector, LinkedList 的存储性能和特性 HashMap 和 Hashtable 的区别

  • ArrayList Vector:以数组的方式存储,增、删慢,查、改快
  • ArrayList:线程不安全,速度快ArrayList:线程安全,速度慢(synchoronized)
  • LikedList: 以单链表的方式存储,增、删快,查、改慢
  • HashMapHashtable 都实现的 Map 接口,HashTable 线程安全,* HashMap* 线程不安全。

22.Collection 和 Collections 的区别。

Collection 是集合的根接口, 其下有 set 及 list
Collections 是集合的算法。

23.Set 里的元素是不能重复的, 那么用什么方法来区分重复与否呢? 是用==还是 equals()? 它们有何区别?用contains 来区分是否有重复的对象。还是都不用。

在比较时先调用 hashCode 方法,如果不相同,证明不相等。
如果相同,再调用 equals 方法,如果 equals 方法相同,证明相等,不相同, 证明不相等。
==:主要用在基本数据类型及引用
Equals:主要是对象或对象引用的比较。
集合中是否包含某一个元素用 contains 来判断。

24.List, Set, Map 是否继承自 Collection 接口?

List,set 继承于 Collection
Map 没有继承于 Collection,其相对是独立的。
属于 Collection 类型的对象, 可以通过构造函数将一个集合构造成另外一个集合。

25. final, finally, finalize 的区别?

final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
finally 是异常处理语句结构的一部分,表示总是执行。
finalize* Object* 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。

26.heap 和 stack 有什么区别?

栈(stack)是一种线形集合,其添加和删除元素的操作应在同一段完成。栈按照后进先出的方式进行处理。
堆(heap)是栈的一个组成元素

27.short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?

short s1 = 1; s1 = s1 + 1; ( s1+1 运算结果是 int 型,需要强制转换类型) short s1 = 1; s1 += 1;(可以正确编译)

28.是否可以继承 String 类?

String 类是final类,不能被继承

29.try {}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会不会被执行,什么时候被执行,在 return 前还是后?

会执行,在return前执行

30.四种会话跟踪技术。

Cookie Session Hidden url 重写

31.编程题: 写一个 Singleton 出来。

//1.饿汉式单例,线程安全
//饿汉式单例类.在类初始化时,已经自行实例化 
public class Singleton1 {
    //私有的默认构造子
    private Singleton1() {}
    //已经自行实例化 
    private static final Singleton1 single = new Singleton1();
    //静态工厂方法 
    public static Singleton1 getInstance() {
        return single;
    }
}

//2.懒汉式单例,线程不安全
//懒汉式单例类.在第一次调用的时候实例化 
public class Singleton2 {
    //私有的默认构造子
    private Singleton2() {}
    //注意,这里没有final    
    private static Singleton2 single=null;
    //静态工厂方法 
    public synchronized  static Singleton2 getInstance() {
         if (single == null) {  
             single = new Singleton2();
         }  
        return single;
    }
}

//3.登记式单例(忽略,一般不用)
//登记式单例类.
//类似Spring里面的方法,将类名注册,下次从里面直接获取。
public class Singleton3 {
    private static Map<String,Singleton3> map = new HashMap<String,Singleton3>();
    static{
        Singleton3 single = new Singleton3();
        map.put(single.getClass().getName(), single);
    }
    //保护的默认构造子
    protected Singleton3(){}
    //静态工厂方法,返还此类惟一的实例
    public static Singleton3 getInstance(String name) {
        if(name == null) {
            name = Singleton3.class.getName();
            System.out.println("name == null"+"--->name="+name);
        }
        if(map.get(name) == null) {
            try {
                map.put(name, (Singleton3) Class.forName(name).newInstance());
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
        return map.get(name);
    }
    //一个示意性的商业方法
    public String about() {    
        return "Hello, I am RegSingleton.";    
    }    
    public static void main(String[] args) {
        Singleton3 single3 = Singleton3.getInstance(null);
        System.out.println(single3.about());
    }
}

32.描述一下 JVM 加载 class 文件的原理机制?

JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader是一个重要的Java运行时系统组件,它负责在运行时查找和装入类文件的类。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:49958次
    • 积分:964
    • 等级:
    • 排名:千里之外
    • 原创:46篇
    • 转载:8篇
    • 译文:0篇
    • 评论:4条
    最新评论