包
修饰符
权限修饰符的访问权限
状态修饰符
final
final(最终态)
1. 可以修饰成员方法,成员变量,类
2.被final修饰过的字段不可以被再次赋值
public class son(){
public final int age=30;
public void test(){
age=100 //如果再次给age赋值,系统就会报错,因为age已经被final修饰过了,常量是不可以被改变的
}
}
3.final修饰方法,表明该方式是最终方法,不能被重写
4.final修饰变量,表明该变量是常量,不能被赋值
5.final修饰类,表明该类是最终类,不能被继承
static(静态)
修饰的特点:
1.被类的所有对象共享
public class Zi {
public static String university;
public void show(){
System.out.println(university);
}
}
2.可以通过类名调用
public class Test {
public static void main(String[] args) {
Zi.university="清华大学";
Zi z1 = new Zi();
Zi z2 = new Zi();
z1.show();
z2.show();
}
}
多态
多态的形式
- 抽象类多态
- 接口多态
- 具体类多态
条件
-
存在继承/实现关系
-
有方法的重写
-
有父类引用指向子类对象
Animal ani=new Cat();
成员变量的访问特点
- 成员变量:编译看左边,执行看右边
- 成员方法:编译看左边,执行看右边
存在差异的原因
- 方法可以重载,而成员变量不可以重载
好处/弊端
- 好处:提高了程序的扩展性
- 具体实现:定义方法时,使用父类作为参数,在使用时,使用具体的子类型操作
- 弊端:不用使用子类特有的功能
抽象类
-
抽象类不能实例化,可以参照多态的方式实例化
Animals ani=new Cat();
-
抽象类中可以有非抽象方法,也可以有抽象方法,也可以有字段
-
抽象类中可以有构造方法,作用
-
用于子类访问父类数据的初始化
-
抽象类的子类
- 要么重写抽象类中所有的抽象方法**[限定子类必须完成某些动作]**
- 要么是抽象类
接口
接口特点
-
interface修饰接口
public interface Fu(){}
-
implements接受接口
public class Zi implements Fu(){}
-
接口不能实例化,但可以参照多态的方法实例化对象
-
接口实现类条件
- 子类重写接口中所有的抽象方法
- 子类为抽象类,但是下一个非抽象的子类最终还是要重写接口中所有的抽象方法
接口中成员特点
-
成员变量只能是常量
int a=30; //其实系统默认: public final int a=30;
-
成员方法只能是抽象方法
void test(); //其实默认是: public abstract void test();
-
接口中没有构造方法(主要是对行为进行抽象的,是没有具体实现的)
接口和接口的关系
- 继承关系 可以单继承,也可以多继承
抽象类与接口的区别
- 抽象类是对事物的抽象,而接口是对行为的抽象
小例子
内部类
-
内部类可以直接访问外部类的成员[包括私有!!!]
-
外部类访问内部成员把必须创建对象
public class Cat(){ private int age=10; public class Dog(){ public void test(){ System.out.print(age); } } Dog dog=new Dog();//创建对象,才可访问内部类 dog.test(); }
System常用方法
-
System.exit(0);
- 终止当前正在运行的Java虚拟机,非零表示异常终止,0表示正常终止
-
System.currentTimeMillis();
-
//返回当前时间,与1970年之前相差的毫秒值
-
常用法
-
long begin =System.currentTimeMillis(); for(int i=0;i<100;i++){} long end=System.currentTimeMillis(); System.out.print(end-bigin);{{
-
看方法的源码
- 选中方法,按下 Ctrl + B
Object类
-
toString()
//Zi类 public class Zi { String name; int age; public Zi(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Zi{" + "name='" + name + '\'' + ", age=" + age + '}'; } } //测试类 public class Test { public static void main(String[] args) { Zi zi = new Zi("连杰",19); System.out.println(zi.toString()); System.out.println(zi); } }
-
equals()可以比较两个对象里面的值是否相同(需要重写,可自动生成)
@Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Zi zi = (Zi) o; if (age != zi.age) return false; if (p != zi.p) return false; return name != null ? name.equals(zi.name) : zi.name == null; }
基本类型的包装类
//简单实用方法,valueOf里面只能为数字字符,或数字,不能为被的"abc" Integer valueOf = Integer.valueOf("123"); System.out.println(valueOf);
int/String之间的相互转换
//把int类型转换为String类型
int number=100;
String s=String.valueOf(number);
System.out.println(s);
System.out.println("------");
//String类型转换为int类型
int i=Integer.parseInt(s);
System.out.println(i);
自动装箱和拆箱
-
装箱:把基本数据类型转换为对应的包装类类型
-
拆箱:把包装类类型转换为对应的基本数据类型
Integer i=100;//自动装箱 i+=200;//先后经历了(自动拆箱和自动装箱)
只要是对象,在使用前就要判断不为null的判断
Data类基本用法
-
用法一:不带参数,显示当前时间
Date date = new Date(); System.out.println(date); // Sun Apr 24 15:20:08 CST 2022 CST(中国标准时间)
-
用法二:带参数(long类型):显示的是从1970年0时0分0秒经过Long时间后的时间
long s=1000*60*60; Date date = new Date(s); System.out.println(date); // Thu Jan 01 09:00:00 CST 1970 (注意:这里显示的是中国的时间,存在时区差异,所以这里是9时)
-
两个方法 gettime/settime
-
//gettime Date d= new Date(); System.out.println(d.getTime()); //输出:1650785643191 从1970 0 0 0 到现在时间经历的毫秒数 //settime Date d= new Date(); long s=3600*1000; d.setTime(s); System.out.println(d); //输出:Thu Jan 01 09:00:00 CST 1970(存在时区差异)
SimpleDateFormat
- 是一个类,区域设计敏感的方式格式化和解析日期
- 常用的模式格式字母的对应如下关系:
- 年 y
- 月 M
- 日 d
- 时 H
- 分 m
- 秒 s
- 从Date到String format
Date d= new Date();
SimpleDateFormat sdf = new SimpleDateFormat();
String s=sdf.format(d);
System.out.println(s);
//22-4-24 下午5:06 默认的格式
//根据模式格式字母自己设计
Date d= new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日_HH:mm:ss");
String s=sdf.format(d);
System.out.println(s);
//2022年04月24日_17:21:18
- 从String到Date parse
String s="2022年4月24号 17:25:36";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd号 HH:mm:ss");
Date date=sdf.parse(s);
System.out.println(date);
//输出:Sun Apr 24 17:25:36 CST 2022
工具类创建时注意事项
-
构造方法私有(外界就无法构造对象)
-
public class Run(){ private Run(){}//构造方法私有,外界无法创建对象 }
-
成员方法静态(直接通过类.方法名就可以使用)
Calendar
简单使用方法 Calendar.get() 返回给定日历字段的值
Calendar c=Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH) + 1;
int date = c.get(Calendar.DATE);
System.out.println(year+"年"+month+"月"+date+"日");
常用方法 add(int filed ,int count)
//当前 2022 2 24
Calendar c=Calendar.getInstance();
//add使用方法 可以对日期修改 (加减都可以)
c.add(Calendar.YEAR,-19);
c.add(Calendar.DATE,3);
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH) + 1;//小细节 默认月是从0开始的 所以和实际的会相差1
int date = c.get(Calendar.DATE);
System.out.println(year+"年"+month+"月"+date+"日");
//输出; 2003 4 27
set( ) 可以自己设定 年 月 日等信息
Calendar c=Calendar.getInstance();
c.set(2003,4,27);
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);//注意,这个设定的月份是多少就是多少,不用在+1了
int date = c.get(Calendar.DATE);
System.out.println(year+"年"+month+"月"+date+"日");
//输出: 2003年4月27日
利用Calendar判断某年的2月份有多少天
package com.extend;
import java.text.ParseException;
import java.util.Calendar;
import java.util.Scanner;
public class Test {
public static void main(String[] args) throws ParseException {
Scanner sc = new Scanner(System.in);
System.out.print("请输入年份:");
int year=sc.nextInt();
Calendar c=Calendar.getInstance();
c.set(year,2,1);//设置为2,因为系统是从0开始的,所以设置2系统认为的是3:
c.add(Calendar.DATE,-1);//3月份的第一天减1天就是二月份的最后一天了
int days=c.get(Calendar.DATE);//接受二月份二点最后一天
System.out.println(year+"年"+"二月份有"+days+"天");
}
}
异常[Throwable]
- Error
- Exception
- RuntimeEcxeption(编译期不检查,出现问题后需要我们回来修改代码)
- 非RuntimeException(编译期就必须处理,否则无法通过编译,不能正常运行)
-
Throwable中三个常用的方法
e.printStackTrace();//常用,显示的信息最全 e.toString(); e.getMessage();
-
异常分为两大类
- 编译时异常:(受检异常)要做显示处理(try catch)
- 运行时异常:(非受检异常)
-
//自定义异常 //1.继承Exception //2.构造有参和无参构造方法 public class SourceException extends Exception{ public SourceException() { } public SourceException(String message) { super(message); } } ------------------------------------------------------------------------- public class Teacher { public void test(int score) throws SourceException {//非运行时异常需要throws if(score<0||score>100){ //自定义异常格式 throw new 自定义异常的类名(自定义输入异常信息) throw new SourceException("给出的分数有误!再思考一下!!!"); }else { System.out.println("分数合理"); } } } ------------------------------------------------------------------------- public class Test { public static void main(String[] args) throws SourceException {//非运行时异常需要throws Teacher tea = new Teacher(); Scanner sc = new Scanner(System.in); int score=sc.nextInt(); tea.test(score); } }