内部类
概念
如果一个类存在的意义就是为指定的另一个类,可以把这个类放入另一个类的内部。就是把类定义在类的内部的情况就可以形成内部类的形式。
A类中又定义了B类,B类就是内部类。B类可以当做A类的一个成员看待。
基本格式:
class A {//外部类
class B{//内部类
}
}
特点:
1、 内部类可以直接访问外部类中的成员,包括私有成员
2、 外部类要访问内部类的成员,必须要建立内部类的对象
3、 在成员位置的内部类是成员内部类
4、 在局部位置的内部类是局部内部类
入门案例
package cn.tedu.reflection;
//这个类用来测试 内部类
public class Test4_InnerClass {
public static void main(String[] args) {
//1、创建内部类对象 --- 外部类名.内部类名 变量 = 外部类对象.内部类对象
Outer.Inner oi = new Outer().new Inner();
//2、调用内部类的资源
// oi.showIn();
// System.out.println( oi.age );
new Outer().showOut();//触发外部类方法showOut()
}
}
class Outer{//外部类
private String name = "皮皮霞" ;
public void showOut(){
//在外部类类 调用 内部类 资源 --- 不可以直接用!!创建内部类对象来调用!!
new Inner().showIn();
System.out.println( new Inner().age );
System.out.println("showOut()...");
}
class Inner{//内部类
int age = 20 ;
public void showIn(){
//在内部类里 可以使用 外部类的资源吗 -- 可以!!
// showOut();
// System.out.println("name = " + name);
System.out.println("showIn()...");
}
}
}
成员内部类
成员内部类被private和static修饰
public class Test1_Inner {
public static void main(String[] args) {
//创建内部类对象,使用内部类资源
//Outer.Inner oi = new Outer().new Inner() ;
//2、因为内部类被Private,无法直接new
// oi.showIn();
//4、触发showOut()
new Outer().showOut();
//6、使用静态的内部类Inner2的资源 -- 可以直接通过外部类名.内部类名来定位内部类
Outer.Inner2 oi = new Outer.Inner2() ;
oi.showIn2();
//7、访问静态内部类里 静态方法
Outer.Inner2.showIn2();
}
}
class Outer{//外部类
String name ;
public void showOut(){
//3、间接访问showIn()
new Inner().showIn();
System.out.println("showOut()...");
}
//5、内部类被static修饰
static class Inner2{
int count = 10 ;
static public void showIn2(){
System.out.println("showIn2()...");
}
}
//1、在成员位置的内部类,叫成员内部类。可以被private修饰,也可以被static修饰
private class Inner{//内部类
int age ;
public void showIn(){
System.out.println("showIn()...");
}
}
}
匿名内部类
匿名内部类属于局部内部类,并且是没有名字的内部类.
1 普通类的匿名内部类
class A{
public void show(){
System.out.println("show()");
}
}
public static void main(String[] args){
new A(){
@Override
public void show(){
System.out.println("show()的重写");
}
}.show();//调用指定的方法
}
2 接口的匿名内部类
interface Inter{
void save() ;
void get() ;
}
public static void main(String[] args) {
//new Inter(),相当于创建了一个接口的实现类的对象,只不过是匿名对象。只能执行一个任务!!
new Inter(){//匿名内部类
@Override
public void save() {
System.out.println("save()...");
}
@Override
public void get() {
System.out.println("get()...");
}
}.save();//调用指定方法
}
如果想要调用多个方法,可以给匿名对象起一个名字,就可以执行多个任务
Inter in = new Inter(){//匿名内部类 ,给匿名对象起个名字,就可以执行多个任务了!!
@Override
public void save() {
System.out.println("save()...");
}
@Override
public void get() {
System.out.println("get()...");
}
};
in.save();
in.get();
若想通过匿名内部类访问多个方法,且不给匿名对象起名,可以按照以下方法
public static void main(String[] args) {
new Inter(){
@Override
public Inter save() {
System.out.println("save()");
return this;
}
@Override
public Inter get() {
System.out.println("get()");
return this;
}
}.get().save();
}
interface Inter{
Inter save();
Inter get();
}
3 抽象类的匿名内部类
abstract class Demo{
public abstract void update() ;
public void show(){ System.out.println("show()..."); }
}
public static void main(String[] args) {
new Demo(){//就相当于创建了抽象类的对象
@Override
public void update() {
System.out.println("update()...");
}
}.update();//调用指定方法
}