Java学习笔记15(面向对象八:匿名对象、内部类)

时间:2022-05-28 12:32:41

匿名对象:

是指创建对象的时候,只有创建对象的语句,却没有把对象地址值赋给某个变量

创建一个普通对象:

Person p = new Person();

创建一个匿名对象:

new Person();

注意:

1.匿名对象只能使用一次

2.匿名对象可以作为参数传递

3.匿名对象可以当作方法的返回值

示例:

public class Demo {
    public static Person getPerson(){
        //普通方式
        //Person p = new Person();    
        //return p;
        
        //匿名对象作为方法返回值
        return new Person(); 
    }
    
    public static void method(Person p){}
}

public class Test {
    public static void main(String[] args) {
        //调用getPerson方法,得到一个Person对象
        Person person = Demo.getPerson();
        
        //调用method方法
        Demo.method(person);
        //匿名对象作为方法接收的参数
        Demo.method(new Person());
    }
}

 

 

内部类:

在类的内部定义类

什么时候需要呢?比如,一个汽车,包含发动机,发动机就可以用内部类来描述

内部类的分类:成员内部类,局部内部类

成员内部类的建立和调用示例:

public class Outer {
    private int a = 1;
    //内部类可以使用外部类成员,包括私有
    //外部类无法直接使用内部类变量,必须建立内部类对象
    class Inner{
        public void inner(){
            System.out.println("内部类方法"+a);
        }
    }
}
public class Test {
    public static void main(String[] args) {
        //内部类调用格式:
        Outer.Inner in = new Outer().new Inner();
        in.inner();
    }
}

 

同名变量的调用问题:

public class Outer {
    int i = 1;
    class Inner{
        int  i =2;
        public void inner(){
            int  i = 3;
            System.out.println(i);//3
            System.out.println(this.i);//2
            System.out.println(Outer.this.i);//1
        }
    }
}

 

局部内部类:

把一个类写在了一个方法里面

调用方法相对复杂

示例:

public class Outer {
    public void out(){
        class Inner{
            public void inner(){
                System.out.println("局部内部类方法");
            }
        }
        Inner inner = new Inner();
        inner.inner();
    }
}
public class Test {
    public static void main(String[] args) {
        new Outer().out();
    }
}

 

 

内部类的实际使用:

匿名内部类:

临时定义某一指定类型的子类,定义后立即创建刚刚定义的这个子类对象

示例:

public interface Smoking {
    public abstract void smoking();
}
public class Test {
    public static void main(String[] args) {
        //固定格式
        //实际上创建了接口的实现类,重写方法
        //这里也可以这样写Smoking s = new Smoking() {};
        //然后s.方法调用
        new Smoking() {
            public void smoking() {
                System.out.println("人在吸烟");
            }
        }.smoking();
        //注意这个分号
    }
}