内部类的属性访问和实例化

JRE包含了JVM。JVM是运行java程序的核心虚拟机,而运行java程序不仅需要核心虚拟机,还要有其他的,类加载器,字节码校验器以及大量的基础类库。总而言之,JRE除了包含JVM之外还包含了运行java程序的其他环境支持。

构造器是创建java对象的途径,是不是说构造器完全负责创建java对象?
不是,构造器是创建java对象的重要途径,通过new关键字调用构造器时,构造器也确实返回了该类的对象,但是这个对象并不是完全由构造器负责创建的。实际上,当程序员调用构造器时,系统会先为该对象分配内存空间,并为这个对象执行默认初始化,这个对象已经产生了----这些操作都在构造器执行之前就完成了。也就是说,当系统开始执行构造器的执行体之前,系统已经创建了一个对象,只是这个对象还不能被外部程序访问,只能在该构造器中通过this来引用它。当构造器执行体执行结束之后,这个对象作为构造器的返回值返回,通常还会赋给另一个引用类型的变量,从而让外部程序可以访问该对象。

我们只是创建了一个Ostrich对象时,哪来的Bird对象?
java程序创建某个类的对象时,系统会隐式创建该类父类对象。只要有一个子类对象仍然存在,则一定存在一个与之对应的父类对象。在子类方法中使用super引用时,super总是指向作为该方法调用者的子类对象所对应的父类对象。其实,super引用和this引用很像,其中this总是指向到调用该方法的对象,而super则指向this指向对象的父对象。

非静态内部类对象和外部对象的关系是怎样的?
非静态内部类对象必须寄存在外部类对象里,而外部类对象则不必一定有非静态内部类对象寄存其中。简单的说,如果存在一个非静态内部类对象,则一定存在一个被它寄存的外部类对象。但外部类对象存在时,外部类对象里不一定寄存了非静态内部类对象。因此外部类对象访问非静态内部类成员时,可能非静态普通内部类对象根本不存在!而非静态内部类对象访问外部类成员时,外部类对象是一定存在的。

public class Outer {
private int outProp=9;
class Inner{
private int inProp=5;
public void accessOuterProp(){
System.out.println("外部类的outProp属性值:"+outProp);
}
}
public void accessInnerProp()
{
//外部类不能直接访问非静态内部类的实例属性,下面代码出现变异错误。
//system.out.println(”内部类的inProp属性值:“+inProp);
//如需访问内部类的实例属性,必须显式创建内部类状态。
System.out.println("内部类的inProp属性值:"+new Inner().inProp);
}
public static void main(String[] args){
Outer out= new Outer();
out.accessInnerProp();
}
}

为什么静态内部类实例方法也不能访问外部类的实例属性?
因为静态内部类是外部类的类相关,而不是外部类的对象相关的。也就是说,静态内部类的对象不是寄存在外部类对象里,而是在寄存在外部类的本身中。也就是说,当静态类内部类的对象存在时,并不存在一个它寄存的外部类对象,静态内部类的对象只有外部类的引用,没有外部类对象的引用。如果允许静态内部类的实例方法访问外部类的实例成员时,但找不到被寄存的外部类对象,这将引起错误。
public class TestStaticInnerClass {
private int prop1=5;
private static int prop2=9;
static class StaticInnerClass{
private static int age;
public void accessOuterProp()
{
System.out.println(prop1);//出错,静态内部类无法访问外部类的实例成员。
System.out.println(prop2);
}
}
}


既然内部类是外部类的成员,是否可以为外部类定义子类,在子类中在定义一个内部类来重写其父类中的内部类?
class StaticOut{
static class StaticIn{
public StaticIn(){
System.out.println("静态内部类的构造器");
}
}
}
public class CreateStaticInnerInstance {
public static void main(String[] args){
StaticOut.StaticIn in=new StaticOut.StaticIn();
/*上面的代码可更改为如下两行代码:
* 使用OutterClass.InnerClass的形式定义内部类变量
* StaticOut.StaticIn in;
* 通过new来调用内部类构造器创建静态内部类实例。
* in=new StaticOut.StaticIn();
* */
}
}

不可以。从上面的知识可以看出,内部类的类名不再是简单的由内部类的类名组成,它实际上还把外部类名作为一个命名空间,作为内部类类名的限制。因此子类中内部类和父类中的内部类不可能完全同名,即使二者所包含的内部类的类名相同,但因为它们所处的外部类空间不同,所以他们不可能是同一个类,也就不可能重写。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值