黑马程序员-----面向对象_内部类(学习日记)

 --------android培训java培训、期待与您交流! ----------


内部类:

定义:将一个类定义在另一个类的里面,对里面的那个类就称为内部类(内置类,嵌套类)。


访问的特点:

1.   内部类可以直接访问外部类中的成员,包括私有成员。

2.   而外部类要访问内部类中的成员必须要建立内部类的对象。

*内部类可以是静态static的,也可用publicdefaultprotectedprivate修饰。(而外部顶级类即类名和文件名相同的只能使用publicdefault)。


 

注意:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。对于一个名为outer的外部类和其内部定义的名为inner的内部类。编译完成后出现outer.class和outer&inner.class两类。所以内部类的成员变量/方法名可以和外部类的相同。

 

成员内部类

      成员内部类,就是作为外部类的成员,可以直接使用外部类的所有成员和方法,即使是private的。同时外部类要访问内部类的所有成员变量/方法,则需要通过内部类的对象来获取。

      要注意的是,成员内部类不能含有static的变量和方法。因为成员内部类需要先创建了外部类,才能创建它自己的,了解这一点,就可以明白更多事情,在此省略更多的细节了。

 在成员内部类要引用外部类对象时,使用outer.this来表示外部类对象;
 而需要创建内部类对象,可以使用outer.inner  obj = outerobj.new inner();

public class Outer { 
    public static void main(String[] args) { 
        Outer outer = new Outer(); 
        Outer.Inner inner = outer.new Inner(); 
        inner.print("Outer.new"); 
 
        inner = outer.getInner(); 
        inner.print("Outer.get"); 
    } 
 
    // 个人推荐使用getxxx()来获取成员内部类,尤其是该内部类的构造函数无参数时 
    public Inner getInner() { 
        return new Inner(); 
    } 
 
    public class Inner { 
        public void print(String str) { 
            System.out.println(str); 
        } 
    } 
} <span style="color: blue;">
</span>

匿名内部类

 有时候我为了免去给内部类命名,便倾向于使用匿名内部类,因为它没有名字。


下面来看实例:

实例1.

不使用匿名内部类来实现抽象方法:

abstract class Person { 
    public abstract void eat(); 
} 
  
class Child extends Person { 
    public void eat() { 
        System.out.println("eat something"); 
    } 
} 
  
public class Demo { 
    public static void main(String[] args) { 
        Person p = new Child(); 
        p.eat(); 
    } 
}

运行结果:eatsomething


可以看到,我们用Child继承了Person类,然后实现了Child的一个实例,将其向上转型为Person类的引用

但是,如果此处的Child类只使用一次,那么将其编写为独立的一个类岂不是很麻烦?

这个时候就引入了匿名内部类


实例2.

匿名内部类的基本实现:

abstract class Person { 
    public abstract void eat(); 
} 
  
public class Demo { 
    public static void main(String[] args) { 
        Person p = new Person() { 
            public void eat() { 
                System.out.println("eat something"); 
            } 
        }; 
        p.eat(); 
    } 
}<span style="color:#333333;"><strong>
</strong></span>


运行结果:eat something


可以看到,我们直接将抽象类Person中的方法在大括号中实现了

这样便可以省略一个类的书写

并且,匿名内部类还能用于接口上


实例3:

在接口上使用匿名内部类:

interface Person { 
    public void eat(); 
} 
  
public class Demo { 
    public static void main(String[] args) { 
        Person p = new Person() { 
            public void eat() { 
                System.out.println("eat something"); 
            } 
        }; 
        p.eat(); 
    } 
}

运行结果:eatsomething



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值