java-内部类
概念:定义在另一个类中的类
所在位置:
package com.innerclass;
public class Person {
private String[] sex={"男性","女性"};
class XiaoMing{
}
}
1、内部类意义
- 内部类中的方法可以访问方法内部类所在的外部类中的数据,包括私有数据
- 内部类可以对统一的数据隐藏起来,增强面向对象的封装性
- 当想定义一个函数不想编写大量代码时,使用匿名内部类更加便捷
- 借助内部类可以实现类的多继承
2、内部类作用
本身java不支持多继承,可以利用内部类实现:模拟实现多继承
一个类只能继承一个类,但是可以利用多个内部类,每个内部类继承一个类,可以模拟实现多继承的方法。
代码示例:
package com.innerclass;
import java.util.jar.JarEntry;
public class XiaoHua {
class HuajiaA extends XiaoHua{
public void xie(){
System.out.println("画画");
}
}
class ZuoJiaA extends XiaoHua{
public void hua(){
System.out.println("写写");
}
}
public void hua(){
HuajiaA huajiaA=new HuajiaA();
huajiaA.xie();
}
public void xie(){
ZuoJiaA zuoJiaA=new ZuoJiaA();
zuoJiaA.hua();
}
public static void main(String[] args) {
XiaoHua xiao=new XiaoHua();
xiao.hua();
xiao.xie();
}
}
//输出
//画画
//写写
3、内部类的类型
- 非静态内部类:非静态内部类如同外部类的一个对象方法(对象方法不能使用static)
- 持有隐士的父类引用,指向外部类对象的,故可以访问外部类任意访问权限的变量和方法
- 非静态内部类不能使用static
- 外部类.内部类 变量=new 外部类().new 内部类();
例如:
Person.XiaoMing a=new Person().new XiaoMing();
class Outer{
private int age = 10;//外部类 Outer.this.age
public void testOuter(){
System.out.println("Outer.testOuter()");
}
class Inter{
int age = 20;//内部类 this.age
public void show(){
int age = 30;//局部变量 age
System.out.println("外部类的成员变量age = "+Outer.this.age); //输出外部类
System.out.println("内部类的成员变量age = "+this.age); //输出内部类
System.out.println("局部变量age = "+age); //输出局部变量
}
}
}
----------------------------------------------------------------------------
public static void main(String[] args) {
//创建内部类对象
Outer.Inter inter = new Outer().new Inter();//外部类以外的地方使用非静态内部类
//new Inter()外部类中定义内部类
inter.show();//调用show()
}
- 局部内部类(不常用) : 局部内部类就是定义在代码块,方法体内,({})里面定义的类,都是局部内部类
- 不能使用public,private,static这些修饰符
- 局部内部类只能在当前方法中使用
- 局部内部类和非静态内部类一样,不能拥有静态变量,但是可以访问外部类的所有变量
- 局部内部类访问的局部变量必须使用final修饰,java8之后自动隐士的加上final
局部内部类代码示例:
package com.innerclass;
public class Person {
private String[] sex={"男性","女性"};
public void test(){
//没有被实例化之前,没有被new之前,都没有内存空间,不存在
//局部内部类
class People{
private String xiaoming_sex;
String showSex(){
xiaoming_sex=sex[0];
System.out.println(xiaoming_sex);
return xiaoming_sex;
}
}
People p = new People(); //只有当定义出来了之后才能new ,才能实例化
p.showSex();
}
public static void main(String[] args) {
Person p=new Person();
p.test();
}
- 匿名内部类:是局部内部类的一种特殊形式,是一个没有名称的内部类,
作用:省了一个类的定义,可以直接new 中声明出来,节省了代码量
- 匿名内部类使用条件:继承一个父类,或者实现一个接口
public interface Interface01 {
void show();
}
//例:实现一个接口
---------------------------------
public static void main(String[] args) {
Interface01 interface01 = new Interface01() {
@Override
public void show() {
System.out.println("这里使用了匿名内部类");
}
};
//调用接口方法
interface01.show();
}
//匿名内部类
new Person(){
@Override
public void sleep(){
System.out.println("学生睡觉");
}
}.sleep();
- 静态内部类:静态内部类如同外部类的一个类方法:匿名内部类声明: static class InnterClass{}
- 静态内部类不能访问外部类的对象的变量和方法
- 静态内部类在创建内部类示例(对象)时不用创建外部类示例
- 静态内部类可以直接访问外部类的静态变量
- 静态内部类可以定义静态和非静态成员
- 外部类可以通过完整的类型直接访问静态内部类的静态成员
- 静态内部类代码示例:
package com.innerclass;
public class OutClass {
//外部类的变量
public static String name="张三";
static class InnterClass{
static String sex="男";
public void test(){
System.out.println(name);
}
}
public static void main(String[] args) {
InnterClass innterClass=new OutClass.InnterClass();
innterClass.test();
//外部类可以通过完整的类型直接访问静态内部类的静态成员
System.out.println(OutClass.InnterClass.sex); //输出男
}
}