模拟面试复习(一)

模拟面试复习

面向对象有哪些特征?

面向对象的特征包括抽象、继承、封装和多态。

1)抽象。抽象就是忽略一个主题中与当前目标无关的邓些方面,以便更充分地注意与当前
目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分
细节。抽象包括两个方面:一是过程抽象;二是数据抽象。
2)继承。继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表
述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承、新类继承
了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类),派生
类可以从它的基类郡里继承方法和实例变量,并且派生类可以修改或增加新的方法使之更
适合特殊的需要。
3)封装。封装是指将客观事物抽象成类,每个类对自身的数据和方法实行保护:类可以把
自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏.
4)多态。多态是指允许不同类的对象对同一消息作出响应。多态包括参数化多态和包含多
态。多态性语言具有灵活、抽象、行为共享、代码共享等优势,很好地解决了应用程序函
数同名问题

多态的实现机制

多态是面向对象程序设计中代码重用的一个重要机制,它表示当同一个操作作用在不同对
象时,会有不同的语义,从而会产生不同的结果

  • 方法的重载(overload):重载是指同一个类中有多个同名的方法,但这些方法有着不同的
    参数,因此在编译时就可以确定到底调用哪个方法,它是一种编译时多态。

  • 方法的覆盖(override):。在 Java 语言中,基类的引用变量不仅可以指向基类的实例对象,也可
    以指向其子类的实例对象。同样,接口的引用变量也可以指向其实现类的实例对象,而程序调用
    的方法在运行期才动态绑定(绑定指的是将一个方法调用和一个方法主体连接到一起),就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。通过这种动态绑定的方法实现了多态。由于只有在运行时才能确定调用哪个方法,因此通过方法覆盖实现的多态也可以被称为运行时多态,

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

静态变量也叫类变量,这种变量前加了static修饰符。可以直接用类名调用,也可以用对象调用,而且所有对象的同一个类变量 都是共享同一块内存空间。

实例变量也叫对象变量,这种变量没有加static修饰符。只能通过对象调用, 而且所有对象的同一个实例变量是共享不同的内存空间的。

区别在于:
静态变量是所有对象共有的,某一个对象将它的值改变了,其他对象再去获取它的值,得到的是改变后的值;
实例变量则是每一个对象私有的,某一个对象将它的值改变了,不影响其他对象取值的结果,其他对象仍会得到实例变量一开始就被赋予的值。

Static 关键字有哪些作用?

Static 有两种作用: 第一, 为某特定数据类型或对象分配单一的存储空间,而与创建对象的个数无关。 第二, 实现某个方法或属性与类而不是对象关联在一起。 Static 主要是有 4 种使用情况: Static 修饰成员变量:用 static 修饰的变量称之为静态变量或者也叫类变量/全局变量。静态变量 是随着类的加载而加载到方法区中的静态区,并且在静态区中赋予了初始值。静态变量是在对 象之前产生,所以可以不通过对象来调用,而是通过类来调用,所以可以通过类名.静态变量的 方式调用静态变量。由于每个对象在堆内存中存储的是静态变量在静态区中的地址,所以所有 的对象本质上共用一个静态变量。 Static 修饰成员方法:用static 修饰的方法就称之为静态方法,也叫类方法。静态方法在类加载 的时候加载到了方法区中的静态区,在调用的时候到栈内存中执行。—静态方法是先于对象而 存在的。静态方法可以通过类名.方法名的方式来调用执行。 静态代码块:静态代码块在类中是独立于成员变量和成员方法的代码块。它不在任何一个方法 体内,jvm 在加载类时会执行静态代码块,静态代码块是先于构造代码块执行。静态代码块在 类加载的时候执行,只执行一次。 静态内部类:静态内部类是指被声明为静态内部类,它可以不依赖与外部类实例对象而被实例 化,而通常的内部类需要在外部类实例化后才能实例化。静态内部类不能与外部类有相同的名 字,不能访问外部类的普通成员变量,只能访问外部类中的静态成员和静态方法

类有哪三个基本特性?各特性的优点?

类具有封装性、继承性和多态性。

封装性:类的封装性为类的成员提供公有、缺省、保护和私有等访问权限,目的是隐藏类中的私有变量和类中方法的实现细节。

继承性:允许通过继承原有类的某些特性或全部特性而产生全新的类,原有的累称为父类,产生的新类称为子类。子类不仅可以直接继承父类的共性,而且也可以创建它特有的个性。

多态性:是指在基类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同行为,多态性有两种表现形式:重载和覆盖。

简单讲一下java的跨平台原理

java源程序(.java文件)通过编译器编译成为Class文件(字节码文件),而它的class文件是基于字节码(以byte为单位存储的文件)的,而字节码文件是描述程序要运行的的虚指令的集合,这些虚指令的集合与任何的平台无关,Java虚拟机认识它(只要在不同的平台下部署相应的jre,运行jvm!就可以了)

有了基本数据类型,为什么还需要包装类型?

我们知道Java是一个面相对象的编程语言,基本类型并不具有对象的性质,为了让基本类型也具有对象的特征,就出现了包装类型(如我们在使用集合类型Collection时就一定要使用包装类型而非基本类型),它相当于将基本类型“包装起来”,使得它具有了对象的性质,并且为其添加了属性和方法,丰富了基本类型的操作。
另外,当需要往ArrayList,HashMap中放东西时,像int,double这种基本类型是放不进去的,因为容器都是装object的,这是就需要这些基本类型的包装器类了。

ArrayList和LinkedList的区别?

1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

讲一下HashMap和HashTable的区别?

在Java 2以前,一般使用Hashtable来映射键值和元素。为了使用Java集合框架,Java对Hashtable进行了重新设计,但是,为了向后兼容保留了所有的方法。Hashtable实现了Map接口,除了Hashtable具有同步功能之外,它与HashMap的用法是一样的。·
在使用时一般是用ArrayList代替Vector,LinkedList代替Stack,HashMap代替HashTable,即使在多线程中需要同步,也是用同步包装类。

同步和异步有何异同,在什么情况下分别使用他们?举例说明。

如果数据将在线程间共享.例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取.
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率.

GC是什么? 为什么要有GC?(待补充)

GC是垃圾收集的意思,内存处理是编程人员容易出现问题的地方,
忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,
Java语言没有提供释放已分配内存的显示操作方法。Java程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:System.gc()或Runtime.getRuntime().gc(),但JVM可以屏蔽掉显示的垃圾回收调用。

垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低优先级的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。
在Java诞生初期,垃圾回收是Java最大的亮点之一,因为服务器端的编程需要有效的防止内存泄露问题,然而时过境迁,如今Java的垃圾回收机制已经成为被诟病的东西。移动智能终端用户通常觉得iOS的系统比Android系统有更好的用户体验,其中一个深层次的原因就在于Android系统中垃圾回收的不可预知性。

阐述ArrayList、Vector、LinkedList的存储性能和特性。

答:ArrayList 和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector中的方法由于添加了synchronized修饰,因此Vector是线程安全的容器,但性能上较ArrayList差,因此已经是Java中的遗留容器。LinkedList使用双向链表实现存储(将内存中零散的内存单元通过附加的引用关联起来,形成一个可以按序号索引的线性结构,这种链式存储方式与数组的连续存储方式相比,内存的利用率更高),按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。Vector属于遗留容器(Java早期的版本中提供的容器,除此之外,Hashtable、Dictionary、BitSet、Stack、Properties都是遗留容器),已经不推荐使用,但是由于ArrayList和LinkedListed都是非线程安全的,如果遇到多个线程操作同一个容器的场景,则可以通过工具类Collections中的synchronizedList方法将其转换成线程安全的容器后再使用(这是对装潢模式的应用,将已有对象传入另一个类的构造器中创建新的对象来增强实现)。

JVM 的内存结构和内存分配?

Java 内存模型
Java 虚拟机将其管辖的内存大致分三个逻辑部分:方法区(Method Area)、 Java 栈和 Java 堆。
1、方法区是静态分配的,编译器将变量绑定在某个存储位置上,而且这些绑定不会在运行时改变。常数池,源代码中的命名常量、 String 常量和 static 变量保存在方法区。
2、 Java Stack 是一个逻辑概念,特点是后进先出。一个栈的空间可能是连续的,也可能是不连续的。最典型的 Stack 应用是方法的调用, Java 虚拟机每调用一次方法就创建一个方法帧(frame),退出该
方法则对应的 方法帧被弹出(pop)。栈中存储的数据也是运行时确定的。
3、 Java 堆分配(heap allocation)意味着以随意的顺序,在运行时进行存储空间分配和收回的内存管理模型。堆中存储的数据常常是大小、数量和生命期在编译时无法确定的。 Java 对象的内存总是在 heap 中分配。
b) java 内存分配
1、基础数据类型直接在栈空间分配;
2、方法的形式参数,直接在栈空间分配,当方法调用完成后从栈空间回收;
3、引用数据类型,需要用 new 来创建,既在栈空间分配一个地址空间,又在堆空间分配对象的类变量;
4、方法的引用参数,在栈空间分配一个地址空间,并指向堆空间的对象区,当方法调用完后从栈空间回收;
5、局部变量 new 出来时,在栈空间和堆空间中分配空间,当局部变量生命周期结束后,栈空间立刻被回收,堆空间区域等待 GC 回收;
6、方法调用时传入的实际参数,先在栈空间分配,在方法调用完成后从栈空间释放;
7、字符串常量在 DATA 区域分配 , this 在堆空间分配;
8、数组既在栈空间分配数组名称, 又在堆空间分配数组实际的大小。

什么是双亲委派机制 ???

写出冒泡排序的算法

for(int i=0;i<arr.length-1;i++){ //控制轮数
for(int j=0;j<arr.length-1-i;j++){ //控制每一轮的次数
if(arr[j]>arr[j+1]){ //每次都是和它下一个元素比
int t=arr[j];
arr[j]=arr[j+1];
arr[j+1]=t;
}
}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值