Java基础难点知识点汇总1 您所在的位置:网站首页 java基础知识点汇总 Java基础难点知识点汇总1

Java基础难点知识点汇总1

2023-08-15 17:09| 来源: 网络整理| 查看: 265

关于&和&&:

&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的 表达式的结果都为 true 时,整个运算结果才为 true。

&&还具有短路的功能,即如果第一个表达式为 false,则不再计算第二个表达式。

&还可以用作位运算符,当&操作符两边的表达式不是 boolean 类型时,& 表示按位与操作。

关于String:

基本数据类型包括 byte、int、char、long、float、double、boolean 和 short。 java.lang.String 类是 final 类型的,因此不可以继承这个类、不能修改这个类。String 被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。

例如:String s = "Hello";s = s + " world!";

在这段代码中,s 原先指向一个 String 对象,内容是 "Hello",然 后我们对 s 进行了+操作,这时,s 不指向原来那个对象了,而指向了另一个 String 对象,内容为 "Hello world!",原来那个对象还存在于内存之中,只是 s 这个引用变量不再指 向它了。

对于字符串常量,如果内容相同,Java 认为它们代表同一个 String 对象。而用关键字 new 调用构造器,总是会创建一个新的对象,无论内容是否相同,性能低下且内存开销大,并且没有意义,所以 Java 标准类库还提供了一个可变版本,即 StringBuffer,可以使用 StringBuffers 来动态构造字符数据,但StringBuffer 没有实现 equals 方法

String s = new String("xyz");New String 每写一遍,就创建一个新的对象,它一句那个常量”xyz”对象的内容来创建出一个新 String 对象。如果以前就用过’xyz’,这句代表就不会创建”xyz”自己了,直接从缓冲区拿。

"=="和 equals 方法:

如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存, 对象本身占用一块内存(堆内存),变量也占用一块内存,例如 Objet obj = new Object();变量 obj 是一个内存(常量池中),new Object()是另一个内存(堆内存中),此时,变量 obj 所对应的内存中存储的数值就是对象占用的那块内存的首地址。

==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同。如果要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符;但在上面这种情况中,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存是不是同一块,即比较两个变量存储的首地址是否相同。

equals方法是用于比较两个独立对象的内容是否相同,它比较的两个对象是独立的。

例如,对于下面的代码: String a="123"; String b=new String("123"); String c=new String("123");

a==b:a,b这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,a对应的首地址在常量池中的一块中,b对应的首地址在堆内存的一块中,即a和b中存储的数值是不相同的,所以,表达式 a==b 将返回false,而这两个对象中的内容是相同的,所以,表达式a.equals(b)将返回true。

b==c:用关键字 new 调用构造器,总是会在堆内存创建一个新的对象,所以b和c的首地址不同,返回false。

a.equals(b),b.equals(c):内容相同,返回true;

Integer 与 int 的区别:

int 是 java 提供的 8 种原始数据类型之一。Java 为每个原始类型提供了封装 类,Integer 是 java 为 int 提供的封装类。int 的默认值为 0,而 Integer 的默认值 为 null,即 Integer 可以区分出未赋值和值为 0 的区别,int 则无法表达出未赋值 的情况,int 不适合作为 web 层的表单数据的类型。

另外,Integer ᨀ供了多个与整数相关的操作方法,例如,将一个字符串转 换成整数,Integer 中还定义了表示整数的最大值和最小值的常量。

Overload 和 Override 的区别:

重载 Overload 表示同一个类中可以有多个名称相同的方法,但这些方法的 参数列表各不相同(即参数个数或类型不同)。如果某一方法在父类中是访问权限是 priavte,那么就不 能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。

如果几个 Overloaded 的方法的参数列表不一 样,它们的返回者类型可以不一样。如果两 个方法的参数列表完全一样,不可以让它们的返回值不同来实现重载 Overload。

重写 Override 表示子类中的方法可以与父类中的某个方法的名称和参数完 全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方 法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象 编程的多态性的一种表现。

子类覆盖父类的方法时,只能比父类抛出更少的异 常,或者是抛出父类抛出的异常的子异常,因为子类可以解决父类的一些问题,不能比父类有更多的问题。子类方法的访问权限只能比父类的更大,不能 更小。如果父类的方法是 private 类型,那么,子类则不存在覆盖的限制,相当 于子类中增加了一个全新的方法。

抽象类和接口的区别:

抽象类即为含有 abstract 修饰符的 class,abstract 类不能创建的实例对象。 含有 abstract 方法的类必须定义为 abstract class,abstract class 类中的方法不必是抽象的。abstract class 类中定义抽象方法必须在具体(Concrete)子类中实现, 所以,不能有抽象构造方法或抽象静态方法。如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为 abstract 类型。

接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为 public abstract 类型,接口中的成员变量类型默认为 public static final。

区别:

1.抽象类可以有构造方法,接口中不能有。

2.抽象类中可以有普通成员变量,接口中没有

3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的。

4. 抽象类中的抽象方法的访问类型可以是 public,protected 和(默认类型, 虽然 eclipse 下不报错,但应该也不行),但接口中的抽象方法只能是 public 类 型的,并且默认即为 public abstract 类型。

5. 抽象类中可以包含静态方法,接口中不能包含。

6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的 访问类型可以任意,但接口中定义的变量默认且只能是 public static final 类型。

7. 一个类可以实现多个接口,但只能继承一个抽象类。

8.接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通 信契约。而抽象类在代码实现方面发挥作用,可以实现代码的重用。

内部类:

内部类就是在一个类的内部定义的类,内部类中不能定义静态成员,内部类可以直接访问外部类中的成员变量,内部类可以定义在外部类 的方法外面,也可以定义在外部类的方法体中。创建内部类的实例对象时,一定要先创建外部类的实例对象,然后用这个外部类的实例对象去创建内部类的实例对象。

在方法体外面定义的内部类的访问类型决定这个内部类的定义对其他类是否可见,可以是 public,protecte,默认的, private 等 4 种类型,

在方法体内部定义的内部类前面不能有访问类型修饰符,就好像方法中定义 的局部变量一样,但这种内部类的前面可以使用 final 或 abstract 修饰符。这种内部类对其他类是不可见的其他类无法引用这种内部类,但是这种内部类创建 的实例对象可以传递给其他类访问。这种内部类必须是先定义,后使用,即内部类的定义代码必须出现在使用该类之前,可以访问方法体中的局部变量(只要不是静态内部类),但是, 该局部变量前必须加 final 修饰符,

final, finally, finalize:

final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类 不可继承。 内部类要访问局部变量,局部变量必须定义成 final 类型,例如, 一段代码……

finally 是异常处理语句结构的一部分,表示总是执行。

finalize 是 Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对 象的此方法,可以覆盖此方法ᨀ供垃圾收集时的其他资源回收,例如关闭文件 等。JVM 不保证此方法总被调用

Error 和 Exception:

Error 表示应用程序本身无法克服和恢复的一种严重问题,程序只有死的份了,例如,说内存溢出和线程死锁等系统问题。

Exception 表示程序还 能够克服和恢复的问题,其中又分为系统异常和普通异常,系统异常是软件本身缺陷所导致的问题,也就是软件开发人员考虑不周所导致的问题,软件使用 者无法克服和恢复这种问题,但在这种问题下还可以让软件系统继续运行或者 让软件死掉,例如,数组脚本越界(ArrayIndexOutOfBoundsException),空指 针异常(NullPointerException)、类转换异常(ClassCastException);普通异常是运行环境的变化或异常所导致的问题,是用户能够克服的问题,例如,网络断线,硬盘空间不够,发生这样的异常后,程序不应该死掉。

字节流与字符流的区别:

IO 流对应的抽象类为 OutputStream 和 InputStream ,不同的实现类就代表不同的输入和 输出设备,它们都是针对字节进行操作的。

底层设备永远只接受字节数据,有时候要写字符串到底层设备,需要将字 符串转成字节再进行写入。字符流是字节流的包装,字符流则是直接接受字符串,它内部将串转成字节,再写入底层设备。

 InputStream是所有字节输入流的祖先,而OutputStream是所有字节输出流的祖先。  Reader是所有读取字符串输入流的祖先,而writer是所有输出字符串的祖先。

字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有