概要:
java中允许在类的内部中在定义一个类来表示内部类
1、静态内部类
package com.company.Object;
public class StaticInClass {
String Mainname;
public static class Person{
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
}
public class Main {
public static void main(String[] args) {
// write your code here
StaticInClass.Person person = new StaticInClass.Person("xiaoming",16);
System.out.println(person.getName());
}
}
注:
因为Person率属于静态内部类,所以无法访问外部内中非静态成员变量,因为无法知道访问的是外部类中的哪一个对象成员
2、成员内部类
package com.company.Object;
public class PartInClass {
public class Person{
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
}
public class Main {
public static void main(String[] args) {
// write your code here
PartInClass.Person person1 = new PartInClass().new Person("局部内部类",20);
System.out.println(person1.getName());
}
}
注:
这里Person属于成员内部类,相当于外部类的实例成员,所以在实例化的时候,需要先创建外部类实例对象
3、局部内部类
在方法体或者代码块中定义的类,称为局部内部类 (语法比较鸡肋,不推荐使用)
package com.company.Object;
public class LocalInClass {
public static void main(String[] args) {
class Person{
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Person person = new Person("huitai",19);
person.getName();
}
}
4、匿名内部类(重点)
匿名内部类本质上是没有名字的局部内部类,定义在方法体,代码块中
作用:方便创建子类对象,简化代码编写过程
特点:1、匿名内部类是一个没有名字的内部类
2、匿名内部类写出来就会产生一个匿名内部类的对象
3、匿名内部类的类型相当于当前new对象类型的子类类型
示例如下:
package com.company.Object;
public class NimingClass {
public static void main(String[] args) {
Person person = new Person() {
@Override
void speak() {
System.out.println("this is xiaoming speaking");
}
};
person.speak();
}
}
abstract class Person{
abstract void speak();
}
匿名内部类中创建的对象可以作为参数进行简化
package com.company.Object;
public class NimingClass {
public static void main(String[] args) {
WhoSay(new Person() {
@Override
public void speak() {
System.out.println("this is person saying...");
}
});
}
interface Person{
void speak();
}
public static void WhoSay(Person person)
{
person.speak();
}
}