java基础

本文参考Java 教程 | 菜鸟教程 (runoob.com)进行学习并做记录

1.一个类可以包含以下几个类型变量:局部变量、成员变量、类变量


2.构造方法:类到对象


3.源文件声明规则:
源文件中首先定义package,其次是import,源文件中定义多个类,只有一个public且和源文件同名,可以多个非public类,package和import对源文件中的所有类共同有效。源文件中不能不同的类不同的包声明


4.关于使用其他包定义的类的问题:
(1)导入父包的所有类,不会导入子包中的类
(2)父包中的类调用子包中的类,也需要带上完整的路径

5.基础数据类型:8种

类型  字节数 范围
Byte   8
short  16 -32768-32767
int    32(默认0)
long   64(默认0L)
float  32(默认0.0f)
double 64(默认0.0d)
boolean true/flase(默认flase)
char   32 /u0000~/uffff(65535)

6.访问修饰符
default(包)
private(类)
public(所有类)
protected(包内所有类和所在类的子类)包中其他类的子类是否可以使用protected的方法

对于protected有一点疑问,如果是Car类所在包中其他类Bike的子类(不在同一个包中)是否可以用Car类的方法呢?

如果Bike类没有使用该方法,其子类也无法访问到这个方法,所以是不能的;那如果Bike的方法中使用了该方法,其他包下的Bike子类是否可以通过Bike去访问这个方法呢?

实验证明可以;

在命令行进行编译的时候注意-d是在当前目录下建立目录;

运行时注意要在当前目录加上包前缀;

以Bike为例(Bike在Vehicle目录下)

javac -d . ./Vehicle/Bike.java

java Vehicle.forClass.Bike

7.非访问修饰符
static 修饰静态变量;类无论实例化多少对象,静态变量只有一份拷贝;静态方法使用静态变量,从参数列表得到数据,然后计算这些数据
final 修饰类不能被继承;修饰方法不能被继承类重定义;修饰变量值不可修改
abstract 创建抽象类和抽象方法 类中有抽象方法一定要定义成抽象类,抽象类中可以有抽象方法和非抽象方法 抽象类不能用来实例化对象,抽象方法是一种没有任何实现的方法,具体实现由子类提供,继承的子类必须实现所有的抽象方法,除非该子类也是抽象类;抽象方法的声明以分号结尾;
synchronized、transient、volatile主要用于线程的编程
synchronized关键字声明的方法同一时间只能被一个线程访问;
transient该修饰符包含在定义变量的语句中,用来预处理类和变量的数据类型;
volatile修饰的成员变量的值修改时,会强制线程将变化值回写到共享内存中,每次线程访问成员变量时都会重新从共享内存中重新读取该变量的值

8.instance运算符

如果被比较的对象兼容于右侧类型,该运算符仍然返回true。

关于这点,参考的网页Java 运算符 | 菜鸟教程 (runoob.com)上给了下图的实例

 结果是true;

首先兼容的意思不是很理解;

Vehicle可以接受Car这个不难理解;那么作为子类可以接受父类么,从理论上分析是不行的,一会儿展示实践过程;

另外,如果Vehicle a = new Vehicle()结果还是true么?

 首先,对于第6行代码,编译过程直接报错,显示不兼容error;

显然,这很不合理;

对于第二个问题,答案显示的是false;

 接着又添加了几行代码,分别看Car类型的对象和Vehicle类的运算结果;

result4,result5都是true;

至此理解兼容于和instanceof.

9.String类是不可修改的,如果字符串需要很多修改,应该选择StringBuffer & StringBuilder类;

事实上,String类是final类,对象内容不能变,不代表引用不可以改变,String对象内容的改变实际上是通过内存地址的断开与连接实现的。

StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。

10.格式化字符串

System.out.printf("浮点型变量的值为 " +
                  "%f, 整型变量的值为 " +
                  " %d, 字符串变量的值为 " +
                  "is %s", floatVar, intVar, stringVar);

这样,可以多次打印
String fs;
fs = String.format("浮点型变量的值为 " +
                   "%f, 整型变量的值为 " +
                   " %d, 字符串变量的值为 " +
                   " %s", floatVar, intVar, stringVar);

11.Arrays类

java.util.Arrays 类能方便地操作数组,它提供的所有方法都是静态的。

具有以下功能:

  • 给数组赋值:通过 fill 方法。
  • 对数组排序:通过 sort 方法,按升序。
  • 比较数组:通过 equals 方法比较数组中元素值是否相等。
  • 查找数组元素:通过 binarySearch 方法能对排序好的数组进行二分查找法操作。

12.java.util 包提供了 Date 类来封装当前的日期和时间。 Date 类提供两个构造函数来实例化 Date 对象。

第一个构造函数使用当前日期和时间来初始化对象。

Date( )

第二个构造函数接收一个参数,该参数是从 1970 年 1 月 1 日起的毫秒数。

Date(long millisec)

可使用SimpleDateFormat格式化日期

13.Java休眠(sleep)

Thread.sleep(1000*3); // 休眠3秒

14.方法的重载
对于一个方法,它的参数列表是int型数据,如果想使用double型数据去实现同种功能,可以考虑方法重载。
就是说一个类的两个方法拥有相同的名字,但是有不同的参数列表。
Java编译器根据方法签名判断哪个方法应该被调用。 
方法重载可以让程序更清晰易读。执行密切相关任务的方法应该使用相同的名字。 
重载的方法必须拥有不同的参数列表。你不能仅仅依据修饰符或者返回类型的不同来重载方法。

15.构造方法
当一个对象被创建时候,构造方法用来初始化该对象。构造方法和它所在类的名字相同,但构造方法没有返回值。 
通常会使用构造方法给一个类的实例变量赋初值,或者执行其它必要的步骤来创建一个完整的对象。 
不管你是否自定义构造方法,所有的类都有构造方法,因为 Java 自动提供了一个默认构造方法,默认构造方法的访问修饰符和类的访问修饰符相同(类为 public,构造函数也为 public;类改为 protected,构造函数也改为 protected)。 
一旦你定义了自己的构造方法,默认构造方法就会失效。 

16.可变参数
在定义方法时,在最后一个形参后加上三点 …,就表示该形参可以接受多个参数值,多个参数值被当成数组传入。
可变参数在编译成字节码时,就是以数组形态出现的,可以兼容数组,另外可变参数转成数组不能算为重载。

17.finalize()方法
在对象被垃圾收集器析构(回收)之前调用,用来清除回收对象。例如,你可以使用 finalize() 来确保一个对象打开的文件被关闭了。

18.读取控制台输入
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedReader 对象创建后,我们便可以使用 read() 方法从控制台读取一个字符,或者用 readLine() 方法读取一个字符串。 

19.控制台输出
控制台的输出由 print( ) 和 println() 完成。这些方法都由类 PrintStream 定义,System.out 是该类对象的一个引用。 
PrintStream 继承了 OutputStream类,并且实现了方法 write()。这样,write() 也可以用来往控制台写操作。

20.FileInputStream
用于从文件读取数据,对象构造方法有多种:
可以使用字符串类型的文件名来创建一个输入流对象来读取文件:
InputStream f = new FileInputStream("C:/java/hello");
也可以使用一个文件对象来创建一个输入流对象来读取文件。我们首先得使用 File() 方法来创建一个文件对象: 
File f = new File("C:/java/hello");
InputStream in = new FileInputStream(f);

21.FileOutputStream
创建一个文件并向文件中写数据。
有两个构造方法可以用来创建 FileOutputStream 对象。
使用字符串类型的文件名来创建一个输出流对象:
OutputStream f = new FileOutputStream("C:/java/hello");
也可以使用一个文件对象来创建一个输出流来写文件。我们首先得使用File()方法来创建一个文件对象: 
File f = new File("C:/java/hello");
OutputStream fOut = new FileOutputStream(f);

22.File类
创建目录(创建的文件夹是从哪一级开始创建,另外mkdirs()中部分父文件夹已经存在或者全部存在有影响么,mkdir()是指的任意一个父文件夹必须已经存在么)
mkdir( )方法创建一个文件夹,成功则返回true,失败则返回false。失败表明File对象指定的路径已经存在,或者由于整个路径还不存在,该文件夹不能被创建。
mkdirs()方法创建一个文件夹和它的所有父文件夹。
读取目录
一个目录其实就是一个 File 对象,它包含其他文件和文件夹。 
如果创建一个 File 对象并且它是一个目录,那么调用 isDirectory() 方法会返回 true。 
可以通过调用该对象上的 list() 方法,来提取它包含的文件和文件夹的列表(列表是文件或者文件夹的name)。
另外还有listFiles(),直接获取File列表
删除目录或文件
删除文件可以使用 java.io.File.delete() 方法。
需要注意的是当删除某一目录时,必须保证该目录下没有其他文件才能正确删除,否则将删除失败。

23.Scanner获取用户输入
通过 Scanner 类的 next() 与 nextLine() 方法获取输入的字符串
在读取前一般需要使用 hasNext 与 hasNextLine 判断是否还有输入的数据
next()只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符
nextLine()方法返回的是输入回车之前的所有字符
如果要输入 int 或 float 类型的数据,在 Scanner 类中也有支持,但是在输入之前最好先使用 hasNextXxx() 方法进行验证,再使用 nextXxx() 来读取;

24.异常发生的原因
通常包含以下几大类:
(1)用户输入了非法数据。
(2)要打开的文件不存在。
(3)网络通信时连接中断,或者JVM内存溢出。
这些异常有些是因为用户错误引起,有的是程序错误引起的,还有一些是因为物理错误。

25.理解Java异常处理是如何工作的,需要掌握以下三种类型的异常: 
检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
运行时异常: 运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
错误: 错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。

26.捕获异常
使用 try 和 catch 关键字可以捕获异常。try/catch 代码块放在异常可能发生的地方。 
try/catch代码块中的代码称为保护代码,使用 try/catch 的语法如下: 
try
{
   // 程序代码
}catch(ExceptionName e1)
{
   //Catch 块
}
Catch 语句包含要捕获异常类型的声明。当保护代码块中发生一个异常时,try 后面的 catch 块就会被检查。 
如果发生的异常包含在 catch 块中,异常会被传递到该 catch 块,这和传递一个参数到方法是一样。 

27.

多重捕获块
一个 try 代码块后面跟随多个 catch 代码块的情况就叫多重捕获。 
多重捕获块的语法如下所示:

try{
   // 程序代码
}catch(异常类型1 异常的变量名1){
  // 程序代码
}catch(异常类型2 异常的变量名2){
  // 程序代码
}catch(异常类型3 异常的变量名3){
  // 程序代码
}

上面的代码段包含了 3 个 catch块。 
可以在 try 语句后面添加任意数量的 catch 块。 
如果保护代码中发生异常,异常被抛给第一个 catch 块。 
如果抛出异常的数据类型与 ExceptionType1 匹配,它在这里就会被捕获。 
如果不匹配,它会被传递给第二个 catch 块。 
如此,直到异常被捕获或者通过所有的 catch 块。

28.throws/throw 关键字: 
如果一个方法没有捕获到一个检查性异常,那么该方法必须使用 throws 关键字来声明。throws 关键字放在方法签名的尾部。 
也可以使用 throw 关键字抛出一个异常,无论它是新实例化的还是刚捕获到的
一个方法可以声明抛出多个异常,多个异常之间用逗号隔开。 

29.finally 关键字用来创建在 try 代码块后面执行的代码块。 
无论是否发生异常,finally 代码块中的代码总会被执行。 
在 finally 代码块中,可以运行清理类型等收尾善后性质的语句。 

30.try-with-resources
JDK7 之后,Java 新增的 try-with-resource 语法糖来打开资源,并且可以在语句执行完毕后确保每个资源都被自动关闭 。
JDK7 之前所有被打开的系统资源,比如流、文件或者 Socket 连接等,都需要被开发者手动关闭,否则会造成资源泄露将。
try-with-resources 语句中可以声明多个资源,方法是使用分号 ; 分隔各个资源:

31.声明自定义异常
所有异常都必须是 Throwable 的子类。
如果希望写一个检查性异常类,则需要继承 Exception 类。
如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。

32.Java中定义了两种类型的异常和错误。
JVM(Java虚拟机) 异常:由 JVM 抛出的异常或错误。例如:NullPointerException 类,ArrayIndexOutOfBoundsException 类,ClassCastException 类。
程序级异常:由程序或者API程序抛出的异常。例如 IllegalArgumentException 类,IllegalStateException 类。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值