JAVA内部类

内部类是一个定义在另一个类中的类。那为什么要使用内部类呢?其主要原因有以下三点
1.内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据
2.内部类可以对统一包中的其他数据隐藏起来,增强面向对象的封装性
3.当想定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷
内部类代码示例:
public class Person {
//人在出生的时候选择性别
private String[] sex = {“男性”,“女性”};
class Xiaoming{
private String xiaoming_sex;

	private String  showSex() {
		// TODO Auto-generated method stub
		xiaoming_sex = sex[1];
		return xiaoming_sex;
	}
}

//在外部类当中定义一个方法展示小明的性别
private void show_XiaoMing_sex() {
	// TODO Auto-generated method stub
	Xiaoming xiaoming = new Xiaoming();
	System.out.println(xiaoming.showSex());
}

public static void main(String[] args) {
	Person person = new Person();
	person.show_XiaoMing_sex();
}

}

为了能够运行程序,内部类的对象总有一个隐式引用,他指向了创建他的外部类对象
在这里插入图片描述

                              内部类对象拥有一个对外围外部类对象的引用

请注意一下,outer不是java关键字,我们只是用它说明内部类中的机制

重点:借助于内部类可以实现类似于多继承的作用
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(){
System.out.println(“画画”);
}
}

class Zuojia{
public void xie(){
System.out.println(“写作”);
}
}

class Testxiaohua{
public static void main(String[] args) {
Xiaohua xiaohua = new Xiaohua();
xiaohua.hua();
xiaohua.xie();
}
}

内部类的几种表现形式
一、非静态成员式内部类
定义:成员式内部类如同外部类的一个普通方法
成员式内部类有以下特性:
1.持有父类引用,故可以访问父类任何访问权限的变量、方法
2.非静态内部类中不能声明static成员

上边的代码就是成员式内部类
如何访问非静态成员式内部类:
外部类名.内部类名 变量名 = new 外部类名().new 内部类名();
Person.Xiaoming xiaoming = new Person().new Xiaoming();
二、局部内部类(不常用)
1.什么是局部内部类
定义:局部内部类就是定义在代码块、方法体内、作用域({})内的类。

public class Person {
//人在出生的时候选择性别
private static String[] sex = {“男性”,“女性”};

public void print() {
     
	class People {
		private String name = "xiaoming";
		public void print() {
   
			System.out.println("hello world"+sex[0]+name);
		}
	}
	People people = new People();
	people.print();
}

}

测试:
public class Test {
public static void main(String[] args) {

	Person person = new Person();
	person.print();
}

}

局部内部类有以下特性:
1.不能使用public、private、protected、static等这些修饰符
2.局部内部类只能在当前方方法中使用,作用域范围仅限于当前方法中
3.局部内部类和成员内部类一样,不能拥有静态成员,但可以访问外部成员的所有变量
4.局部内部类访问的局部变量必须使用final修饰,在jdk8中自动隐式的加上了final
为什么不推荐使用局部内部类?
如果当前方法不是main方法,那么当前方法调用完毕之后,当前方法的栈帧就会被销毁,方法内部的局部变量的空间也会被销毁。

三、匿名内部类
定义:匿名内部类是局部内部类的一种特殊形式,是一个没有名称的内部类。
注意:匿名内部类必须继承一个父类或者实现一个接口
1.匿名内部类的由来
首先新建一个抽象类
public abstract class Person {
abstract void sleep();
}
继承这个抽象类并实现它的方法
public class Student extends Person{

private void sleep() {
	// TODO Auto-generated method stub
	System.out.println("学生在吃");
}

}

最后调用
public class Demo3 {
public static void main(String[] args) {
Person person = new Student();
person.sleep();
}
}

可以看到我们在这里使用了多态的思想,将student类向上转型到person类当中,这里我们只是用了一次student类,那我们有没有什么办法跳过这个student类来实现person当中的方法呢?
我们进行相关的改动后:
public class Demo3 {
public static void main(String[] args) {
new Person() {
void sleep() {
System.out.println(“学生正在睡觉。。。。”);
};
}.sleep();
}
}

可以看到继承了person类,并在{}中实现了响应的抽象方法。

四、静态内部类
定义:有时候,使用内部类只是为了把一个类隐藏在另一个类的内部,并不需要内部类引用外围类对象。为此,我们可以将内部类声明为static,以便取消产生的引用。
特点:
1.静态内部类在创建内部类实例的时候不必创建外部类实例。
OuterClass.InnerClass in = new OuterClass.InnerClass();
非静态内部类创建内部类示例
OuterClass.InnerClass in = new OuterClass().new InnerClass();
2.静态内部类可以直接访问外部类的静态成员
3.在静态内部类中可以定义静态和非静态的成员
4.外部类可以通过完整的类名直接访问静态内部类的静态成员。

public class OuterClass {
String name = “Outer.name”;
static String name2 = “Outer.name2”;
static class InnerClass{
static String name3 = “Inter.name3”
private void printNmae() {
// TODO Auto-generated method stub
System.out.println(name2);
System.out.println(new OuterClass().name);
}
}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值