以下内容来自于视频学习的笔记: 狂神说Java.
IDEA 快捷键
注释
标识符
类名、变量名以及方法名都被称为标识符。以字符、美元符号或下划线开始
,首字母之后可以是字母、美元符号、数字或者下划线的组合,标识符大小写敏感
可以使用中文,但是最好不要
关键字如下图:
数据类型
//整数
int num1 = 10; //最常用
byte num2 = 20;
short num3 = 30;
long num4 = 30L; //Long类型要在数字后加个L
//小数:浮点数
float num5 = 50.1f; //float型要在后边加F,不然double
double num6 = 3.23333333;
//字符
char name = 'A';
//字符串,String不是关键字,类
//String name = '哆啦梦'
//布尔值
boolean flag = true;
//boolean flag = false;
类型转换
强制转换 (类型)变量名 高–>低
自动转换 低 -->高
注意:1.不能对布尔值进行转换
2.不能把对对象类型转换为不相干的类型
3.转换的时候可能存在内存溢出,或精度类型
补充:JDK7特性,数字之间可以用下划线分隔,不影响
int mone = 1_0000_0000;//下划线分隔
int year = 20;
//先把一个数转换为long型,避免溢出
long total = (long)money * year ;
变量
常量
修饰符(下图紫色部分)不区分顺序
static final double PI = 3.14;
常量命名:一般大写字符和下划线:MAX_VALUE
补充:
运算符 [使用括号区分优先级]
算术运算符 包括自增、自减
//补充连接符号 + 只要加号的内容出现字符串类型,则变成字符串拼接
int a = 1;
int b = 2;
System.out.println(a+b+'');//输出3
System.out.println(''+a+b);//输出12
赋值运算符
关系运算符 返回结果为bool值
逻辑运算符: && 、||、~、<<左移x2,、>>右移x2
boolean a = true;
boolean b = false;
System.out.println("a && b "+(a&&b));//逻辑与运算
System.out.println("a || b "+(a||b));//逻辑或运算
System.out.println("!(a && b) "+!(a&&b));//逻辑非运算
//注意&&与如果第一个错了,则后边不执行;||同理
位运算符
条件运算符 ?:
//x?y:z
int score = 80;
String type = score<60?"不及格":"及格";
System.out.println(type);
拓展运算符
补充:幂运算
double pow = Math.pow(2,3);
System.out.println(pow);
包机制
为了更好地组织类,Java提供了包机制,用于区别类名的命名空间
包语句的语法格式为:package pkg1[.pkg2[.pkg3…]];
一般利用公司域名倒置作为包名:www.baidu.com com.baidu.www
为了能够使用某个包的成员,我们需要在Java程序中明确导入该包,使用“import”语句可完成此功能
import package1[.package2...].(classname|*);
//注意加分号
JavaDoc
javadoc命令是用来生成自己的API的
/**
@author:
@version:
@since: 指明需要最早使用的jdk版本
@param: 参数名
@return:返回值情况
@throws:异常抛出情况
*/
使用cmd生成文档
//在左侧目录需要生成文档的类,右键->Show in Explorer->导航栏打开cmd
javadoc -encoding UTF-8 -charset UTF-8 Doc.java
回到文件管理器,出现了.html文件即为生成的文档
```
也可使用IDEA生成javaDoc文档
Tools -> Generate JavaDoc->选择要生成文档的File->选择生成文档的输出目录Ouput directory ->选择Locale:zh_CN->传入JavaDoc的参数,一般写成: -encoding UTF-8 -charset UTF-8 -windowtitle “文档HTML页面标签的标题” -link http://docs.Oracle.com/javase/7/docs/api
然后找到生成的html
Scanner对象 实现程序和人的交互,可以通过Scanner类获取用户输入
Scanner s = new Scanner(System.in);
通过Scanner类的next()和nextLine()方法获取输入的字符串,在读取前我们一般需要使用hasNext()与hasNextLine()判断是否还有输入的数据。
Scanner scanner = new Scanner(System.in);//程序会等待用户输入结束
System.out.println("使用next方式接收:");
//判断用户有没有输入字符串
if(scanner.hasNext()){
//
String str = scanner.next();//
System.out.println("输出的内容为"+str);
}
//凡是属于IO流的类如果不关闭会占用资源,用完就关闭
scanner.close();
Scanner scanner = new Scanner(System.in);//程序会等待用户输入结束
System.out.println("使用nextLine方式接收:");
//判断用户有没有输入字符串
if(scanner.hasNextLine()){
//
String str = scanner.nextLine();//
System.out.println("输出的内容为"+str);
}
//凡是属于IO流的类如果不关闭会占用资源,用完就关闭
scanner.close()
顺序结构
选择结构
if单选择结构
Scanner scanner = new Scanner(System.in);
Stirng s = scanner.nextLine();
if(s.equals("hello")){
System.out.println("End");
}
if双选择结构
if(布尔表达式){
}else{
}
if多选择结构
if(布尔表达式){
}else if(){
}else{
}
if嵌套结构
switch多种选择结构
switch(expression){
case value1:
//语句
break;//可选
case value2:
//语句
break;//可选
// 可以有任意数量的case语句
default: //可选
//语句
}
反编译
P37后半部分
从project结构中,找到文件生成的class文件的位置,从文件夹中复制该class文件到源代码位置。
循环结构
while循环
- while(布尔表达式){
//循环内容
}
for 循环
for(初始化;布尔表达式;更新){
//代码
}
//在IDEA中,输入100.for回车,则会自动生成下面
for(int i = 0; i < 100; i++){
}
增强for 循环
int[] numbers = {
0,20,30,40,50}; //定义一个数组
//遍历数组元素
for(int x:numbers){
System.out.println(x); //这样会输出数字钟每一个元素
}
do–while循环
do{
}while(布尔表达式);
break & continue
break跳出循环,continue 终止本次循环
方法
修饰符(可选) 返回值类型 方法名(参数类型 参数名){
方法体
return 返回值
}
方法调用:调用方法:
方法的重载
命令行传参
P48
可变参数
方法声明中,在指定参数类型后加一个省略号(…)
一个方法中只能指定一个可变参数,它必须是方法的最后一个参数,任何不同的参数必须在它之前声明。
public void test(int...i){
//调用时,可以输入参数整数,如下但因输入的第一个整数
System.out.println(i[0]);
}
递归
方法自己调用自己
递归头:什么时候不调用自身方法,如果没有头,将陷入死循环
数组
相同类型数据的有序集合
可以通过下标访问
int[] nums;//1.声明一个数组
nums = new int[10];// 2.创建一个数组
nums[0] = 1; //3.给数组元素赋值,如果不赋值,则为对应类型的默认值
//获取数组长度:arrays.length
初始化方法
静态初始化:创建+赋值
int[] a = {
1,2,3};
动态初始化
int[] a = new int[2];
a[0] = 1;
a[1] = 2;
数组默认初始化
数组时引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量童颜给的方式被隐式初始化
- 长度确定,数组一旦被创建,它地打小就不可改变
- 元素是相同类型
- 数组中的元素可以是任何数据类型,包括基本类型和引用类型
- 数组本身就是对象,Java对象是在堆中地,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的。
数组的使用
多维数组
//二维数组为例
int[][] array = {
{
1,2},{
2,3},{
3,4}};
for(int i=0;i<array.length;<i++){
for(int j = 0;j<array[i].length;j++){
System.out.println(array[i][j]);
}
}
Arrays类
import java.util.Arrays;
//打印数组元素 Arrays.toString()
int[] a = {
1,2,4,3,9090};
System.out.println(Arrays.toString(a));
//会打印出[1, 2, 4, 3, 9090]
//Arrays.sort(数组名) 对数组进行排序
Arrays.sort(a);
Arrays.toString(a); //排序后输出为[1, 2, 3, 4, 9090]
冒泡排序
//从大到小
public static int[] sort(int[] array){
int temp = 0;
//外层循环,判断轮数
for(int i = 0; i<array.length-1; i++){
//内层循环,比较判断两个数
for(int j =i; j< array.length-2-i;j++){
if(array[j+1]>array[j]){
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
return array;
}
稀疏数组
稀疏数组的处理方式:
记录数组移动有几行几列,有多少个不同的值
把具有不通知的元素和行列及值记录在一个小规模的数组中中,从而缩小程序的规模
面向对象
以类的方式组织代码,以对象的方式的组织(封装)数据
三大特性
静态方法 static 非静态方法
类名.方法名 可调用静态方法
如果为非静态方法,需要先实例化一个对象
public class Student{
//非静态方法
public void say(){
System.out.println("学生说话");
}
}
Student student = new Student();
student.say();
//加上static后,可以直接Student.say()调用
Java是值传递
创建与初始化对象
public class Person{
//一个类即使什么都不写,它也会存在一个方法
//显式地定义构造器
String name;
//实例化初始值
//使用new关键字,本质在构造器
//用来初始化值
public Person(){
//this.name = "小鱼儿";
}
//有参构造:一旦定义了有参构造,无参就必须显式构造
//如果没有有参构造,可以自动生成隐式无参构造
public Person(String name){
this.name = name;
}
}
封装
通常,应禁止直接访问一个对象中数据地实际表示,而应通过操作接口来访问,这称为信息隐藏
属性私有,get/set
public class Student{
//属性私有,无法直接实例名.属性来更改
//名字
private String name;
//学号
private int id;
//姓名
private char sex;
//get 获得这个数据
public String getName(){
return this.name;
}
//set 给这个数据设置值
public void setName(String name){
this.name = name;
}
}
继承
//定义Person类,Student类是Person类的子类
public class Student extends Person{
}
public protected default private
在Java类中,所有的类都默认直接或者间接继Object类
Super
super和this
代表的对象不同: this:本身调用者这个对象
super:代表父类对象的应用
前提: this没有继承也可以使用
super:只能在继承条件才可以使用
构造方法: this():本类的构造
super():父类的构造
方法的重写
重写需要有继承关系,子类重写父类的方法
参数列表必须相同
修饰符:范围可以扩大,public>Protected>Default>private
抛出的异常:范围,可以被缩小,但不能扩大
重写都是方法的重写,与属性无关
非静态方法,才叫重写,而且需要public
多态
即同一方法可以根据发送兑现给的不同而采用多种不同的行为方式。一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多(父类、有关系的类)。
//一个对象的实际类型是确定的
new Student();
new Person();
//可以指向的引用类型不确定了,父类的引用指向子类
Student s1 = new Student();
Person s2 = new Student();
Object s3 = new Student();
//对象能执行的方法,主要看对象左边的类型
多态是方法的多态,属性没有多态
父类和子类,要有联系。
存在条件:继承关系,子类重写父类方法,父类引用指向子类对象
instanceof
System.out.println(X instanceof Student);
//能否编译通过取决于X和Y之间是否有父子关系
子类转化为父类,可能丢失一些方法
static
静态属性
public class Student{
private static int age;//静态的变量 多线程!
private double score;//非静态的变量
public static void main(String[] args){
Student s1 = new Student();
System.out.println(Student.age);//建泰属性直接使用类名调用即可
System.out.println(s1.age);//非静态属性实例化后
System.out.println(s1.score);
}
}
静态方法
抽象类
//抽象类 ,单继承
public abstract class Action{
//约束
public abstract void doSomething();
}
不能new这个抽象类,只能靠子类去实现它:约束
抽象类中可以写普通的方法~
抽象方法必须要在抽象类中~
接口
普通类:只有具体实现
抽象类:具体实现和规范(抽象方法)都有!
接口:只有规范。约束和实现分离:面向接口编程
声明接口的关键字是interface
接口中的所有定义其实都是抽象的public abstract
public interface UserService{
void add(String name);
void delete(String name);
void update(String name);
void query(String naem);
}
定义接口后,写它的实现
//类实现接口,implements 接口
//实现接口中的类,就需要实现其中的方法
public class UserServiceImpl implements UserService{
}
//利用接口实现多继承
接口的作用:1.约束 2.定义一些方法,便于分工
内部类
就是在一个类的内部再定义一个类,比如A类中定义一个B类,那么B类相对A类来说就称为内部类,而A类相对B类来说就是外部类.
比如
public class Outer{
private int id;
public void out(){
System.out.println("这是外部类的方法");
}
public class Inner{
public void in(){
System.out.println("这是内部类的方法");
}
}
}
异常
异常处理五个关键字:try、catch、finally、throw、throws
Error和Exception:Error通常是灾难性的致命错误,是程序无法控制和处理的,当出现这些异常时,Java虚拟机一般会选择终止线程;Exception通常情况下是可以被程序处理的,并且在程序中应该尽可能地去处理这些异常。
int a = 1;
int b = 0;
try{
//try监控区域
System.out.println(a/b);
}catch(ArithmeticException e){
System.out.println("程序出现异常,变量b不能为0");}finally{
//处理善后工作
System.out.println("finally");
}
//finally 可以不要finally
自定义异常
public class MyException extends Exception{
}