1.内部类分为:实例内部类,静态内部类,局部内部类,匿名内部类
外部类仅能被public或者默认权限修饰
2.实例内部类:
- 此内部类不可被static修饰,因为static属于类,而实例内部类属于对象
- 实例内部类是可以访问外部类的成员,外部类的成员无法访问此内部类的成员
- 在main方法中调用实例内部类时必须先创建外部类对象,在创建内部类对象
3.静态内部类: - 静态内部类因为由static修饰,属于类,所以可以不用创建外部类对象,直接外部类.内部类调用
- 静态内部类可以拥有静态和非静态成员
- 静态内部类可以访问外部类的成员,如何访问?
class test{
static String N = "1";
int a;
static class cat{
static String N = "2";
void name() {
//变量拥有就近访问原则
System.out.println(N);
System.out.println(this.N);//访问此类中的变量N
//对外部类静态成员的访问
System.out.println(test.N);
System.out.println(new test().N);
//对外部类非静态成员的访问
System.out.println(new test().a);
}
}
}
public class insideclass {
public static void main(String[] args) {
test.cat c = new test.cat();
c.name();
}
}
4.局部内部类:定义在方法中的类叫局部内部类
局部内部类中的成员变量默认是用final修饰的
5.匿名内部类:没有名字的局部内部类
- 必须有父类或者接口,并且没有构造器
- new 父类/接口
interface iusb{
void swapdata();
}
class motherboard{
void plugin(iusb i) {
i.swapdata();
}
}
class keyboard implements iusb{
public void swapdata() {
System.out.println("键盘打字");
}
}
class mouse implements iusb{
public void swapdata() {
System.out.println("移动鼠标");
}
}
public class iusbable3{
public static void main(String[] args) {
motherboard a = new motherboard();
//用到了匿名内部类
a.plugin(new iusb() {
public void swapdata() {
System.out.println("鼠标移动");
System.out.println("键盘打字");
}
});
}
}
6.枚举
枚举就是一个特殊的类,多个常量对象的集合
案例最终
package _01;
enum Weekday{
MONDAY,TUESDAY,WENDESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY;
}
class Student{
private Weekday week;
public Weekday getWeek() {
return week;
}
public void setWeek(Weekday week) {
this.week = week;
}
}
public class ENUM {
public static void main(String[] args) {
Student s = new Student();
s.setWeek(Weekday.MONDAY);
Weekday res = s.getWeek();
if(res == Weekday.SATURDAY || res == Weekday.SUNDAY) {
System.out.println("放假");
}else
System.out.println("上学");
}
}