Java基础
Java入门01:编译型和解释型
高级编程语言按照程序的执行方式分为编译型和解释型两种。
-
编译型语言是指编译器针对特定的操作系统将源代码一次性翻译成可被该平台执行的机器码;
-
解释型语言是指解释器对源程序解释成特定平台的机器码并立即执行。
Java 语言既具有编译型语言的特征,也具有解释型语言的特征,因为 Java 程序先编译,后解释
编译步骤,生成字节码(.class 文件),字节码必须由 Java 解释器(JVM)来解释执行。因此,我们可以认为 Java 语言编译与解释并存
什么是字节码?采用字节码的好处是什么?
在 Java 中,JVM 可以理解的代码就叫做
字节码
(即扩展名为.class
的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以 Java 程序运行时比较高效,而且,由于字节码并不针对一种特定的机器,因此,Java 程序无须重新编译便可在多种不同操作系统的计算机上运行。
Java 程序从源代码到运行一般有下面 3 步:
Java基础01:注释
Annotation注解——comments注释
1. 单行注释 //
2. 多行注释 /* */
3. 文档注释
/**
*@Author
*@Description
*/
//有趣的代码注释(很好玩)
Java基础02:数据类型
强类型语言:所有变量先定义后使用(安全,速度稍慢)
Java数据类型分为两大类:
-
基本类型primitive type:整数、浮点、布尔型
-
引用类型reference type:类、接口、数组
long加L,float加F
-
整数拓展:二进制0b 十进制 八进制0 十六进制0x
-
浮点数拓展:最好完全避免浮点数进行比较,一定要比较用BigDecimal
-
字符拓展:字符本质是数字,编码Unicode 表 2字节 0--65536 U0000-UFFFF
-
转义字符:自己查,很多
《关于标识符和关键字》
——简单来说,标识符就是一个名字;而关键字是被赋予特殊含义的标识符。
Java基础03:类型转换
低 -------------------------------------------> 高(小数优先级高于整数)
byte、short、char -> int -> long ->float -> double
-
强制转换 高--低 (类型)变量名
-
自动转换 低--高
注意点:
-
不能转换bool值
-
不能把对象类型转化为不相干的类型
-
高容量转换为低容量时,使用强制转换;反之不管
-
强制转换时可能内存溢出,或者精度问题
-
操作大数时注意溢出问题,比如两个数相乘之前先把其中一个数强制转换
ps:JDK7新特性,数字之间可以下划线分割,例如10_0000_0000
Java基础04:变量,常量
1、变量
-
类变量 static 从属于类,在类生命周期中存在
-
实例变量 无static ——从属于对象,不初始化会变成默认值
-
局部变量 方法内部变量——必须声明和初始化
ps:定义变量时,最好分行定义。
2、常量
final double PI=3.1415926;
Java基础05:包机制
一般利用公司域名倒置作为包名:com.baoxin.www
Java基础06:JavaDoc
javadoc是用来生成自己的API的
类名右键:Show in Explorer
CMD 路径
javadoc -encoding UTF-8 -charset UTF-8 Hello.java
然后查看index.html
其他的可以去百度搜:使用idea生成JavaDoc文档
Java流程控制
Java流程控制01:用户交互Scanner
java.util.Scanner —— 通过Scanner获取用户的输入
基本语法:
Scanner s = new Scanner(System.in);
常用方法:
获取:
next(); 不能接收带空格的字符串,空格看作分割或者叫结束符
nextLine(); Enter为结束符,可以获得空白
判断:
hasNext();
hasNextLine();
此外:nextInt、nextFloat等
举例:
if(scanner.hasNextLine()){
String str=scanner.nextLine();
System.out.println("输出"+str);
}
//IO流的类记得使用完要关闭
scanner.close();
//Scanner进阶
我们可以设置一个循环,输入多个数字求总和或者平均值,每次输入一个数字Enter确认,通过输入非数字来结束输入并输出执行结果
PS : idea反编译,从Project Structure中得到class路径,然后把class文件丢到java文件的包下面直接idea打开,就可以看到反编译后的class文件了
Java流程控制02:增强for循环
语法格式:
int[] numbers = {10,20,30};
for(int x : numbers){
System.out.println("输出" + x);
}
Java方法
Java方法01:命令行传参
Java方法02:可变参数
-
JDK1.5开始,Java支持传递同类型的可变参数
-
在方法声明中,在指定参数列表后加一个省略号(...)
-
一个方法只能指定一个可变参数,且必须位于方法声明最后一位,任何普通参数必须在它之前声明
举例:(可以把它看作一个长度不固定的数组对象)
public class Demo01 {
public static void main(String[] args) {
Demo01 demo01=new Demo01();
demo01.test(1,2,3,67);
}
public void test(int... i){
System.out.println(i[0]);
System.out.println(i[1]);
System.out.println(i[2]);
}
}
Java数组
Java数组01:三种初始化和内存分析
数组是相同数据类型的有序集合
int[] nums=new int[10]; 1、静态初始化 创建+赋值 int[] a = {1,2,3}; 2、动态初始化 创建时默认初始化,然后赋值 int[] a=new int[10]; a[0]=1; a[1]=2; 3、默认初始化 //Java隐式初始化,我们只需要创建数组对象就行
Java数组02:Arrays类
Array中方法都是静态方法,例如Arrays.toString()
常用功能:
-
fill——赋值
-
sort——升序排序
-
equals——比较相等
-
binarySearch——二分查找
Java数组03:稀疏数组
面向对象
面向对象01:什么是面向对象
三大特性:封装、继承、多态
-
封装是指把一个对象的属性隐藏在对象内部,不允许外部对象直接访问对象的内部信息。但是可以提供一些可以被外界访问的方法来操作属性。属性私有,get/set
-
继承extends是使用已存在的类作为基础建立新类,新类可以增加新的数据或功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承,可以快速地创建新的类,可以提高代码的可重用性,程序的可维护性。Java只能单继承
-
子类拥有父类对象所有的属性和方法(包括私有属性和私有方法),但是父类中的私有属性和方法子类是无法访问,只是拥有。
-
子类可以拥有自己属性和方法,即子类可以对父类进行扩展。
-
子类可以用自己的方式实现父类的方法。
-
-
多态,顾名思义,表示一个对象具有多种状态。具体表现为父类的引用指向子类的实例。
注意:多态是方法的多态,和属性没有关系
重写方法后
-
静态方法的调用只和左边定义的数据类型有关
-
非静态方法,真正执行的是子类覆盖的方法,如果子类没有覆盖父类的方法,执行的是父类的方法。
重写要求:Alt+Insert=Override
-
修饰符范围可以扩大,不能缩小
-
抛出的异常范围可以缩小,不能被扩大
-
面向对象02:构造器详解
-
和类名相同
-
不能有返回值,包括void
-
如果定义了有参构造,如果还想使用无参构造,就必须显示一个空的无参构造器
super关键字用于从子类访问父类的变量和方法。 例如:
使用 this 和 super 要注意的问题:
在构造器中使用
super()
调用父类中的其他构造方法时,该语句必须处于构造器的首行,否则编译器会报错。另外,this 调用本类中的其他构造方法时,也要放在首行。this、super不能用在static方法中。
this、super不能同时调用构造方法
简单解释一下:this和super是属于对象,而静态方法是属于类。
面向对象03:instanceof和类型转换
-
instanceof 是 Java 的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型。
-
换句话说,a instanceof b,只要a、b在同一棵继承树上,那么就返回true
面向对象04:static详解
static 关键字主要有以下四种使用场景:
-
修饰成员变量和成员方法: 被 static 修饰的成员属于类,通过类名调用。调用格式:
类名.静态变量名
类名.静态方法名()
-
静态代码块: 静态代码块定义在类中方法外, 静态代码块在非静态代码块之前执行(静态代码块—>非静态代码块—>构造方法)。 该类不管创建多少对象,静态代码块只执行一次.
-
静态内部类: 静态内部类与非静态内部类之间存在一个最大的区别: 非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围类,但是静态内部类却没有。没有这个引用就意味着:1. 它的创建是不需要依赖外围类的创建。2. 它不能使用任何外围类的非static成员变量和方法。
-
静态导包 格式为:
import static
这两个关键字连用可以指定导入某个类中的指定静态资源,并且不需要使用类名调用类中静态成员,可以直接使用类中静态成员变量和成员方法。
面向对象05:抽象类
-
不能new抽象类,只能靠子类去实现它
-
抽象类里可以有普通的方法
-
但抽象方法必须只能在抽象类中
面向对象06:接口
接口的作用:
1. 约束
-
可复用
-
方法都是public abstract
-
常量是public static final
-
接口不能实例化,没有构造方法
-
多继承
-
继承接口的子类必须实现接口里所有的方法
普通类:只有具体实现
抽象类:具体实现和规范都有
接口:只有规范
面向对象17:N种内部类
内部类大致分为:成员内部类、静态内部类、局部内部类、匿名内部类(可以之后再看)
异常
异常01:Error和Exception
Error类对象由Java虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关。
Java虚拟机运行错误(Virtual MachineError),当JVM不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java虚拟机(JsssVM)一般会选择线程终止;
还有发生在虚拟机试图执行应用时,如类定义错误(NoClassDefFoundError)、链接错误 (LinkageError)。这些错误是不可查的,因为它们在应用程序时控制和处理能力外,旦绝大多数是程序运行时不允许出现的状况。
Exception类对象分支中有一个重要的子类RuntimeException(运行时异常)
-
ArrayIndexOutOfBoundsException(数组下标越界)
-
NullPointerException(空指针异常)
-
ArithmeticException(算术异常)
-
MissingResourceException(丢失资源)
-
ClassNotFoundException(找不到类)等异常,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。
这些异常一般是由程序逻辑错误引起的,也就是说问题处在程序员身上
Error和Exception的区别: Error通常是灾难性的致命的错误,是程序无法控制和处理的,当出现这些异常时,Java虚拟机(JVM)一般会选择终止线程;Exception通常情况下是可以被程序处理的,并且在程序中应该尽可能的去处理这些异常。
异常02:捕获和抛出异常
异常处理五个关键字:
-
try、catch、finally、throw、throws
-
捕获异常要从小到大,不然报错
-
Ctrl+Alt+t,捕获异常快捷键
-
throw 主动抛出异常,一般用在方法中——throw new xxxException();
-
throws 假设这个方法里处理不了这个异常,向上抛出,一般用在方法上;上层方法捕获这个异常
异常03:自定义异常
使用Java内置的异常类可以描述在编程时出现的大部分异常情况。除此之外,用户还可以自定义异常。用户自定义异常类,只需继承Exception类即可。
在程序中使用自定义异常类,大体可分为以下几个步骤:
-
创建自定义异常类。
-
在方法中通过throw关键字抛出异常对象。
-
如果在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理;否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作。
-
在出现异常方法的调用者中捕获并处理异常。
异常04:经验总结
-
处理运行时异常时,采用逻辑去合理规避同时辅助try-catch处理
-
在多重catch块后面,可以加一个catch (Exception)来处理可能会被遗漏的异常
-
对于不确定的代码,也可以加上try-catch,处理潜在的异常
-
尽量去处理异常,切忌只是简单地调用printStackTrace()去打印输出
-
具体如何处理异常,要根据不同的业务需求和异常类型去决定
-
尽量添加finally语句块去释放占用的资源,IO/Scanner
接下来的学习计划: