1.什么是内部类?
内部类是一个定义在另一个类中的类
public class Person{
class student{//内部类
}
}
class stu{//不是内部类,只是在同一个java文件中
}
2.内部类的好处
可以把数据隐藏起来,从而增强面向对象的封装性
3.内部类的分类
非静态成员内部类,局部内部类,匿名内部类,静态成员内部类
4.非静态成员内部类
<1>非静态成员内部类可以访问的范围
非静态成员内部类可以访问的作用域中所有数据,方法,包括私有方法(可以当成非静态成员方法去理解)
<2>不能定义静态属性的成员变量和方法
<3>非静态成员内部类不能在该类类定义的作用域静态方法中直接使用,像下面这样
private String[] sex={"男","女"};
//非静态成员内部类,不在方法中定义的类
class Student{//内部
}
/*****非静态成员内部类不能直接使用在该类作用域的静态方法中***********/
public static void eat(){
Student xingming = new Stuent();
}
/**************/
不过可以这样间接使用
public static void eat() {
Person p = new Person( );
p.sleep();
XiaoMing xiaoming = p.new XiaoMing();
)
<4>访问非静态成员内部类方法:
内部类名 变量 = new 外部类名().new 内部类名()---------通过这个可以更深刻的理解内部类的优势
<5>非静态成员内部类可以实现多继承
public class XiaoHua {
class HuaJiaA extends HuaJia{
}
class ZuoJiaA extends ZuoJia{
}
public void hua(){
HuaJiaA huajiaA = new HuaJiaA();
huajiaA.hua();
}
public void xie(){
ZuoJiaA zuojiaA = new ZuoJiaA();
zuojiaA.xie();
}
}
class HuaJia{
public void hua(){
Syetem.out.println("画画")
}
}
class ZuoJia{
public void xie(){
Syetem.out.println("写作")
}
5.局部内部类
<1>什么局部内部类
局部内部类定义在代码块方法体中
public class Person {
private static String Contry;
private String[] sex= {"男","女"};
public void sleep() {
//局部内部类
class People {
private String name = "xiaoming";
public void print() {
System.out.println("hello");
}
}
People p = new People();
p.print();
public void eat () {
}
}
<2>局部内部类不能使用public private protect static等访问权修饰符来修饰(只有全局变量才能使用访问权修饰符修饰)
<3>局部内部类,作用域仅限于当前方法
<4>局部内部类和非静态成员内部类一样,不能有静态成员
<5>局部内部类访问的局部变量必须使用final修饰,Java8之后自动加上
public class Person {
private static String Contry;
private String[] sex= {"男","女"};
public void sleep() {
final int a = 10;
//局部内部类
class People {
private String name = "xiaoming";
public void print() {
System.out.println(a);
}
}
People p = new People();
p.print();
public void eat () {
}
}
6.匿名内部类
<1>匿名内部类.是局部内部类的一种,是没有名字的局部内部类
public static void main(String[] args){
Person p = new Person{//Person可以是也可以不是抽象类
public void sleep(){
System.out.println("学生在睡觉")
}
};
}
这样写可以少写一个类
<2>匿名内部类使用前提
必须继承一个父类或者实现一个和接口
7.静态成员内部类
如果一个子类只想把了另一个类隐藏起来,而不不想引用外部类对象怎么办,于是出现了静态成员内部类
<1>使用方法
外部类名.内部类名 变量名 = new 外部类名.内部类名()