`
daiming253685
  • 浏览: 23543 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

关于方法的覆写和实例变量的覆盖

 
阅读更多
package test;
class A{
	public String field1 = "A.field1";
	protected String field2 = "A.field2";
	String field3 = "A.field3";
	private String field4 = "A.field4";
	
	public String toString(){
		return "public field : " + field1 + " protected field : " + field2
		+" default field : " + field3 + " private String field : " + field4 ;
	}
	
    void toSay(){
	   System.out.println("I am a default method in A!");
   }
    
/*    public void toSay(){
 	   System.out.println("I am a public method in A!");    	
    }*///父类方法的访问的权限不得高于子类的覆写的方法的访问权限 
}


/**
 * 在这里我可以做出一个结论 ,所谓的继承其实就是子类对象拥有父类的对象的一个引用,也就是super关键在,在调用
 * 子类继承了父类的方法的时候如果没有该方法没有被覆写,那么就是用父类对象的引用去调用相应的方法。
 * 如果方法被覆写那么就会调用子类中覆写后的方法,哪怕就是我们不知道真实的子类对象的类型,那么在运行的时候通过保存在
 * 子类对象中的类型信息,也能动态的调用子类的对象覆写后的方法。但是在子类中覆写父类的方法的方法的访问权限不得低于父类
 * 的方法访问的权限,否则编译器出错。 见方法 toSay
 * 不同的是对于子类对象中的实例变量和父类中的实例变量,因为子类的实例变量是对象的组成,因此分布在堆中不同的内存空间中,
 * 也就是拥有不同的内存的地址。因此只要在子类中定义了与父类相同名称的实例变量,那么父类的实例变量就会被覆盖(不管双方的访问权限,不管覆盖的变量的类型),除非我们
 * 通过super(子类对象中保存的父类对象的引用)来调用父类实例变量。当然对于实例变量的调用是不可以多态的,只要子类对象被提升未父类对象,
 * 那么我们就只可以调用父类对象的实例变量,究其原因是因为实例变量的调用关系是在编译的时候确定的,而不像方法的调用是在运行时动态确定的。
 * 
 * @author vagasnail
 *
   2009-4-17   下午02:33:56
 */
class AA extends A{
	public String field1 = "AA.field1";
	   void toSay(){
		   System.out.println("I am a default method in AA!");
	   }
/*	   void toSay(){
		   System.out.println("I am a default method in AA!");
	   } // Error here : Cannot reduce the visibility(可见度) of the inherited(继承的方法) method from A
*/
}
public class TestOverrideAttr {

	public static void main(String[] args) {

		A a = new A();
		a.toSay();   //output : I am a default method in A!
		System.out.println(a.field1);
//		System.out.println(a);
		A aa1 = new AA();
		aa1.toSay(); //output : I am a default method in AA!
		System.out.println(aa1.field1);
		//System.out.println(aa1);
		AA aa2 = new AA();
		aa2.toSay();//output : I am a default method in AA!
		System.out.println(aa2.field1);
		/* System.out.println(aa2);
		 * output:由于在子类中没有覆写基类中的toString()方法,因此这里还是用基类的引用调用的基类的toString()方法。
		 * public field : A.field1 protected field : A.field2 default field : A.field3 private String field : A.field4
		 */
	}


}

 

分享到:
评论

相关推荐

    javascript 方法覆写实例代码

    知识点五:事件处理器和方法覆写 在HTML中,为元素绑定事件处理器时,如果在JavaScript代码中定义了与事件处理器同名的函数,那么这个函数会覆盖HTML中为该事件指定的处理器。在上述代码中,两个`input`元素的`...

    java之中的静态变量与静态方法的继承与覆盖问题.doc

    Java 语言中的静态变量和静态方法是类级别的成员,它们不属于任何实例,而是直接关联到类本身。在探讨继承和覆盖的问题时,这两者有着不同的行为特性。 首先,让我们来看看静态变量。静态变量(也称为类变量)是...

    C#基础面试题_2.pdf

    21. **禁止方法覆写**:可以将类设为public,并将特定方法设为`sealed`,但该方法不能是虚方法。 22. **抽象类**:当类包含抽象方法或未实现父类抽象方法时,必须声明为抽象类。 23. **接口(interface)**:接口...

    java中final和static的区别

    3. 用 public 修饰的 static 成员变量和成员方法,本质是全局变量和全局方法,当声明它类的对象时,不生成 static 变量的副本,而是类的所有实例共享同一个 static 变量。 4. 用 private 修饰的 static 成员变量和...

    笔试题(JavaSE).doc

    6. **abstract class和interface**:抽象类可以有非抽象方法和实例变量,接口只有抽象方法和常量。 7. **线程启动**:用start()方法启动线程,run()方法是线程执行的主体。 8. **接口和继承**:接口可以继承其他接口...

    一次JAVA面试遇到的题目

    - **抽象方法的设计原则**:抽象方法应该能够被继承的类所覆盖(覆写/重写),因此通常使用 `public` 或 `protected` 来定义抽象方法的访问级别。 #### 题目四:最终变量与方法内的自增操作冲突 **题目描述**: ```...

    Java面试基础

    对于方法来说,静态方法是类作用域,而实例方法可以被子类访问和覆盖。 ### String的最大长度 在Java中,String类型是不可变的,它有一个常量定义了最大长度,即`int MAX_VALUE = 2^31 - 1`,这是Java中int类型的...

    良心出品Java简答题参考题型.doc

    abstract修饰类,会使这个类成为一个抽象类,这个类将不能生成对象实例,但可以做为对象变量声明的类型,也就是编译时类型,抽象类就像当于一类的半成品,需要子类继承并覆盖其中的抽象方法。abstract修饰方法,会使...

    Java语言与面向对象程序设计第10讲(继承与多态)

    属性的定义可以使用static和final关键字,static使属性成为类变量,而非实例变量,final则表示属性一旦赋值就不能改变。 继承是面向对象设计中的一个重要特性,它允许子类继承父类的非私有属性和方法。Java支持单...

    Java面试宝典新人版

    Override(覆盖)是指子类重写父类中的方法,方法名、返回类型和参数列表必须完全相同。 19. **构造器不能被override**: 构造器不能被覆盖,但可以被重载。 20. **接口与继承**: 接口可以继承接口;抽象类可以...

    微软C#语言规范5.0版 CSharp Language Specification Version5.0

    - **虚方法、覆写方法和抽象方法**: - 虚方法允许子类覆盖其实现。 - 覆写方法是在子类中重写基类的虚方法。 - 抽象方法只声明而不提供实现,必须在派生类中实现。 - **方法重载**: - 方法可以通过参数列表...

    Java基础知识总结.docx

    方法的覆写发生在继承关系中,子类覆盖父类的方法,但覆写时要注意访问权限不能低于父类,且调用子类对象的覆写方法时,实际执行的是子类的方法。如果想调用父类被覆写的方法,可以使用`super`关键字。

    java基础的应用

    - **定义**: 方法覆写(也称方法重写)是指子类重新定义父类中的方法。这使得子类能够提供自己特定版本的方法实现。 - **规则**: 方法的签名(即方法名、参数列表和返回类型)必须完全相同;访问修饰符不能更严格;...

    java学习笔记 java学习笔记

    多态性是Java面向对象的特性之一,表现为方法的重载和覆写以及对象的向上转型和向下转型。 - 向上转型(父类引用指向子类对象)允许任何子类对象赋值给父类引用,调用的方法是子类覆写过的版本。 - 向下转型...

    java初级知识

    子类访问父类和方法覆写** 子类可以通过`super`关键字访问父类的属性和方法。方法覆写(overriding)允许子类重写父类的方法。 **12. super关键字和调用父类构造方法** `super()`用于在子类构造方法中调用父类构造...

    Java线程及多线程技术及应用.pdf

    MyThread类继承自Thread类,并覆盖了run()方法,使得MyThread具有线程的能力。当创建MyThread类的实例并调用start()方法时,就会在新线程中执行run()方法,开始线程的运行。 4. 启动和运行线程 通过调用线程对象的...

    2018java面试宝典

    - **实例变量** 属于对象级别,每个对象拥有自己的副本。它们在对象实例化时才会被分配内存,并且只能通过对象实例来访问。 - **示例代码**: ```java public class MyClass { static int staticVar = 1; // 静态...

Global site tag (gtag.js) - Google Analytics