`
liujiawinds
  • 浏览: 136255 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

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

    博客分类:
  • java
阅读更多
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();
		 * */
	}
}

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

相关推荐

    java实例化对象的过程

    5. **访问对象的方法和属性**:一旦对象被实例化,我们就可以通过对象变量访问其方法和属性。例如,`obj.display();`会打印出"Name: John"。 在实际开发中,我们可能遇到多态性,接口,抽象类等复杂情况。例如,...

    Java内部类.pdf

    还提到了内部类的构造方法以及如何在main方法中进行实例化和调用。 以上所述内容是基于Java内部类概念所展开的知识点,涵盖了Java内部类的基本使用方法、语法结构、编译特性以及常见的编程场景。

    Python 类属性与实例属性,类对象与实例对象用法分析

    # 使用赋值语句定义类属性,记录实例化工具对象的数量 count = 0 def __init__(self, name): self.name = name # 初始化方法内部定义及初始化实例属性 # 类名.类属性名 的方式访问类属性. Tool.count += 1 # 1...

    内部类 匿名内部类 内部接口 对比说明

    静态内部类可以直接访问外部类的静态成员,但不能直接访问实例成员,需要通过外部类的实例来访问。静态内部类可以在类外直接创建对象,不需要外部类的实例,因此它更像一个独立的类。 4. **匿名内部类**:没有名字...

    java 内部类的实例详解

    接下来,我们来看内部类如何访问外部类的属性和方法。内部类可以直接访问外部类的所有成员,包括私有成员,因为它与外部类的实例有着紧密的关联。以下是一个例子: ```java public class OuterClass { private ...

    java实现数组实例化一个类

    ### Java 实现数组实例化一个类 在Java编程中,我们经常会遇到需要创建多个具有相同属性的对象的情况。本文将详细探讨如何使用Java语言创建一个`Student`类,并通过数组来实例化该类的对象。 #### 创建 Student 类...

    第十一天 07实例属性、类属性【千锋Python人工智能学院】1

    如果两者同名,实例对象会优先访问实例属性。在`Dog`类的示例中,`self.type = "dog"`创建了一个实例属性,使得`dog1.type`返回“dog”,而`Dog.type`返回的是类属性“狗”。 关于类属性的私有化,Python允许通过在...

    PHP程序设计-3期(KC016) 3.8.1创建和使用类课后习题:创建类和实例化对象.doc

    通过以上步骤,我们已经理解了如何在PHP中创建类和实例化对象,以及如何使用类的属性和方法。这个练习不仅巩固了基础概念,也为更复杂的面向对象编程奠定了基础。在实际项目中,我们经常会遇到需要创建多个对象的...

    接口,内部类,抽象类概念和区别

    抽象类是一种不能实例化的类,它通常包含抽象方法(没有实现的方法)。抽象类的主要目的是作为其他类的基类,提供公共的属性和方法。子类继承抽象类,必须实现所有抽象方法,除非子类也是抽象类。抽象类可以有非抽象...

    内部类的相关知识-静态内部类,匿名内部类……

    例如,在 `AccessStaticInnerClass` 类中,我们可以通过 `StaticInnerClass.prop1` 的形式来访问静态内部类 `StaticInnerClass` 的静态属性 `prop1`。 ```java public class AccessStaticInnerClass { static ...

    内部类和设计模式1

    - 工厂模式是一种创建型设计模式,提供了一个创建对象的接口,但允许子类决定实例化哪一个类。 - 常见的工厂模式有简单工厂模式、工厂方法模式和抽象工厂模式。 学习内部类和设计模式能够提高代码的复用性、可...

    c#事件+委托+属性的最好实例代码.txt

    属性提供了一种封装数据的方式,允许我们以一种更安全、更灵活的方式来访问和修改对象的状态。在这个例子中,`SCORE` 的 setter 方法提供了对分数进行修改的能力,并确保了分数的值是正确的。 ### 委托(Delegates...

    java 反射入门-属性方法调用实例

    Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射主要用于在运行时分析类和对象,包括类的方法、字段、构造器等信息。这篇博文将带你...

    内部类详解,看了他就不用看其他资料了

    成员内部类可以直接访问外部类的所有成员,包括私有成员,但外部类需要通过实例化内部类来访问内部类的成员。 - 在外部类之外创建成员内部类对象时,需要先创建外部类对象,然后通过外部类对象来实例化内部类。 2....

    Python 面向对象编程:类的创建与初始化、实例属性与方法、类属性与方法

    在Python中,面向对象主要涉及类(Class)的创建、实例化(Instantiation)、属性(Attributes)和方法(Methods)。 1. 类的创建与实例化: 在Python中,类通过`class`关键字定义。类名通常遵循“驼峰式命名”,...

    用C语言实现类实例化的研究.pdf

    本文深入探讨了如何在C语言环境下模拟面向对象编程中类的实例化过程,这一过程对于将面向对象的设计理念引入到C语言这一传统过程式编程语言中具有重要的意义。在深入了解该研究前,需要先对一些基础概念有所了解。 ...

    Java中类的定义与实例化详解

    类的定义和实例化是 Java 编程的核心部分,本文将详细介绍类的定义和实例化的相关知识。 一、类的定义 在 Java 中,类的定义使用关键字 `class` 声明,后跟类名。类名通常是名词,表示类的名称。例如,`Cat` 类...

    spring 静态实例化

    1. **系统初始化需求**:对于那些需要在系统启动时就准备好的组件,如数据访问层(DAO)或服务层(Service)的Bean,使用静态实例化可以确保这些组件在应用运行前就已经初始化完成。 2. **单例模式的实现**:静态...

    Java内部类总结

    静态内部类不依赖于外部类的实例,可以独立创建实例,因此可以访问外部类的静态成员,但不能直接访问非静态成员。 4. **匿名内部类**:没有名字的内部类,通常用于实现接口或继承类的场合,只在声明时使用一次。...

Global site tag (gtag.js) - Google Analytics