Java基础知识回顾复习(内部类,包和权限修饰符,Date类)
1.1 概述
1.1.1 什么是内部类
将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,B则称为外部类。可以把内部类理解成寄生,外部类理解成宿主。
1.1.2 什么时候使用内部类
一个事物内部还有一个独立的事物,内部的事物脱离外部的事物无法独立使用
-
人里面有一颗心脏。
-
汽车内部有一个发动机。
-
为了实现更好的封装性。
1.2 内部类的分类
按定义的位置来分
- 静态内部类:类定义在了成员位置(类中方法外称为成员位置,有static修饰的内部类)
- 实例内部类:类定义在了成员位置(类中方法外称为成员位置,无static修饰的内部类)
- 局部内部类:类定义在方法内
- 匿名内部类:一般定义在方法中,或者可执行代码中
1.2.1 静态内部类
静态内部类特点:
- 有static修饰的内部类,属于外部类本身的。
- 总结:静态内部类与其他类的用法完全一样。只是访问的时候需要加上外部类.内部类。
- 拓展:静态内部类可以直接访问外部类的静态成员。
内部类的是使用格式:
外部类.内部类。
静态内部类对象的创建格式:
外部类.内部类 变量 = new 外部类.内部类构造器;
案例演示:
// 外部类:Outer01class Outer01{ private static String sc_name = "黑马程序"; // 内部类: Inner01 public static class Inner01{ // 这里面的东西与类是完全一样的。 private String name; public Inner01(String name) { this.name = name; } public void showName(){ System.out.println(this.name); // 拓展:静态内部类可以直接访问外部类的静态成员。 System.out.println(sc_name); } }}public class InnerClassDemo01 { public static void main(String[] args) { // 创建静态内部类对象。 // 外部类.内部类 变量 = new 外部类.内部类构造器; Outer01.Inner01 in = new Outer01.Inner01("张三"); in.showName(); }}
1.2.2 实例内部类
实例内部类特点:
-
无static修饰的内部类,属于外部类对象的。
-
宿主:外部类对象。
内部类的使用格式:
外部类.内部类 变量 = new 外部类构造器.new 内部类构造器;
-
拓展1:实例内部类不能定义静态成员。
-
拓展2:实例内部类可以直接访问外部类的私有和静态成员。
案例演示
public class InnerClassDemo02 { public static void main(String[] args) { // 宿主:外部类对象。// Outer02 out = new Outer02(); // 创建内部类对象。 Outer02.Inner02 in = new Outer02().new Inner02("张三"); in.showName(); }}class Outer02{ // 实例内部类,属于外部类对象的。 // 拓展:实例内部类不能定义静态成员。 public class Inner02{ // 这里面的东西与类是完全一样的。 private String name; public Inner02(String name) { this.name = name; } public void showName(){ System.out.println(this.name); } }}
1.2.3 局部内部类
局部内部类:定义在方法中的类
定义格式:
class 外部类名 {数据类型 变量名;修饰符 返回值类型 方法名(参数列表) {// …class 内部类 {// 成员变量// 成员方法}}}
1.2.4 匿名内部类【重点】
概述:
匿名内部类:是内部类的简化写法。它的本质是一个带具体实现的父类或者接口的匿名的子类对象开发中,最常用到的内部类就是匿名内部类了
引入:
实际上,如果我们希望定义一个只要使用一次的类,就可以考虑使用匿名内部类。匿名内部类的本质作用是为了简化代码。
匿名内部类的格式
new 父类名或者接口名(){ // 方法重写 @Override public void method() { // 执行语句 }};
使用方式
以接口为例,匿名内部类的使用
interface Swim { public abstract void swimming();}public class Demo07 { public static void main(String[] args) { // 使用匿名内部类new Swim() {@Overridepublic void swimming() {System.out.println("自由泳...");}}.swimming(); // 接口 变量 = new 实现类(); // 多态,走子类的重写方法 Swim s2 = new Swim() { @Override public void swimming() { System.out.println("蛙泳..."); } }; s2.swimming(); s2.swimming(); }}
匿名内部类的特点
-
定义一个没有名字的内部类
-
这个类实现了父类,或者父类接口
-
匿名内部类会创建这个没有名字的类的对象
2.1 包和权限修饰符
2.1.1包名的命名规范:
路径名.路径名.xxx.xxx// 例如:com.yhb.xxx
-
包名一般是公司域名的倒写。例如:百度是www.baidu.com,包名就可以定义成com.baidu.技术名称。
-
包名必须用”.“连接。
-
包名的每个路径名必须是一个合法的标识符,而且不能是Java的关键字。
2.1.2 权限修饰符:
-
public:公共的,所有地方都可以访问。
-
protected:当前类 ,当前包,当前类的子类可以访问。
-
缺省(没有修饰符):当前类 ,当前包可以访问。
-
private:私有的,当前类可以访问。
public > protected > 缺省 > private
不同权限的访问能力
pulbic | protected | 缺省(空的) | private | |
同一类中 | √ | √ | √ | √ |
同一包中的类 | √ | √ | √ | |
不同包的子类 | √ | √ | ||
不同包中的无关类 | √ |
-
成员变量使用
private
,隐藏细节。 -
构造方法使用
public
,方便创建对象。 -
成员方法使用
public
,方便调用方法。
3.1 Date类
Date常用的方法:
-
public long getTime()
把日期对象转换成对应的时间毫秒值。 -
public void setTime(long time)
把方法参数给定的毫秒值设置给日期对象
示例代码:
public class DateDemo02 { public static void main(String[] args) { //创建日期对象 Date d = new Date(); //public long getTime():获取的是日期对象从1970年1月1日 00:00:00到现在的毫秒值 //System.out.println(d.getTime()); //System.out.println(d.getTime() * 1.0 / 1000 / 60 / 60 / 24 / 365 + "年"); //public void setTime(long time):设置时间,给的是毫秒值 //long time = 1000*60*60; long time = System.currentTimeMillis(); d.setTime(time); System.out.println(d); }}