内部类:
首先内部类是
public class Outer {
class Inner{
}
}
这种,而不是下面这种
public class Outer {
}
class Inner{
}
对于外部类和内部类的成员变量和方法的使用
public class Outer {
/**
* 外部类调用内部类的成员方法或者变量需要通过new 内部类对象
* */
private int age = 10;
public void show(){
System.out.println(age);
System.out.println(new Inner().age);//new 内部类对象才能调用
}
public static void main(String[] args) {
Outer outer = new Outer();
outer.show();
}
class Inner{
/**
* 内部类可以直接调用外部类的成员
* 非静态内部类不能定义静态变量或者方法,原理是static会先加载,还没加载内部类就不可能加载静态变量
* */
private int age = 11;
private String name;
public void show(){
int age = 12;
System.out.println(age);//就近原则,局部变量
System.out.println(this.age);//当前类的变量,当前类为内部类
System.out.println(new Outer().age);//外部类的变量的调用方法
}
}
}
1.内部类可以直接调用外部类的成员变量和方法而外部类调用内部类的成员变量和方法则需要新的内部类对象
2.内部类和外部类同名变量的调用遵循就近原则(具体看上面的代码)
3.非静态内部类中不能有静态变量或方法
对于在主方法中创建内部类的对象(因为静态变量需要先加载)
public static void main(String[] args) {
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
outer.show();
}
静态内部类
public class Outer {
private static String name="xzh";
static class Inner{
public void show(){
System.out.println(name);
}
}
}
静态内部类可以直接调用外部类的静态方法
public static void main(String[] args) {
//创建静态内部类 对象。。。
Souter.Inner inner=new Souter.Inner();
inner.innerShow();
}
静态内部类创建对象
重点:匿名内部类
首先建立一个接口和一个抽象类
//这是一个接口
public interface MyMouseClickEvent {
public void mouseKeyUp();
public void mouseKeyDown();
}
//这是一个抽象类
public abstract class Pet {
public abstract void eat();
}
匿名内部类的建立
public class Test {
public static void main(String[] args) {
//优势:在于不用建立一个新的子类 直接 根据需求实现功能即可
//事件()
Pet pet=new Pet(){//匿名内部类 实际上这个匿名内部类可以理解成就是一个 Pet的子类 没有名字的子类
@Override
public void eat() {
System.out.println("睡完了开始吃了。。。");
}
};
pet.eat();//调用子类重写的方法。。。
new MyMouseClickEvent(){
@Override
public void mouseKeyUp() {
System.out.println("鼠标按键弹起触发。。。。");
}
@Override
public void mouseKeyDown() {
System.out.println("鼠标按键按下触发。。。。");
}
}.mouseKeyUp();
}
}
匿名内部类可用于抽象类的继承和接口的实现
以上是两种不同的写法
匿名内部类可以预测是一个成员变量,故最后结尾有;符
时间类
Date(util包):很多方法都已经过时了
需要掌握的
<1>。字符串与日期(Date)之间的互相转换
1.日期转串
public class Time {
public static void main(String[] args) {
Date date = new Date();
//SimpleDateFormat()括号中自定义格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
//format方法用来把Date类型转变成字符串类型(根据自定义类型)
String time = sdf.format(date);
System.out.println(time);
}
}
2.String转日期
public class Time {
public static void main(String[] args) throws ParseException {
String strData = "2020:05:27 09:04:00";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss");
Date date = sdf.parse(strData);
System.out.println(date);
}
}
双向转日期要注意的是串行格式和SimpleDateFormat的格式必须要相同才能转换成功(年份应写成yyyy小写而不是YYYY大写)
<2>自定义格式
public class Time {
public static void main(String[] args) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss");
Date date = new Date(2020-1900,5-1,27,9,16,2);
String dateFormat= sdf.format(date);
System.out.println(dateFormat);
}
}
对与Date的自定义时间要注意的有两点
其一:年份要减1900
其二:月份是从0开始到11,所以需要-1才是正确的月份
<3> .getTime():获取当前时间相隔1970年1月1号之间的毫秒数
public static void main(String[] args) {
Date date = new Date(1000);//1970年1月1号之后1000毫秒
System.out.println(date.toLocaleString());
System.out.println(date.getTime());//1970年1月1号之后毫秒数
}
一般如果需要得到年月日时分秒的或需要将字符串转换成时间格式的,可以采用日期配合simpledateformat使用
<2. > 日历日历类
首先日历类是一个抽象类,所以不能通过new对象的方法来得到
而是通过Calendae内的getInstance方法得到
// 2。获取年份
System.out.println(“获取年份:” + ca.get(Calendar.YEAR));
// 3。获取月份0-11
System.out.println(“获取月份:” +(ca.get(Calendar.MONTH)+1));;
//获取日字数
System.out.println(“获取日子数:” + ca.get(Calendar.DAY_OF_MONTH));
//获取小时数
System.out.println(“小时数:” + ca.get(Calendar.HOUR_OF_DAY));
//获取分钟数
System.out.println(“获取分钟数:” + ca.get(Calendar.MINUTE)); System.out.println(“获取秒钟数:” + ca.get(Calendar.SECOND));
//获取秒钟数。
//星期天1星期1 2
System.out.println(“获取星期数:” +(ca.get(Calendar.DAY_OF_WEEK)-1)); System.out.println(“一个月中的最大天数:” + ca.getActualMaximum(Calendar.DAY_OF_MONTH));
// //指定月份对应的实际最大天数
。。
//指定日期的1年有多少天
System.out.println(“一个年中的总计有” + ca.getActualMaximum(Calendar.DAY_OF_YEAR));
//设置日历
Calendar ca1 = Calendar.getInstance(); //如果不set则是当前时间
ca1.set(2021,4,26,15,00,00);
//获取指定日历距离1970年1月1号8点之间相隔的毫秒数
long time1 = ca1.getTimeInMillis();
System.out.println(“相隔的毫米数为:” + time1);
很长时间2 = ca.getTimeInMillis();
System.out.println(“现在相隔的毫秒数为:” + time2);
日历类与日期类的相互转化
//将日历转成日期
Date date1 = ca1.getTime();
System.out.println(date1.toLocaleString());
//将日期转日历
Date date2 = new Date();
ca1.setTime(date2);
System.out.println(ca1.get(Calendar.YEAR));
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
Date date = calendar.getTime();
System.out.println(date);
}
这是直接从Calendar抽象类中得到时间。
应用案列1:打印日历
public class RiLi {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入年份:");
int year=sc.nextInt();
System.out.println("请输入月份:");
int month=sc.nextInt();// 5
Calendar calendar = Calendar.getInstance();
ca.set(year,month-1,day);
//指定日期是星期几。。
int weekDay =calendar.get(Calendar.DAY_OF_WEEK)-1;
//当月的最大天数
int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
System.out.println("日\t一\t二\t三\t四\t五\t六");
//打印\t专用,第一行
for (int i = 1; i <= weekDay ; i++) {
System.out.print("\t");
}
for (int i = 1; i <= maxDay; i++) {
if(weekDay%7==6){
System.out.print(i+"\n");
}else{
System.out.print(i+"\t");
}
weekDay++;
}
sc.close();
}
}
应用案例2:计时器的实现
public class DaoJiShi {
public static void main(String[] args) throws InterruptedException {
//未来时间
while (true){
Calendar ca = Calendar.getInstance();
//当前时间
ca.set(2020,10-1,1,0,0,0);
Calendar ca2 = Calendar.getInstance();
long time1 = ca.getTimeInMillis();
long time2 =ca2.getTimeInMillis();
long seconds = (time1-time2)/1000;
long minutes = seconds/60;
long hour = minutes/60;
long day = hour/24;
Thread.sleep(1000);
System.out.println(day+"\t"+hour%24+"\t"+minutes%60+"\t"+seconds%60);
}
}
}