赞
踩
目录
4、String 是基本数据类型吗?我可不可以写个类继承于 String?
6、Switch 语句里面的条件可不可以是 byte、long、String?使用时候还应注意什么?
7、short s1=1;s1=s1+1;有什么错?short s1 = 1;s1+=1 有什么错?
9、3*0.1 == 0.3 将会返回什么?true 还是 false?
13、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
15、作用域 public,private,protected,以及不写时的区别?
19、在 Java 中定义⼀个不做事且没有参数的构造⽅法的作⽤
29 、 String 和 StringBuffer 的区别? StringBuffer 和
30、数组中有没有 length()方法,String 中有没有 length()方法?
31、final, finally, finalize 的区别。
34、有没有可能两个不相等的对象有有相同的 hashcode?
37、Java 中 java.util.Date 与 java.sql.Date 有什么区别?
49、一个静态方法,里面可不可以用 this 和 super 关键字
整形:byte 8 short 16 int 32 long 64 位
浮点类型:float、double
字符类型:char 表示字符 utf-16
布尔类型:boolean true/false
因为 Java 程序编译之后生成.class 文件,不是能被硬件系统直接运行的代码,而是一种 “中间码”——字节码。然后不同的硬件平台上安装有不同的 Java 虚拟机(JVM),由 JVM 来把字节码再“翻译”成所对应的硬件平台能够执行的代码。因此对于 Java 编程者来说,不需要考虑硬件平台是什么。所以 Java 可以跨平台。
基于对象和面向对象:Java是一种真正的面向对象的语言,即使是开发简单的程序,也必须设计对象;JavaScript 是种脚本语言,它是一种基于对象(Object-Based)和事件驱动(Event-Driven)的编程语言,本身提供了非常丰富的内部对象供设计人员使用。
解释和编译:Java 的源代码在执行之前,必须经过编译。JavaScript 其源代码不需经过编译,由浏览器解释执行。
强类型变量和弱类型变量:Java 采用强类型变量检查,所有变量在编译之前必须作声明;JavaScript中变量是弱类型的,甚至在使用变量前可以不作声明,其解释器在运行时检查推断其数据类型。代码格式不一样。
不是,String 是引用类型;String 是 final 的类,是不可以被继承的。
&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为 true 时,整个运算结果才为 true,否则,只要有一方为 false,则结果为 false。
&&还具有短路的功能,即如果第一个表达式为 false,则不再计算第二个表达式。
&还可以用作位运算符,当&操作符两边的表达式不是 boolean 类型时,&表示按位与操作.。
switch 里面的条件必须是能隐式的转化成为 Int 的故 long 不行,byte 可以;jdk1.7 之后
String 类型的也可以。使用 Switch 时候还应注意它的穿透,即每个 case 后要跟 break;
对于 short s1 = 1; s1 = s1 + 1; 由于 s1+1 运算时会自动提升表达式的类型,所以结果是 int 型,再赋值给 short 类型 s1 时,编译器将报告需要强制转换类型的错误。
对于 short s1 = 1; s1 += 1;由于 += 是 java 语言规定的运算符,java 编译器会对它进行特殊处理,因此可以正确编译。
不是线程安全的操作。它涉及到多个指令,如读取变量值,增加,然后存储回内存,并不是原子性的操作,这个过程可能会出现多个线程交差。解决方案:对i++操作的方法加同步锁或者使用支持原子操作的类比如 java.util.concurrent.atomic.AtomicInteger
false,因为有些浮点数不能完全精确的表示出来。
对于0.1来说,其本质是1/10,用二进制表示是1/1010是一个除不尽的无穷循环
==>0.000110011001100...其中0011循环,但是恰恰double类的精度可以表现出0.1*3的结果为0.30000000000000004,所以造成double中运算不精准,返回结果false。
char 型变量是用来存储 Unicode 编码的字符的,unicode 编码字符集中包含了全世界所有的字体。
final 用于修饰类、属性、方法
final 修饰的类,不能被继承
final 修饰的属性,是常量,值不可以改变 final 修饰的方法,不可以被重写
静态变量也称为类变量,归全类共有,它不依赖于某个对象,可通过类名直接访问;而实例变量必须依存于某一实例,只能通过对象才能访问到它。
静态变量存在方法区内存 实例变量存在堆内存
是值传递。Java语言的方法调用只支持参数的值传递。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。
1)抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。
2)继承:子类拥有父类一切非私有的属性和方法。
3)封装:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面 向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装 的对象,这些对象通过一个受保护的接口访问其他对象。
4)多态性:同一种事物的不同种表现形式。
作用域 当前类 同包 子孙类 | 其他 |
public √ √ √ | √ |
protected √ √ √ | × |
default √ √ × | × |
private √ × × | × |
(Overload)重载:发生在同一个类之中,方法名相同、参数列表不同(个数,类型),与返回值无关、与 final 无关、与修饰符无关、与异常无关。
(Override)重写:发生在子类和父类之间,方法名相同、参数列表相同、返回值相同、不能是 final 的方法、重写的方法不能有比父类方法更为严格的修饰符权限、重写的方法所抛出的异常不能比父类的更大。
如果父类私有的方法,子类拥有方法签名相同的方法,子类不属于重写父类的方法,该方法属于子类的新方法。
因为java方法被调用时返回值可以舍弃,也可以使用父类/接口类型接收返回值,所以如果有相同的参数列表的方法,编译器无法确定具体要调用的方法。
重载只和参数列表相关并且方法名称相同,和方法签名的其他关键字无关。
构造器不能被继承,故不能被重写、但可以被重载。
Java 程序在执⾏类的构造⽅法之前,如果没有⽤ super() 来调⽤⽗类特定的构造⽅法,则会默认调⽤⽗类的无参构造。因此,如果⽗类中只定义了带参构造,⽽在⼦类的构造⽅法中
⼜没有⽤ super() 来调⽤⽗类中特定的构造⽅法,则编译时将发⽣错误,因为 Java 程序在⽗类中找不到该构造方法供执行。
装箱:将基本类型⽤它们对应的引⽤类型包装起来;自动装箱发生场景:
1.将基本数据类型放入集合类
2.方法传入参数为基本类型,返回值类型为包装类型拆箱:将包装类型转换为基本数据类型;自动拆箱发生场景:1.包装类型和基本类型的大小比较 2.包装类型的运算 3.三目运算符的使用
hashCode() 的作⽤是获取哈希码,也称为散列码;它实际上是返回⼀个 int 整数。这个哈希码的作⽤是确定该对象在哈希表中的索引位置。散列表存储的是键值对(key-value),它的特点是:能根据“键”快速的检索出对应的“值”。这其中就利⽤到了散列码!(可以快速找到所需要的对象)
当你把对象加⼊ HashSet时,HashSet 会先计算对象的 hashcode 值来判断对象加⼊的位置,同时也会与该位置其他已经加⼊的对象的 hashcode 值作⽐,如果没有相符hashcode,
HashSet 会假设对象没有重复出现。但是如果发现有相同 hashcode 值的对象,这时会调⽤ equals() ⽅法来检查 hashcode 相等的对象是否真的相同。如果两者相同,HashSet 就不会让其加⼊操作成功。如果不同的话,就会重新散列到其他位置。这样我们就⼤⼤减少了 equals 的次数,相应就⼤⼤提⾼了执⾏速度。
hashCode() 在散列表中才有⽤,在其它情况下没⽤。在散列表中 hashCode() 的作⽤是获取对象的散列码,进⽽确定该对象在散列表中的位置。
值传递:是指在调用函数时,将实际参数复制一份传递给函数,这样在函数中修改参数时,不会影响到实际参数。其实,就是在说值传递时,只会改变形参,不会改变实参。
引用传递:是指在调用函数时,将实际参数的地址传递给函数,这样在函数中对参数的修改,将影响到实际参数。
引用传递实际上是一个伪概念,值传递不是简单的把实参传递给形参,而是实参建立了一个副本,将副本传递给形参。当传递的参数为引用类型的对象时,对象存放在堆里,其引用存放在栈中,也是创建一个副本,传递给形参,所以其本质上还是值传递。
java 中没有多继承,但是可以多实现,即一个类实现多个接口。
虽然没有多继承,但是 java 中接口可以近似的实现多继承,那就是接口;接口和接口之间可以进行多继承。
重写、重载、父类的声明指向子类的对象。可变参数。
String 是不可变的,对 String 类的任何改变都会返回一个新的 String 对象。
StringBuffer 是可变的,对 StringBuffer 中的内容修改都是当前这个对象。
String 重写了 equals 方法和 hashCode 方法,StringBuffer 没有重写 equals 方法。String 是 final 的类。StringBuffer 不是。
String 创建的字符串是在常量池中,创建的变量初始化一次,如果再对该字符串改变会产生新的字符串地址值,StringBuffer 是在堆中创建对象,当对字符串改变时不会产生新的
字符串地址值,如果对字符串进行频繁修改的话建议使用 StringBuffer,以节省内存。
StringBuffer 和 StringBuilder,StringBuffer 是线程安全的,StringBulider 是线程不安全的。当不考虑并发问题时候,请使用 StringBulider。
数组中没有 length()方法,但是有 length 属性,String 中有length()方法
final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
内部类要访问局部变量,局部变量必须定义成 final 类型。
finally 是异常处理语句结构的一部分,表示总是执行。
finalize 是 Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM 不保证此方法总被调用
‘==’比较的是两个变量的内容和在内存中的地址值是否全部相等,如果要比较两个基本数据类型那必须用’==’ equals 如果没有重写,则和’==’的意义一样,如果重写了,则会会按照重写的内容进行比较, javaBean 规定当重写 equals 时候必须重写 hashCode,如果不重写会出现对象相同但是 hashCode 不同,这样会出现问题,eg:HashSet 存储元素时候是按照 hashCode,如果重写 equals 不重写 hashCode 会导致同一个对象,存储了两次。
33、JAVA 中 Object 类中有哪些常用方法?
会有相同 hashCode是所有java对象的固有方法,如果不重载的话,返回的实际上是该对象在jvm的堆上的内存地址,而不同对象的内存地址肯定不同,所以这个hashCode也就肯定不同了。如果重载了的话,由于采用的算法的问题,有可能导致两个不同对象的hashCode相同。这就算为什么hashmap,hashset等集合会产生hash冲突的原因了。
可以这么写,但是不推荐,除非你刻意胡乱重写。因为根据java底层规范和标准,不允许发生这样的情况,会导致使用hash的对象发生错误。
可以这么写,但是不推荐,因为对象相等我们应保证他们的hashcode相等. 而不相等的对象应通过hashcode方法的算法尽量避免hash冲突。
日期格式和精度不同,java.sql.Date只包含年月日信息。
另外java.sql.Date是java.util.Date的子类。java.util.Date转java.sql.Date以毫秒的形式转换,java.sql.Date s = new java.sql.Date(utilTime.getTime());反过来为向上转型可以自动转换。
接口是一种规范,本质上为抽象方法的集合,与代表is a的继承关系相比,因为实现类中不仅仅只有接口中的方法,所以不能说完全相同而使用like a来表示。
接口可以用来控制实现其的类必须要实现其中的抽象方法,并且一个类可以实现多个接口,一个接口可以继承另一个接口,相对于类之间的单继承更具有可扩展性。接口可以方便敏捷开发,使得在开发过程中可以快速分离工作内容,定义好接口之后可以直接调用接口的方法而不需要等待其他开发人员实现了具体方法之后才能调用,大大提高了开发效率。并且使用接口开发能够降低程序的耦合性,从而提高程序的可维护性。
java 的内存分为两类,一类是栈内存,一类是堆内存。栈内存是指程序进入一个方法时,
会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放,这个栈中的变量也将随之释放。
堆与栈不同,一般用于存放 new 创建的对象,所以,它不会随方法的结束而消失。方
法中的局部变量使用 final 修饰后,放在堆中,而不是栈中。
GC 是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,
忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java 提供的 GC 功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java 语言没有提供释放已分配内存的显示操作方法。
内部类是指在一个外部类的内部再定义一个类。内部类作为外部类的一个成员,并且依附于外部类而存在的。内部类可为静态,可用 protected 和 private 修饰(而外部类只能使用 public 和缺省的包访问权限)。
内部类主要有以下几类:成员内部类、局部内部类、静态内部类、匿名内部类。
典型的情况是,内部类继承自某个类或实现某个接口,内部类的代码操作创建其的外围类的对象。所以你可以认为内部类提供了某种进入其外围类的窗口。使用内部类最吸引人的原因是:每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。如果没有内部类提供的可以继承多个具体的或抽象的类的能力,一些设计与编程问题就很难解决。从这个角度看,内部类使得多重继承的解决方案变得完整。接口解决了部分问题,而内部类有效地实现了“多重继承”。
java.lang.NullPointerException | 空指针异常 | |
java.lang.ClassNotFoundException | 类找不到异常 | |
java.lang.ArithmeticException | 数学运算异常 | |
java.lang.ArrayIndexOutOfBoundsException | 数组下标越界 | |
java.lang.ClassCastException | 类型转换异常 | |
java.lang.NumberFormatException | 数字转换异常 | |
java.sql.SQLException | 操作数据库异常 | |
java.io.IOException | 输入输出流异常 | |
java.io.FileNotFoundException | 文件找不到异常 | |
java.lang.InstantiationError | 实例化异常 | |
1、检查性异常和非检查性异常最主要的区别在于其处理异常的方式:检查性异常必须使用 try catch 或者 throws 等关键字进行处理,否则编译器会报错;非检查性异常一般是程序代码写的不够严谨而导致的问题,可以通过修改代码来规避。
2 、所有的检查性异常都继承自 java.lang.Exception ;所有的非检查性异常都继承自 java.lang.RuntimeEx ception。
3、常见的运行时异常:空指针异常(NullPointerException)、除零异常(ArithmeticException)、数组越界异常(ArrayIndexOutOfBoundsException)等;
常见的检查性异常:输入输出异常(IOException)、文件不存在异常(FileNotFoundException)、
SQL 语句异常(SQLException)等
Error 一般指 JVM 出现的问题,程序无法做处理。Exception 是程序本身可以处理的异常,分为运行时异常和非运行时异常。
throw:
throws:
不能,因为 this 代表的是调用这个方法的对象的引用,super 代表当前父类对象的引用,
而静态方法是属于类的,不属于对象,静态优先于对象,静态方法成功加载后,对象还不一定存在。
接口中可以添加默认方法和默认方法、Lambda表达式、函数式接口、Stream数据流、
Optional类以及全新的时间包等。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。