变量
类变量
加了一个“static”,从属于类的,在方法外面。
局部变量
必须申明和初始化值
实例变量
在类里面方法外面,从属于对象;如果不自行初始化,这个类型的默认值就为 0,0.0。
布尔值默认为false,除了基本类型,其余的默认值都是null;
public class variable{ static int allClinks=0; //类变量 String str = "hello world";//实例变量 public void method(){ int i = 0 ; //局部变量 } }
常量 final
修饰符不分先后顺序
命名规范
-
所有变量、方法、类名需见名知意;
-
类成员变量:首字母小写和驼峰原则:monthSalary,除了第一个单词,后面的单词首字母大写;
-
局部变量:首字母小写和驼峰原则;
-
常量:大写字母和下划线;MAX_VALUE
-
类名:首字母大写和驼峰原则:Man、MonthMoney
-
方法名:首字母小写和驼峰原则:run();runTow();
一元运算符
自增++,自减--
a++自增就是在运行例如b=a++;之后再下一行进行a=a+1;操作(隐形操作)
++a自增就是在运行例如b=a++;之前再下一行进行a=a+1;操作(隐形操作)
自减同理;
逻辑运算符
与(and)或(or)非(取反)
与就是两个同时为真才为真
或就是有一个为真结果就是真
非就是取反
位运算
三元运算符
x?y:z //如果x==true ,则结果为y,否则为z
包机制
一般利用公司域名倒置作为包名。
.*:通配符,全部导入。
JavaDoc
javadoc命令是用来生成自己的API文档用的。
具体参数:
@author 作者名
@version 版本号
@since 指明需要最早使用的jdk版本
@param 参数名
@return 返回值情况
@throws 异常抛出情况
生成文档命令如下:
通过命令行 javadoc -encoding utf-8 -charset utf-8 java文件
## 数组,我不想写啦
JAVA流程控制
1.Scanner对象
-
语法 Scanner s = new scanner
-
通过Scanner类的next()与nextLine()方法获取输入的字符串,再读取前我们一般要用hasNext()与hasNextLine()判断是否还有输入的数据。
-
两者是有区别的,next输入的不能有空格,nextLine输入的可以有空格。
public class demo02 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("使用next方式接受:"); //判断用户有没有输入字符串 if(scanner.hasNext()){ String str = scanner.next(); //将输入的内容存到str字符串中。 //使用next方式接收 System.out.println("输入的内容为:"+str);//输出 } scanner.close();//关闭IO,节省资源 } } 输入:hello world! 输出:hello
public class demo03 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("使用nextLine方式接受:"); //判断用户有没有输入字符串 if(scanner.hasNextLine()){ String str = scanner.nextLine(); //将输入的内容存到str字符串中。 //使用next方式接收 System.out.println("输入的内容为:"+str);//输出 } scanner.close();//关闭IO,节省资源 } } 输入:hello world! 输出:hello world!
public static void main(String[] args) { //需求:通过输入多个数字,统计其总和并求其平均数 System.out.println("请输入数据,整数或浮点数,以非两者符号结束"); Scanner scanner = new Scanner(System.in); int i; int count=0; int sumInt = 0; double d; double sum = 0.0; double avergae = 0.0; while(scanner.hasNextInt()){ i=scanner.nextInt(); count++; sumInt=sumInt+i; System.out.println("输入的数是:"+i+" 目前整数总和为:"+sumInt); } while(scanner.hasNextDouble()){ d=scanner.nextDouble(); count++; sum+=d; System.out.println("输入的数是:"+d+" 目前小数总和为:"+sum); } if(count!=0){ avergae=(sum+sumInt)/count; } else System.out.println("还没输入呢!"); System.out.println("平均数为:"+avergae); scanner.close(); }
hasnextInt()判断下一个输入的字符是不是整数。
hasnextDouble()同理。
顺序结构
equals()判断字符串是否相等。
switch不加break就会case穿透。
break:在任何循环语句的主体部分,均可用break控制循环的流程。break用于强制退出循环,不执行循环中的剩余语句。
continue :语句用于在循环语句中,用于终止某次循环过程,即跳过该该循环体中尚未执行的语句,接着进行下一次是否执行循环语句的判断。
Java方法
方法重载
重载就是在一个类中,有相同的函数名称,但是形参不同的函数。
方法重载的规则:
-
方法名称必须一致
-
参数列表必须不同(个数不同、或类型不同、参数排列顺序不同)
-
方法的返回类型可以相同也可以不同
-
仅仅返回类型不同不足以构成方法重载。
方法名称相同时,编译器会根据调用方法的参数个数、参数类型等去匹配,以选择对应的方法,如果匹配失败,则编译器报错。
可变参数
在方法声明中,在指定参数类型后加一个省略号(...)。
一个方法中只能指定一个可变参数,他必须是在方法的最后一个参数,任何普通参数必须在它前面声明。
递归
即本方法调用本方法,自己调用自己。
结构组成部分:
-
递归头:什么时候不调用自身方法。如果没有头,将彻底陷入死循环。
-
递归体:什么时候需要调用自身方法。
面向对象
方法
方法的定义
-
修饰符
-
返回类型
-
break:跳出switch,结束循环。return:结束方法
-
方法名:注意规范,见名知意
-
参数列表:(参数类型,参数名)
-
异常抛出:先不说
public class Demo01 { public static void main(String[] args) { //main方法 } /* 修饰符 返回值类型 方法名(...形参){ 方法体 return 返回值; } */ public static String say(){ return "你好!"; } }
方法的调用
-
静态方法 :加static就是静态方法,它和类一起加载。类名.方法()调用时,那个方法必须是静态的,否则要实例化对象。
-
非静态方法
-
形参与实参
-
值传递与引用传递
-
this关键字
package oop.Demo01; //引用传递:对象,本质还是值传递 public class Demo04 { public static void main(String[] args) { Person person = new Person(); System.out.println(person.name); change(person); System.out.println(person.name); } public static void change(Person person){ //person 是一个对象,指向的Person person = new Person();这是一个具体的人,可以改变属性。 person.name="sb"; } } class Person{//定义了一个person类,有两个属性,name,sex String name; String sex; } 输出结果:null sb
package oop.Demo01; public class Demo03 { //值传递 public static void main(String[] args) { int a=1; System.out.println(a); change(a); System.out.println(a); } public static void change(int a){ a=100; } } 输出结果:1 1
类与对象的关系
类是一种抽象的数据类型,它是对某一类事物整体的描述、定义,但是并不能代表某一个具体的事物。
人是类
对象是抽象概念的具体实例
张三是对象
构造器
-
和类名相同
-
没有返回值,也不能写void
作用:
-
new 本质是在调用构造方法
-
初始化对象的值
注意点:
-
定义有参构造之后,如果想使用无参构造,需要显示的构造一个无参构造
alt+insert 快捷键 快速生成构造方法
this. ...代表当前类的 =后面的是参数传进来的值
面向对象的总结
-
类与对象:类是一个模板:抽象;对象是一个具体的实例
-
方法:要注意定义域调用!!
-
对应的应用:
引用类型: Java有 5种引用类型(对象类型):类 接口 数组 枚举 标注
对象是通过引用来操作的:栈-->堆
-
属性:字段Field 成员变量
默认初始化:
数字:0 0.0
char: u0000
boolean: false
引用: null
修饰符 属性类型 属性名 = 属性值
-
对象的创建于使用
-
必须使用new关键字创造对象,构造器 Person p = new Person();
-
对象的属性 p.name
-
对象的方法 p.say()
-
-
类:
静态的属性 属性
动态的行为 方法
封装、继承、多态
封装
属性私有,get,set (追求高内聚低耦合)
Alt+insert自动构造
继承
extends,子类是父类的扩展。
Java中只有单继承没有多继承!!!!!(一个儿子只能有一个爸爸,一个爸爸可以有多个儿子)
继承是类与类之间的关系。除此之外还有其他的 例如依赖、组合、聚合等等。
子类继承父类,使用关键字extends来表示。
在Java中,所有的类,都默认直接或间接继承object类。
Ctrl+h打开结构
super
super注意点:
-
super调用父类的构造方法,必须在构造方法的第一个
-
super必须只能出现在子类的方法或者构造方法中!
-
super和 this不能同时调用构造方法!
Vs this: 代表的对象不同: this:本身调用者这个对象
super:代表父类对象的引用
前提 this:没有继承也可以使用 super:只能在继承条件才可以使用
构造方法 this() ;本类的构造
super():父类的构造!
方法重写
重写:需要有继承关系,子类重写父类的方法!
-
方法名必须相同
-
参数列表列表必须相同
-
修饰符:范围可以扩大但不能缩小:public>Protected>Default>private
-
抛出的异常:范围,可以被缩小,但不能扩大; ClassNotFoundException --> Exception(大)
重写,子类的方法和父类必须要一致;方法体不同!
为什么需要重写: 父类的功能,子类不一定需要,或者不一定满足!
Alt + Insert : override;
多态
即同一个方法可以根据发送对象的不同而采取多种不同的行为方式。
-
一个对象的实际类型是确定的,但可以指向对象的引用类型有很多
-
多态存在的条件: 1. 有继承关系 2. 子类重写父类方法 3. 父类引用指向子类对象
注意:多态是方法的多态,属性没有多态。
父类和子类,有联系,类型转换异常:ClassCastException!
存在条件:继承关系,方法需要重写,父类引用指向子类对象! Father f1 = new son();
public class Application { public static void main(String[] args) { //一个对象的实际类型是确定的 //new Person(); //new Student(); //可以指向的引用类型就不确定了:父类的引用指向子类 //Student能调用的方法都是自己的或继承父类的 Student s1 = new Student(); //Person 父类型,可以指向子类,但是不能调用子类独有的方法。 Person s2 = new Student(); Object s3 = new Student(); //对象能执行那些方法,主要看对象左边,和右边关系不大! s2.run();//子类重写了父类的方法,执行父类的方法, // 如果子类没有重写父类的就调用父类的,如果子类和父类都有就调用子类的 s1.run(); } }
不能重写
-
static 方法,属于类,不属于实例
-
final 常量;
-
private 方法;
instanceof(类型转换)
比较两个对象有没有父子关系。引用类型,判断一个对象是什么类型。
static
方法与属性调用,静态的与类一起加载,调用时,静态的能直接加载,非静态的需要实例化对象后使用。
public class Student { public static int a;//静态变量 public int b;//非静态变量 public static void run(){ System.out.println("这是run静态方法"); } public void go (){ System.out.println("这是go非静态方法"); } public static void main(String[] args) { run();//静态方法可以直接调用 new Student().go();//只能实例化对象后才能调用非静态方法 } }
静态代码块
public class Person { { //代码块(匿名代码块)在构造器之前,赋初始值用 System.out.println("匿名代码块"); } static { //静态代码块,只执行一次 System.out.println("静态代码块"); } public Person() {//构造器 System.out.println("构造器"); } public static void main(String[] args) { new Person(); System.out.println("=================="); Person person1 = new Person(); } } /* 静态代码块 匿名代码块 构造器 ================== 匿名代码块 构造器 */ //
被final修饰后不能被继承了
抽象类
abstract修饰符可以用来修饰方法也可以修饰类,如果修饰类,那么该类是抽象类。
-
抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类。
-
抽象类,不能使用new关键字类创造对象,他使用来让子类继承的。
-
抽象方法,只有方法的声明,没有方法的实现的。
-
子类继承抽象类,那么久必须要实现抽象类没有实现的抽象方法,否则该子类也要声明为抽象类。
public abstract class Action {//抽象类 //约束,有人帮我们实现,即子类继承后实现 //abstract,抽象方法,只有方法名,没有方法的实现 public abstract void dosomething(); //不能new这个抽象类,只能靠子类去实现它,约束 public void sayhello(){//抽象类中能写普通方法,抽象方法必须在抽象类中 System.out.println("hello"); }
public class A extends Action {//抽象类中的所有方法,继承它的子类都必须实现它的方法,除非它也是抽象类 @Override public void dosomething() { } }
接口
只有规范,自己无法写方法,约束与实现分离!!!implements关键字
作用:
-
约束
-
定义一些方法,让不同的人实现
-
public abstract
-
public static final
-
接口不能被实例化,接口中没有构造方法
-
implements可以实现多个接口
-
必须要重写接口中的方法
package oop.Demo06; public class UserServiceImp implements UserService,Timer {//implements关键字实现接口 //接口可以实现多继承 @Override public void run() { } @Override public void add() { } @Override public void delete() { } @Override public void update() { } @Override public void query() { System.out.println("hello 我是query!!"); } public static void main(String[] args) { new UserServiceImp().query(); } }
public interface UserService {//interface关键字 public void run();//只能写规范,实现不能写 //接口中的所有定义其实都是抽象的 public abstract void add(); void delete(); void update(); void query(); }
package oop.Demo06; public interface Timer { public void add(); }
内部类
-
成员内部类,不能包含静态变量,能有静态常量。
public class Outer { private int id; public void out(){ System.out.println("这是外部类方法"); } public class inner{ public void in(){ System.out.println("这是内部类方法"); } public void getId(){//获得外部类的私有属性,私有方法 System.out.println(id); } } public static void main(String[] args) { Outer outer = new Outer(); //通过外部类来实例化内部类 inner inner = outer.new inner(); inner.in(); inner.getId(); outer.out(); } }
-
静态内部类
加上static就好了,不依赖外部对象,可以直接用类名访问。可以有静态变量。级别和外部类一样。
-
匿名内部类
public class Test { public static void main(String[] args) { new B().eat();//没有名字初始化类,不用将类保存到变量中 C c1 = new C(){ @Override public void put() { } }; } } class B{ public void eat(){ System.out.println("eat"); } } interface C{ void put(); }
-
局部内部类(写在方法中)
public class Part { public void func(){ class partIneer{//局部内部类 public void in(){ System.out.println("局部内部类"); } } } }
异常机制
实际工作中,遇到的情况不可能是非常完美的。比如:你写的某个模块,用户输入不-定符合 你的要求、你的程序要打开某个支件,这个文件可能不存在或者文件格式不对,你要读取数据库的数据,数据可能是空的等。我们的程序再跑着,内存或硬盘可能满了。等等。 软件程序在运行过程中,非常可能遇到刚刚提到的这些异常问题,我们叫异常,英文是:Exception,意思是例外。这些,例外情况,或者叫异常,怎么让我们写的程序做出合理的处 理。而不至于程序崩溃。 异常指程序运行中出现的不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等。 异常发生在程序运行期间,它影响了正常的程序执行流程。
要理解Java异常处理是如何工作的,你需要掌握以下三种类型的异常:
-
检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。 例如要打开一个不存在文件时, -一个异常就发生了,这些异常在编译时不能被简单地忽略。
-
运行时异常:运行时异常是可能被程序员避免的异常。 与检查性异常相反,运行时异常可以在编译时被忽略。
-
错误:错误不是异常, 而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,个错误就发生了,它们在编译也检查不到的。
捕获异常
public class YiChang { public static void main(String[] args) { int a = 5; int b = 0; try {//ctrl alt+T快捷生成 System.out.println(a/b); }catch (ArithmeticException e){ //catch(想要捕获异常的类型) System.out.println("程序出错,被除数不能为零!"); }catch (Error e){ System.out.println("Error "); } catch (Throwable e){ System.out.println("Throwable"); } finally{//处理善后工作,例如关闭IO等等 System.out.println("finally"); } } }
抛出异常
throw throws,一般应用在方法中
自定义异常
使用Java内置的异常类可以描述在编程时出现的大部分异常情况。除此之外,用户还可以自定 义异常。用户自定义异常类,只需继承Exception类即可。 在程序中使用自定义异常类,大体可分为以下几个步骤: 1.创建自定义异常类。 2.在方法中通过throw关键字抛出异常对象。 3.如果在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理;否则在方法 的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下-步操作。 4.在出现异常方法的调用者中捕获并处理异常。
实际应用中的经验总结
处理运行时异常时,采用逻辑去合理规避同时辅助try-catch处理。 在多重catch块后面,可以加一个catch (Exception) 来处理可能会被遗漏的异常。
对于不确定的代码,也可以加上try-catch,处理潜在的异常。
尽量去处理异常,切忌只是简单地调用printStackTrace()去打印输出。
具体如何处理异常,要根据不同的业务需求和异常类型去决定。
尽量添加finally语句块去释放占用的资源。