如果一个事物的内部包含另一个事物,那么这就是一个类内部包含另一个类
分类:成员内部类,局部内部类(包含匿名内部类)
public class Hero {//外部类
private String name;
float hp;
float armor;
public Hero(String name){
this.name = name;
}
//外部类方法
public void method(int s){
System.out.println("外部类方法");
new BattleScore().score(s);//使用外部类方法调用内部方法
}
public class BattleScore {//内部类
//内部类方法
public void score(int s){
System.out.println(name + "的成绩是" + s);
}
}
}
/////////////////////////////////////////////////
public class InnerClassMain {
public static void main(String[] args) {
//方法一:通过外部方法间接调用内部方法
Hero garen = new Hero("garen");
garen.method(100);
//方法二:直接调用内部类方法
Hero.BattleScore sore = new Hero("garen").new BattleScore();
sore.score(100);
}
}
成员内部类为外部类嵌套一个类
访问成员内部类方法有两种:
通过外部类间接调用内部类方法
直接使用内部类方法: 外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();
内部类成员变量访问顺序:
public class Outer {
int num = 30;//外部类成员变量
public class Inner{
int num = 20;
public void method(){
int num = 10;
System.out.println(num);//输出10
System.out.println(this.num);//输出20
System.out.println(Outer.this.num);//输出30
}
}
public static void main(String[] args) {
Outer.Inner obj = new Outer().new Inner();
obj.method();
}
}
public class LocalInnerClass {
//外部类方法
public void method(){
//局部内部类,且不能权限修饰符修饰
class InnerClass{
int num = 10;
public void innerMethod(){
System.out.println(num);
}
}
//外界不能直接访问局部内部类,需要方法内创建对象
//通过调用方法间接访问
InnerClass inner = new InnerClass();
inner.innerMethod();
}
public static void main(String[] args) {
LocalInnerClass obj = new LocalInnerClass();
obj.method();
}
}
如果接口的实现类(或者父类的子类)只需要使用唯一的一次,这种情况下可以省略该类的定义,使用匿名内部类
在声明一个抽象类(接口)的同时实例化它,可使代码更加简洁精练
接口名称 对象名 = new 接口名称(){ //覆盖重写所有的抽象方法 };
或者 抽象类名称 对象名 = new 抽象类名称(){ //覆盖重写所有的抽象方法 };
public abstract class Hero {//外部类
private String name;
float hp;
float armor;
public Hero(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract void attrack();//抽象方法
}
/////////////////////////////////////////////
public class InnerClassMain {
public static void main(String[] args) {
//匿名内部类
Hero ADHero = new Hero("garen"){
@Override
public void attrack(){
System.out.println(getName()+"其他攻击方法");
}
};
ADHero.attrack();
}
}
原文:https://www.cnblogs.com/geqianLee/p/13154501.html