public class Person {
public void eat(){
System.out.println("人要干饭");
}
static class Heart{
public void jump(){
System.out.println("心脏跳动");
}
}
}
java复制代码
public class Demo134StaticInnerClass {
public static void main(String[] args) {
// 外部类.内部类 对象名 = new 外部类.内部类()
Person.Heart heart = new Person.Heart();
heart.jump();
}
}
2.调用非静态成员内部类
外部类.内部类 对象名 = new 外部类().new 内部类()
Person外部类,Heart内部类,jump内部类Heart里的方法
java复制代码
public class Person {
public void eat(){
System.out.println("人要干饭");
}
class Heart{
Heart(){
}
public void jump(){
System.out.println("心脏跳动");
}
}
}
java复制代码
public class Demo135StaticInnerClass2 {
public static void main(String[] args) {
// 外部类.内部类 对象名 = new 外部类().new 内部类()
Person.Heart heart = new Person().new Heart();
heart.jump();
}
}
外部类的成员变量和内部类的成员变量以及内部类的局部变量重名时,怎么区分?
示例:
外部类Student 内部类Heart 内部类的方法display
java复制代码
public class Student {
String name = "金莲";
class Heart{
String name = "大朗";
public void display(String name){
// 内部类的局部变量
System.out.println(name);
// 内部类的成员变量
System.out.println(this.name);
// 外部类的成员变量
System.out.println(Student.this.name);
}
}
}
测试类
java复制代码
public class Demo136StaticInnerClass3 {
public static void main(String[] args) {
Student.Heart heart = new Student().new Heart();
heart.display("小明");
}
}
三、局部内部类
1.局部内部类的基本操作
可以定义在方法中、代码块中、构造方法中
示例:
Person外部类和Heart内部类
java复制代码
public class Person {
public void eat(){
class Heart{
public void jump(){
System.out.println("心脏哐哐哐的跳动");
}
}
new Heart().jump();
}
}
测试类
java复制代码
public class Demo137StaticInnerClass4 {
public static void main(String[] args) {
Person person = new Person();
person.eat();
}
}
2.局部内部类实际操作
1.接口类型作为方法参数传递和返回
接口作为方法参数,传递实参时,传递的是实现类对象
示例:
接口
java复制代码
public interface USB {
public abstract void open();
}
实现类
java复制代码
public class Mouse implements USB{
@Override
public void open() {
System.out.println("鼠标打开");
}
}
测试类
java复制代码
public static void main(String[] args) {
Mouse mouse = new Mouse();
method(mouse);
System.out.println("------------------------------------------------------------------------");
// USB usb = new Mouse();
USB usb = method01();
usb.open();
}
/*
接口作为方法参数返回,实际返回的是实现类对象
USB usb = mouse ------> 多态
*/
public static void method(USB usb){
usb.open();
}
/*
接口作为返回值类型,传递实参时,传递的是实现类对象
*/
public static USB method01(){
Mouse mouse = new Mouse();
return mouse;
//return new Mouse();
}
}
2.抽象类作为方法参数和返回值
① 抽象类作为方法参数传递,传递实参时,传递的是其子类对象
② 抽象类作为方法返回值类型返回时,实际返回的是其子类对象
示例:
抽象类
java复制代码
public abstract class Animal {
public abstract void eat();
}
实现类
java复制代码
public class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗啃骨头");
}
}
测试类
java复制代码
public class Demo139StaticInnerClass6 {
public static void main(String[] args) {
Dog dog = new Dog();
method01(dog);
System.out.println("------------------------------------------------------------");
Animal animal = method02();
animal.eat();
}
public static void method01(Animal animal){
animal.eat();
}
public static Animal method02(){
Dog dog = new Dog();
return dog;
}
}
3.普通类做方法参数和返回值
普通类作为方法参数传递,传递的是对象
普通类作为方法返回值返回,返回的是对象
示例:
普通类
java复制代码
public class Person {
public void eat(){
System.out.println("人要吃饭");
}
}
测试类
java复制代码
public class Demo140StaticInnerClass7 {
public static void main(String[] args) {
Person person = new Person();
method01(person);
System.out.println("------------------------------------------------------------------------");
Person person1 = method02();
method01(person1);
}
public static void method01(Person person){
person.eat();
}
public static Person method02(){
Person person = new Person();
return person;
}
}
4.局部内部类实际操作
USB接口
java复制代码
public interface USB {
void open();
}
测试类
java复制代码
public class Demo141StaticInnerClass8 {
public static void main(String[] args) {
// USB usb = new Mouse()
USB usb = method();
usb.open();
}
public static USB method(){
// 局部内部类
class Mouse implements USB {
@Override
public void open() {
System.out.println("鼠标打开了");
}
}
Mouse mouse = new Mouse();
return mouse;
}
}
public class Demo142StaticInnerClass9 {
public static void main(String[] args) {
// 重写接口方法
new USB() {
@Override
public void open() {
System.out.println("USB打开了");
}
@Override
public void close() {
System.out.println("USB关闭了");
}
}.open();
System.out.println("------------------------------------------------------------------------------------------------------------------");
// 有名对象,可以调用多个方法
USB usb = new USB() {
@Override
public void open() {
System.out.println("USB打开了");
}
@Override
public void close() {
System.out.println("USB关闭了");
}
};
usb.open();
usb.close();
}
}
将抽象方法 和创建实现类对象调用抽象方法合二为一:
6.总结
1.什么时候使用匿名内部类?
当简单调用一次接口中的方法,我们就可以使用匿名内部类
2.将一种格式代表实现类对象或者子类对象来学习
3.匿名内部类会编译生成的,我们只需要利用讲的格式去new对象,调用重写的方法即可
7.匿名内部类的复杂使用_当参数传递
接口
java复制代码
public interface USB {
// 定义一个抽象方法
void open();
}
测试类
java复制代码
public class Demo143StaticInnerClass10 {
public static void main(String[] args) {
method01(new USB() {
@Override
public void open() {
System.out.println("USB打开了");
}
});
}
public static void method01(USB usb){
usb.open();
}
}
实现流程
8.匿名内部类的复杂使用_当返回值返回
接口
java复制代码
public interface USB {
// 定义一个抽象方法
void open();
}
测试类
java复制代码
public class Demo144StaticInnerClass11 {
public static void main(String[] args) {
USB usb = method01();
usb.open();
}
public static USB method01(){
return new USB() {
@Override
public void open() {
System.out.println("USB打开了");
}
};
}
}