java语法
java语法
流程控制
Scanner对象
用来获取用户的输入
Scanner s = new Scanner(System.in);
String str = s.nextLine(System.in);
获取字符串:nex()、nextLine()
判断是否还有输入的数据:hasNext()、hasNestLine() 一般在读取数据前判断
用完之后要关掉:s.close();
增强For循环
循环数组和集合
for (声明语句:表达式){
int[] numbers = {10,20,30,42};
for(int x:numvers){
System.out.println(x);
}
方法
public static void Hello(){
System.out.prinln("Hello World!");
}
public 公共的
static 静态方法:独立该类的任何对象,不依赖类特定的实例,被类的所有实例共享
- 能直接调用,不是static方法则需要实例化才能调用
- static方法不能调用非static方法 (static方法与类同时加载,非static方法在类实例化之后才加载)
- void 返回值
- 值传递:复制实参的值给形参
- 引用传递:对于对象,可以改变对象的属性,本质还是值传递
方法的重载
方法名相同,但形参不同
- 方法名相同
- 参数列表不同
- 返回类型可以相同可以不同
- 仅仅返回类型不同不足以成为方法的重载
方法名相同时,编译器根据调用方法的参数个数、类型等去匹配对应的方法
命令行传参
cmd:java文件路径下编译文件 -> 退回到src文件下运行(eg:java com.method.Demo01)并传参
可变参数
在方法声明中,在指定参数后加省略号
一个方法只能指定一个可变参数且必须时方法的最后一个参数
public static int add(int... num){
}
数组
创建:dateType[] arrayRefVar = new dateType[arraySize];
Arrays类
面向对象
实质:以类的方式组织代码,以对象的组织(封装)数据
一个类中只能有一个public
创建对象
使用new关键字创建对象
public class Student{
String name;
int age;
public void study(){
System.out.println(this.name+"在学习");
}
}
public class Application{
public static void main(String[] args){
Student lihua = new Student;
System.out.println(lihua.name);
lihua.study();
}
}
类的构造器(构造方法)
- 实例化时会自动隐式定义,也可显示定义
- 必须与类的名称相同
- 没有返回类型(不是void)
- 能实例化初始值
- 定义了有参构造,无参构造就必须显示定义(尽量把无参构造显化)
封装
高内聚,低耦合
数据的隐藏
- 属性私有:private关键字
private int name;
- get/set方法:可以操作私有属性
public String getName{
return this.name;
}
public void setName(String name){
this.name = name;
}
继承
对一批类的抽象
拓展:extends
public class Person{
}
public class Student extends Person(){
}
类只有单继承,没有多继承
java中所有的类都默认继承Object类
- this关键字:引用当前对象
- super关键字:引用父类对象
构造器
子类构造器默认调用父类构造器
调用构造器必须是构造函数主体的第一条语句(this()、super())
public class Person{
}
public class Student extends Person(){
public Student(){
//super();默认调用父类构造器
}
}
方法的重写
重写(Override)都是方法的重写,与属性无关
public class B(){
public static void text{
System.out.println("B->text()");
}
}
public class A extends B{
public static void text(){
System.out.println("A->text()");
}
}
public class A extends B{
public static void main(String[] args){
A a = new A();
a.text();/*静态方法:A->text()
非静态方法:A->text()
*/
B b = new A();//父类的引用指向了子类
b.text();/*静态方法:B->text()
非静态方法:A->text()
*/
}
}
- 静态方法:方法调用只和定义的数据类型有关
- 非静态方法:重写了父类的方法,调用时使用的是重写了之后的方法(需要用public)
- 修饰符:public > protected > default(默认) > private(范围可以扩大但不能缩小)
多态
同一方法可以根据发送对象的不同而采用不同的行为方式
一个对象的实际类型是确定的,指向的引用类型不确定
Student s1 = new Student();
Person s2 = new Student();
Object s3 = new Student();
-
对象能执行的方法主要看定义的类型
-
多态存在的必要条件
- 继承
- 重写
- 父类引用指向子类对象
-
关键字instanceof:a instanceof b判断两个对象之间是否存在父子关系(a(a的实际类型)是否是b的子类)
static
类加载时static方法就加载
public class Demo{
static{}//静态代码块,最先加载,只执行一次
{}//匿名代码块,其次加载,可以用来赋初值
public Demo(){}//构造器,最后加载
}
- 静态导入包:可以直接使用方法
import static java.lang.Math.random;
抽象类
- 关键字:abstract
不能new抽象类
抽象类里可以写普通方法
抽象方法必须在抽象类中
//抽象类
public abstract class Action{
//约束,抽象方法
public abstract void doSomething();
}
继承了抽象类的子类必须实现抽象类的方法,除非子类也是抽象类
抽象类也存在构造器
接口
只有规范,不能写方法,实现约束和实现分离:面向接口编程
- 关键字:interface
public interface UserService{
//接口中的所有定义都是抽象的:public abstract(方法)、public static final(属性)
void add();
}
public interface TimeService{
void time();
}
- 接口都需要有实现类
接口可以多继承
//命名规则:接口名加Impl,用关键字implements实现
public UserServiceImpl implements UserService,TimeService{
public void add(){
}
public void time(){
}
}
内部类
成员内部类,静态内部类
public class Outer{
private int id;
public void out(){
System.out.println("外部");
}
public class Inner{
public void in(){
System.out.println("内部");
}
//能获得外部类的私有属性,加static之后(静态内部类)则不能获得
public void getID(){
System.out.println(id);
}
}
}
//实例化
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
public class Demo01{
}
//一个类文件中只能有一个public类
class Demo02{
}
局部内部类
public class Demo01{
public void method(){
class Inner{
public void in(){
}
}
}
}
匿名内部类
public class Demo01{
public void run(){
}
}
new.Demo01().run();//没有名字
异常
把异常当做对象处理,并定义一个基类java.lang.Throwable作为所有异常的超类
- 关键字:try、catch、finally、throw、throws
public class Demo01{
public static void main(String[] args) {
int a=1;
int b=0;
try{//try监控异常
System.out.println(a/b);
}catch (ArithmeticException e){//catch(捕获的异常类型)捕获异常,可以写多个,捕获多个异常
System.out.println("0");
}finally{//善后,可以不使用,一般用于释放资源
System.out.println("finally");
}
}
public void add(int a,int b) throws ArithmeticException{//方法上抛出异常
if(b==0){
throw new ArithmeticException();//主动抛出异常,一般在方法中使用
}
}
}
自定义异常:自定义异常类并继承Exception类