内部类
概述
内部类,即为在一个类中定义的类
语法格式
class A{
classB{
B即为内部类
}
}
特点
内部类可以直接访问外部类中的成员,包括私有成员
外部类要访问内部类的成员,必须要建立内部类的对象
在成员位置的内部类是成员内部类
在局部位置的内部类是局部内部类
内部类代码示例
package cn.tedu.innerclass;
/**
* 内部类案例
*/
public class TestInner1 {
public static void main(String[] args) {
Outer.Inner oi = new Outer().new Inner();
oi.delete();
System.out.println(oi.sum);
//直接创建外部类匿名对象调用外部类方法
new Outer().find();
}
}
class Outer{
String name;
private int age;
public void find(){
System.out.println("马钊要起飞了!");
/*
System.out.println(sum);
delete();
内部类无法直接使用外部类的资源
需要创建内部类对象后才可使用
*/
Inner in = new Inner();
System.out.println(in.sum);
in.delete();
}
class Inner{
int sum = 100;
public void delete(){
System.out.println("马钊起飞成功");
System.out.println(name);
System.out.println(age);
//只能单向调用,不能循环调用,会导致栈溢出异常
//find();
}
}
}
私有内部类
成员内部类被Private修饰以后,无法被外界直接创建创建对象使用
所以可以创建外部类对象,通过外部类对象间接访问内部类的资源
package cn.tedu.innerclass;
/**
* 测试成员内部类被private修饰
*/
public class TestInner2 {
public static void main(String[] args) {
/*
Outer2.Inner2 oi = new Outer2().new Inner2();
oi.eat();
报错
*/
Outer2 o2 = new Outer2();
o2.getInner2Eat();
}
}
class Outer2{
/*
成员内部类
位置:类里方法外
*/
private class Inner2{
public void eat(){
System.out.println("明天,马钊,吃的,起飞!");
}
}
public void getInner2Eat(){
Inner2 in = new Inner2();
in.eat();
}
}
静态内部类
静态资源访问时不需要创建对象,可以通过类名直接访问
访问静态类中的静态资源可以通过”. . . ”链式加载的方式访问
package cn.tedu.innerclass;
/**
* 测试静态内部类
*/
public class TestInner3 {
public static void main(String[] args) {
/*
Outer3.Inner3 oi = new Outer3().new Inner3();
oi.watermelon();
new Outer3().new Inner3().watermelon();
内部类被static修饰后,报错
*/
Outer3.Inner3 oi = new Outer3.Inner3();//静态内部类普通对象
oi.watermelon();
new Outer3.Inner3().watermelon();//静态内部类匿名对象
//访问静态内部类的静态资源---链式加载
Outer3.Inner3.eat();
}
}
class Outer3{
static class Inner3{
public void watermelon(){
System.out.println("吃瓜大赛");
}
public static void eat(){
System.out.println("吃瓜吃到吐");
}
}
}
局部内部类
调用局部内部类功能 在外部类中创建局部类的对象并且调用其功能
package cn.tedu.innerclass;
/**
* 测试局部内部类
*/
public class TestInner4 {
public static void main(String[] args) {
Outer4 o = new Outer4();
o.show();
}
}
class Outer4{
public void show(){
System.out.println("Other4-----show()");
//局部内部类--方法里
class Inner4{
String name;
int age;
public void eat(){
System.out.println("show-----eat()");
}
}
/*
在外部类中创建局部类的对象并且调用其功能
*/
Inner4 in = new Inner4();
in.eat();
System.out.println(in.age);
System.out.println(in.name);
}
}
匿名内部类
匿名内部类属于局部内部类,而且是没有名字的局部内部类,通常和匿名对象一起使用
package cn.tedu.innerclass;
/**
* 匿名内部类
*/
public class TestInner5 {
public static void main(String[] args) {
/*
创建接口实现类的对象才能调用方法===创建接口实现类+重写接口中的抽象方法+调用方法
匿名内部类没有名字,通常与匿名对象结合使用,用于调用一次&一个方法
*/
new Inner1() {
@Override
public void save() {
System.out.println("保存");
}
@Override
public void get() {
System.out.println("获取");
}
}.save();
new Inner11() {
@Override
public void play() {
System.out.println("大赛");
}
}.play();
new Inner3().get();
}
}
interface Inner1{
void save();
void get();
class Inner4{
}
}
abstract class Inner11{
public void eat(){
System.out.println("吃瓜");
}
abstract public void play();
}
class Inner3{
public void eat(){
System.out.println("吃土");
}
public void get(){
System.out.println("获取");
}
}