内部类的定义、分类、声明,注解,Java的文档注释,修饰符的部分总结(十四)

844 阅读11分钟

内部类

1.什么是内部类?

​ 将一个类A定义在另一个类B里面,里面那个类A就称为内部类,类B称为外部类

2.内部类的形式

(1)成员内部类在外部类中,在外部类的方法和代码块外

①静态成员内部类
Ⅰ 格式
【修饰符】 class 外部类{
	【其他修饰符】 static class 静态内部类{

	}
}
Ⅱ 静态内部类
  • 静态内部类也是类,每一个类(无论内部类还是外部类,无论有没有名字)都有自己独立的.class字节码文件,静态内部类的字节码文件:

    静态内部类的字节码文件: 外部类名$静态内部类名.class

    非静态内部类的字节码文件: 外部类名$非静态内部类名.class

    匿名内部类的字节码文件: 外部类名$编号.class

    局部内部类的字节码文件: 外部类名$编号局部内部类名.class

  • 静态内部类也可以继承自己的父类,实现自己的接口们

  • 静态内部类可以有自己的成员,成员变量,成员方法,构造器,代码块,内部类,理论上内部类中还可以有内部类,但是不会写这么复杂。

  • 静态内部类也是外部类的成员,修饰符:static,public,protected,缺省,private.注意:外部类的修饰符不能有static,不能有protected和private

Ⅲ 在其他类中如何使用静态内部类

(1)作为类型声明变量

外部类名.静态内部类名  变量名;

(2)调用静态内部类的静态方法,静态变量

  外部类名.静态内部类名.静态方法
    外部类名.静态内部类名.静态变量

(3)调用静态内部类的非静态方法,实例变量

​ A:需要创建Inner的对象

 外部类名.静态内部类 变量 = new 外部类名.静态内部类();

​ B:通过对象.非静态方法

Ⅳ 在外部类中使用静态内部类

和使用其他类没有什么区别

②非静态成员内部类
Ⅰ 格式
【修饰符】 class 外部类{
	【其他修饰符】static class 静态内部类{

	}
}
Ⅱ 非静态内部类的特点
  • 静态内部类也是类,每一个类(无论内部类还是外部类,无论有没有名字)都有自己独立的.class字节码文件,

    ​ 静态内部类的字节码文件: 外部类名$静态内部类名.class

    ​ 非静态内部类的字节码文件: 外部类名$非静态内部类名.class

    ​ 匿名内部类的字节码文件: 外部类名$编号.class

    ​ 局部内部类的字节码文件: 外部类名$编号局部内部类名.class

  • 非静态内部类是外部类的成员,修饰符:public,protected,缺省,private. 注意:外部类的修饰符,不能有protected,private

Ⅲ 在其他类中如何使用非静态内部类
  • 作为类型声明变量

    外部类名.非静态内部类名  变量名;
    
  • 调用非静态内部类的非静态方法,实例变量

    A:需要创建外部类Outer的对象

     外部类名 out = new 外部类名();
        Outer out = new Outer();
    

    B:需要创建Inner的对象

        外部类名.非静态内部类 变量 = 外部类对象.new 非静态内部类();
    

    C:通过非静态内部类的对象.非静态方法

Ⅳ 在外部类中如何使用非静态内部类

和使用其他类没有什么区别

Ⅴ 特殊

非静态内部类是作为外部类的成员

外部类和非静态内部类可以互访对方的私有成员。没有限制。

(2)局部内部类:在外部类的方法体或代码块中

①有名字的局部内部类(很少用)
Ⅰ 格式
【修饰符】 class 外部类{
	【修饰符】 返回值类型 方法名(【参数列表】){
		【修饰符】 class 内部类{
				
		}
	}
}
Ⅱ 有名的局部内部类的特点
  • 静态内部类也是类,每一个类(无论内部类还是外部类,无论有没有名字)都有自己独立的.class字节码文件。

    ​ 静态内部类的字节码文件: 外部类名$静态内部类名.class

    ​ 非静态内部类的字节码文件: 外部类名$非静态内部类名.class

    ​ 匿名内部类的字节码文件: 外部类名$编号.class

    ​ 局部内部类的字节码文件: 外部类名$编号局部内部类名.class

Ⅲ 在其他类中如何使用局部内部类

不能使用

Ⅳ 在外部类中如何使用局部内部类

有作用域,只能在作用域范围内使用

Ⅴ 特殊
②匿名的内部类

这个内部类没有名字

​ 这个类是一次性的,在声明类的同时就要创建对象,否则后面就没法创建对象

Ⅰ 这个类的声明形式特殊,声明格式如下:
new 父类名(){//调用父类的无参构造
	内部类的成员;
}
或者
new 父类名(实参列表){//调用父类的有参构造
	内部类的成员;
}
或者
new 父接口(){//调用父类的无参构造,父类是Object。
	内部类的成员;
}

解释:

(1)为什么有new

​ 这个类是一次性的,在声明类的同时就要创建对象,否则后面就没法创建对象

(2)为什么new后面是父类名或父接口名?

​ 因为匿名内部类声明没有之前“class 子类名 extends 父类 implements 父接口”这个过程,就导致没办法指定它的父类或者父接口,所以必须在new的时候顺便指定一下它的父类或父接口。

(3)为什么new 父类名()的() 是空参,new 父类名(实参列表)的()中有实参。new父接口的()是空参?

​ 因为我们此时子类匿名,没有名字,所以没法手动编写匿名内部类的构造器,但是我们在继承时,必须在子类构造器中调用父类的构造器。

(4)匿名内部类,要么只指定直接父类是谁,要么只指定它的父接口是谁,只能指定一个接口。

(5)在后面有{},它是匿名内部类的类体,哪怕你没有声明匿名内部类的成员,也不能省略{}。

(6)如果要给匿名内部类的对象取名字的话,匿名内部类的对象只能通过父类的变量或者父接口的变量进行多态引用。

Ⅱ 匿名内部类的特点

​ 每一个类(无论是内部类还是外部类,无论有没有名字)都有自己独立的.class字节码文件

​ 静态内部类的字节码文件: 外部类名$静态内部类名.class

​ 非静态内部类的字节码文件: 外部类名$非静态内部类名.class

​ 匿名内部类的字节码文件: 外部类名$编号.class

​ 局部内部类的字节码文件: 外部类名$编号局部内部类名.class

注解

1.什么是注解

​ 注解又称为代码级别注释(换句话说,用代码注释代码)。注解是给另一段代码读取(看)用的。但是它和之前我们讲的 单行注释和多行注释不同,单行注释和多行注释是给程序员看的。之所以把注解称为注释,是因为注解本身不会改变代码的逻辑的,它只是给代码加一些额外的辅助的信息,帮助程序或者信息。

2、一个完整的注解有三个部分组成:

(1)注解的声明

(2)注解的使用

(3)注解的读取

没有(3)的配合,这个注解就没有实际意义。

3、了解几个系统注解

(1)@Override

A:这个注解的声明,java.lang包

B:注解的使用,在重写的方法上面

C:注解的读取,这个注解是由javac.exe编译程序看的。

javac.exe在编译时如果看到某个方法上面标记了 @Override,它会对这个方法进行格式检查。

重写方法的要求:方法名相同,形参列表相同

​ 返回值类型是基本数据类型和void,必须相同

​ 引用数据类型,必须<=被重写方法的返回值类型

​ 权限修饰符:必须>=,而且被重写方法不能是private,跨包不能是缺省

​ 其他修饰符:被重写方法不能是static ,final

(2)@Deprecated:标记某个方法,类等已过时,不建议程序员继续使用,一般这种方法或类都因为设计的有问题,由其他方法或类代替了。

​ 例如:java.util.Date(日期)

为什么不删掉这段呢?

A:这个注解的声明,java.lang包

B:注解的使用,在不用的方法、类、包上面都可以加

C:注解的读取,这个注解是由javac.exe编译程序看的。

编译器读取到你用了标记的方法等时,给你提示(加删除线或者警告等提示)

(3)@SuppressWarnings:用于抑制警告

A:这个注解的声明,java.lang包

B:注解的使用,在需要抑制警告的地方

C:注解的读取,这个注解是由javac.exe编译程序看的。编译器读取到之后,就不弹对应的警告了

 @SuppressWarnings("all"):抑制所有警告

Java文档注释

1、文档注释的格式

/**
 * 当前类的描述,包括作者
 * @author Irene
 * @version 1.8
 * @since 1.5
   */

2、在方法上面标记的文档注释

@param:描述形参

​ 格式:@param 形参名 形参的类型 形参的介绍

​ 一个方法可能有多个,也可能一个都没有,如果没有形参,就不要写@param

@return:描述返回值

​ 格式:@return 返回值类型 介绍说明

​ 一个方法最多只能有一个返回值,如果返回值类型是void,就不要写

@throws:描述可能抛出的异常

​ 格式:@throws 异常类型 介绍说明

​ 一个方法可能有多个异常类型,有几个写几个,没有就不要写。

3、如何导出文档注释

需要用到javadoc.exe

javadoc.exe默认选择的编码是操作系统的默认编码,中文操作系统默认编码是GBK。 当前项目的编码是UTF-8。

JUnit使用方法

1、引入jar

两种方式:

(1)从marven仓库直接下载,默认下载到C盘的用户目录下,一个.m2的文件夹中。

(2)没网的情况下

​ A:把junit4的两个jar包,放到项目的路径下,例如:libs目录中

​ B:在Project structure项目设置中,找到libraries,点击+,选择libs目录,选择哪个模块要用到junit

2、在代码中使用@Test

@Test也是一个注解,用它标记的方法,可以作为一个单元测试方法直接运行。

标记@Test的类有要求: A:要求该类必须是public的

B:要求这个类必须有且只有一个无参构造

C:要求标记@Test的方法必须是public

D:要求标记@Test的方法不能是static

E:要求标记@Test的方法必须是void

F:要求标记@Test的方法必须是无参

3、在IDEA中默认在@Test标记的方法中,不支持键盘输入

需要进行设置。 Help菜单-->Edit Custom VM options...-->Deditable.java.test.console=true

总结--static关键字

1 含义

静态的

2 static是用来做什么的?

他是修饰符

3 可以用来修饰什么?用它修饰有什么不同?

  • 修饰方法:静态方法时:

(1)可以用”类名.“进行调用

(2)也可以用”对象名.“进行调用(不推荐)

(3)父类的静态方法可以被子类继承,但不能被重写

(4)父接口的静态方法不能被实现类继承,只能通过”接口名.“调用

(5)在静态方法中不允许出现this,super等关键字

(6)在静态方法中也不能直接访问非静态成员

  • 修饰代码块:静态代码块时:

(1)在类加载和初始化时执行

(2)每个类只执行一次

(3)在类第一次初始化时执行

  • 修饰成员内部类:静态成员内部类

(1)不需要外部类实例对象就可以使用

(2)在静态内部类中只能使用外部类的静态成员

  • 修饰变量:类变量、静态变量

(1)“类名.”可以调用

总结-修饰符

1 权限修饰符:public,protected,缺省,private

2.静态修饰符:static

3 最终修饰符:final

4 抽象修饰符:abstract

5 本地修饰符:native

6 哪些能同时使用?

  1. public/protected/缺省/private,static:修饰成员变量,成员方法,成员内部类。
  2. public/protected/缺省/private,static,final:修饰成员变量,成员方法,成员内部类
  3. public/protected/缺省/private,final:修饰成员变量,成员方法,成员内部类
  4. public/缺省 final:修饰外部类
  5. public/protected/缺省,abstract:成员内部类,成员方法。
  6. public/protected/缺省/private,native:成员方法

6 哪些不能重复使用?

  1. static和abstract不能一起修饰方法
  2. final和abstract不能一起修饰类和方法
  3. native和abstract不能一起修饰方法
  4. private和abstract不能一起修饰方法