Java 基础知识总结-1

本文深入讲解Java中的关键概念,包括基本语法、多态、异常处理等。探讨了Maven与Ant的区别,解释了String、StringBuilder与StringBuffer的区别,并提供了常见异常实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

另有:

主要包含:基本语法,多态,异常处理,一些api
1. string数据不可变
2. Maven和Ant
  • Ant和Maven都是基于Java的构建(build)工具。理论上来说,有些类似于(Unix)C中的make ,但没有make的缺陷。Ant是软件构建工具,Maven的定位是软件项目管理和理解工具。 
  • Ant特点 :没有一个约定的目录结构 必须明确让ant做什么,什么时候做,然后编译,打包 没有生命周期,必须定义目标及其实现的任务序列 没有集成依赖管理 没有生命周期
  • Maven特点 :拥有约定,知道你的代码在哪里,放到哪里去 拥有一个生命周期,例如执行 mvn install 就可以自动执行编译,测试,打包等构建过程 只需要定义一个pom.xml,然后把源码放到默认的目录,Maven帮你处理其他事情 拥有依赖管理,仓库管理
3.声明
default  String  s
public  final  static  native  int  w( )
abstract  double  d
abstract  final  double  hyperbolicCosine( )

A:变量不能被defalut修饰 有public、protected、private和default的
B:native修饰方法:一个Java方法调用了一个非Java代码的接口。 定义navtive方法时,并不提供实现体,其实现体是用非Java语言在外面实现的。 native可和任何修饰符连用,abstract除外 。因native暗示这个方法时有实现体的,而abstract却显式指明了这个方法没有实现体。
C:abstract修饰方法和类
D:final修饰的方法不能被重写。而abstract定义的方法没有实现,必须被子类重写,明显不能一起使用。
4. isErrorPage=false
  • 当isErrorPage ="false"时,用errorPage="error.jsp"(isErrorPage默认是false)
  • 当isErrorPage ="true"时,页面会直接使用exception
  • exception是JSP九大内置对象之一,其实例代表其他页面的异常和错误
5. 访问权限
修饰符当前类同包子类其他包
publicTTTT
privateTTTF
dafaultTTFF
protectedTFFF
6.为什么函数不能根据返回类型来区分重载?(该道题来自华为面试题)
因调用时不能指定类型信息,编译器不知道你要调用哪个函数。如:
    1.float max(int a, int b);
    2.int max(int a, int b);
当调用max(1, 2)无法确定调用的哪个,单这一点上来说,仅返回值类型不同的重载是不应该允许的

7.  重载(overload)和重写(override)的区别?重载的方法能否根据返回类型进行区分?
  • 前者是编译时的多态性,后者是运行时的多态性。
  • 重载发生在一个类中,同名方法如有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)
  • 重写发生在子类与父类间,要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。对返回类型没特殊要求。
重载的规则:
1.方法名一致,参数列表中参数的顺序,类型,个数不同。
2.重载与方法的返回值无关,存在于父类和子类,同类中。
3.可抛出不同的异常,可有不同修饰符。
重写的规则:
1.参数列表必须完全与被重写方法的一致,返回类型必须完全与被重写方法的返回类型一致。
2.构造方法不能被重写,声明为 final 的方法不能被重写,声明为 static 的方法不能被重写,但是能够被再次声明。
3.访问权限不能比父类中被重写的方法的访问权限更低。
4.重写的方法能抛出任何非强制异常(UncheckedException非运行时异常),无论被重写的方法是 否抛出异常。但重写的方法不能抛出新强制性异常,或比被重写方法声明的更广泛的强制性异常,反之则 可以。

8.  char 型变量中能不能存储一个中文汉字,为什么?
  • 可以, Java 中使用的编码是 Unicode(不选择任何特定的编码,直接使用字符在字符集中的编号,统一的唯一方法),一个 char 类型占 2 个字节(16 比特)。汉字根据编码不同占2-4字节

10. 抽象类(abstract class)和接口(interface)有什么异同?
        为什么要用接口和抽象类
            OOP 面向对象的编程,如要提高程序的复用率,增加程序可维护性,可扩展性,就必须是面向接口的编程,面向抽象的编程,正确地使用接口、抽象类做为结构层次上的顶层。

  • 接口是对动作的抽象,抽象类是对根源的抽象。
  • 抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。如男人女人这两个类,他们的抽象类是人。说明他们都是人。接口则是具体能 吃,跑等。
不同:
抽象类:
  1. 抽象类中可定义构造器
  2. 可有抽象方法和具体方法
  3. 接口中的成员全都是 public
  4. 抽象类中可定义成员变量
  5. 有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法
  6. 抽象类中可包含静态方法
  7. 一个类只能继承一个抽象类
接口:
  1. 接口中不能定义构造器
  2. 方法全部都是抽象方法
  3. 抽象类中的成员可以是 private、默认、protected、public
  4. 接口中定义的成员变量实际上都是常量
  5. 接口中不能有静态方法
  6. 一个类可以实现多个接口
相同:
  1. 不能够实例化
  2. 可以将抽象类和接口类型作为引用类型
  3. 一个类如继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类
11.多态
三个前提:
1.要有继承关系
2.子类要重写父类的方法
3.父类引用指向子类对


****一个方法名,参数不同,这叫方法重载。(Overload)
void foo(String str);
void foo(int number);
***父类与子类有同样的方法名和参数,这叫方法覆盖。(Override)
class Parent {
    void foo() {
        System.out.println("Parent foo()");
    }
}
class Child extends Parent {
    void foo() {
        System.out.println("Child foo()");
    }
}
***父类引用指向子类对象,调用方法时会调用子类的实现,而不是父类的实现,这叫多态。
Parent instance = new Child();
instance.foo(); //==> Child foo()

12.  error 和 exception 的区别?
  1. Error 类和 Exception类的父类都是 Throwable 类。
  2. Error类一般是与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢出等。仅靠程序本身无法恢复和和预防,遇到这样的错误建议程序终止。
  3. Exception 类表示程序可以处理的异常,可捕获且可能恢复。应处理异常,使程序恢复运行,不应该随意终止异常。
  4. Exception 类又分为运行时异常(Runtime Exception)和受检查的异常(Checked Exception ),运行时异ArithmaticException,IllegalArgumentException,编译能通过,但一运行就终止了,程序不会处理运行时异常,出现这类异常,程序会终止。而受检查的异常,要么用 try。。。catch 捕获,要么用 throws 字句声明抛出,交给它的父类处理,否则编译不会通过。

13.最常见的 5 个 RuntimeException
  1. java.lang.NullPointerException 空指针异常;调用了未经初始化的对象或者是不存在的对象。
  2. java.lang.ClassNotFoundException 指定的类找不到;类的名称和路径加载错误;通常试图通过字符串来加载某个类时可能引发异常。
  3. java.lang.NumberFormatException字符串转换为数字异常;字符型数据中包含非数字型字符。
  4. java.lang.IndexOutOfBoundsException 数组角标越界异常;常操作数组对象时发生。
  5. java.lang.IllegalArgumentException 方法传递参数错误。
  6. java.lang.ClassCastException 数据类型转换异常。
14.  throw 和 throws 的区别
throw:

  • throw 语句用在方法体内,表示抛出异常,由方法体内的语句处理。
  • throw 是具体向外抛出异常的动作,所以它抛出的是一个异常实例,执行 throw 一定是抛出了某种异常。
throws:

  • throws 语句是用在方法声明后面,表示如果抛出异常,由该方法的调用者来进行异常的处理。
  • throws 主要是声明这个方法会抛出某种类型的异常,让它的使用者要知道需要捕获的异常的类型。
  • throws 表示出现异常的一种可能性,并不一定会发生这种异常。

15.  final、finally、finalize 的区别?
  1. final:用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,被其修饰的类不可继承。
  2. finally:异常处理语句结构的一部分,表示总是执行。
  3. finalize:Object 类的方法,在垃圾回收器执行时会调用被回收对象此方法,可覆盖此方法提供垃圾收集时的其他资源回收,如关闭文件等。该方法更像是一个对象生命周期的临终方法,当该方法被系统调用则代表该对象将“死亡”,需注意的是,主动行为上去调用该方法并不会导致该对象“死亡”,这是被动的方法(就是回调方法),不需调用。

16.  Math.round(11.5)等于多少?Math.round(- 11.5) 又等于多少?
  • Math.round(11.5)的返回值是 12,Math.round(-11.5)的是-11。四舍五入的原理是在参数上加 0.5,然后取整。
17. switch 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String上
  • Java5以前switch(expr)中,expr只能是 byte、short、char、int. Java 5 开始,引入了枚举类型,expr 也可是enum类型。
  • 从 Java 7开始,expr 还可以是字符串(String),但是长整型(long)在目前所有的版本中都是不可以的。
18.  数组有没有 length() 方法?String 有没有 length() 方法?
  • 数组没有 length()方法,而有 length 的属性。String 有 length()方法。
  • JavaScript 中,获得字符串的长度是通过 length 属性得到的,容易和 Java 混淆。
  • java 中的 length 属性是针对数组说的,声明了一个数组,想知道这个数组的长度则用到了 length 这个属性。
  • java 中的 length()方法是针对字符串 String 说的,如果想看这个字符串的长度则用到 length()这个方法。
19.  String 、StringBuilder 、StringBuffer 的区别?
  • String 是只读字符串, String引用的字符串内容不能被改变。
  • StringBuffer/StringBuilder表示的字符串对象可直接进行修改。
  • StringBuilder线程不安全适用于单线程在字符缓冲区大量操作
  • stringBuffer线程安全,适用于多线程下在字符缓冲区大量造作
  • StringBuilder是 Java5 中引入的,它和 StringBuffer 的方法完全相同,区别在于它是在单线程环境下使用的,因它的所有方法都没被 synchronized 修饰,效率理论上也比 StringBuffer 要高。
20.  请说出下面程序的输出
1. class StringEqualTest {
2. public static void main(String[] args) {
3. String s1 = "Programming";
4. String s2 = new String("Programming");
5. String s3 = "Program";
6. String s4 = "ming";
7. String s5 = "Program" + "ming";
8. String s6 = s3 + s4;
9. System.out.println(s1 == s2); //false
10. System.out.println(s1 == s5); //true
11. System.out.println(s1 == s6); //false
12. System.out.println(s1 == s6.intern()); //true
13. System.out.println(s2 == s2.intern()); //false
14. }}

  • 常量池(constant pool)指在编译期被确定,并被保存在已编译的.class文件中的一些数据。包括了关于类、方法、接口等中的常量,也包括字符串常量
  • 解析:Java会确保一个字符串常量只有一个拷贝。 
  • 因为例子中的s1和s3中的Programming”都是字符串常量,它们在编译期就被确定了,所以s1==s3为true;而”Program”和”ming”也都是字符 串常量,当一个字符串由多个字符串常量连接而成时,它自己肯定也是字符串常量,所以s3也同样在编译期就被解析为一个字符串常量,所以s3也是常量池中 ”kvill”的一个引用。 

补充:两个知识点:
  1. String 对象的 intern()会得到字符串对象在常量池中对应的版本的引用(如常量池中有一个字符串与String对象的 equals 结果是 true),如常量池中没有对应的字符串,则该字符串将被添加到常量池中,然后返回常量池中字符串的引用;
  2. 字符串的+操作本质是创建 StringBuilde 对象进行 append 操作,将拼接后的 StringBuilder 对象用toString方法处理成 String 对象.

21.如何取得年 月日、小时分钟秒?(有空了解下日期相关方法)
1. public class DateTimeTest {
2. public static void main(String[] args) {
3. Calendar cal = Calendar.getInstance();
4. System.out.println(cal.get(Calendar.YEAR));
5. System.out.println(cal.get(Calendar.MONTH)); // 0 - 11
6. System.out.println(cal.get(Calendar.DATE));
7. System.out.println(cal.get(Calendar.HOUR_OF_DAY));
8. System.out.println(cal.get(Calendar.MINUTE));
9. System.out.println(cal.get(Calendar.SECOND));
10. // Java 8
11. LocalDateTime dt = LocalDateTime.now();
12. System.out.println(dt.getYear());
13. System.out.println(dt.getMonthValue()); // 1 - 12
14. System.out.println(dt.getDayOfMonth());
15. System.out.println(dt.getHour());
16. System.out.println(dt.getMinute());
17. System.out.println(dt.getSecond());
18. }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值