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
*/
}
}
分享到:
- 2009-04-17 15:01
- 浏览 1174
- 评论(0)
- 论坛回复 / 浏览 (0 / 1493)
- 查看更多
相关推荐
知识点五:事件处理器和方法覆写 在HTML中,为元素绑定事件处理器时,如果在JavaScript代码中定义了与事件处理器同名的函数,那么这个函数会覆盖HTML中为该事件指定的处理器。在上述代码中,两个`input`元素的`...
Java 语言中的静态变量和静态方法是类级别的成员,它们不属于任何实例,而是直接关联到类本身。在探讨继承和覆盖的问题时,这两者有着不同的行为特性。 首先,让我们来看看静态变量。静态变量(也称为类变量)是...
21. **禁止方法覆写**:可以将类设为public,并将特定方法设为`sealed`,但该方法不能是虚方法。 22. **抽象类**:当类包含抽象方法或未实现父类抽象方法时,必须声明为抽象类。 23. **接口(interface)**:接口...
3. 用 public 修饰的 static 成员变量和成员方法,本质是全局变量和全局方法,当声明它类的对象时,不生成 static 变量的副本,而是类的所有实例共享同一个 static 变量。 4. 用 private 修饰的 static 成员变量和...
6. **abstract class和interface**:抽象类可以有非抽象方法和实例变量,接口只有抽象方法和常量。 7. **线程启动**:用start()方法启动线程,run()方法是线程执行的主体。 8. **接口和继承**:接口可以继承其他接口...
- **抽象方法的设计原则**:抽象方法应该能够被继承的类所覆盖(覆写/重写),因此通常使用 `public` 或 `protected` 来定义抽象方法的访问级别。 #### 题目四:最终变量与方法内的自增操作冲突 **题目描述**: ```...
对于方法来说,静态方法是类作用域,而实例方法可以被子类访问和覆盖。 ### String的最大长度 在Java中,String类型是不可变的,它有一个常量定义了最大长度,即`int MAX_VALUE = 2^31 - 1`,这是Java中int类型的...
abstract修饰类,会使这个类成为一个抽象类,这个类将不能生成对象实例,但可以做为对象变量声明的类型,也就是编译时类型,抽象类就像当于一类的半成品,需要子类继承并覆盖其中的抽象方法。abstract修饰方法,会使...
属性的定义可以使用static和final关键字,static使属性成为类变量,而非实例变量,final则表示属性一旦赋值就不能改变。 继承是面向对象设计中的一个重要特性,它允许子类继承父类的非私有属性和方法。Java支持单...
Override(覆盖)是指子类重写父类中的方法,方法名、返回类型和参数列表必须完全相同。 19. **构造器不能被override**: 构造器不能被覆盖,但可以被重载。 20. **接口与继承**: 接口可以继承接口;抽象类可以...
- **虚方法、覆写方法和抽象方法**: - 虚方法允许子类覆盖其实现。 - 覆写方法是在子类中重写基类的虚方法。 - 抽象方法只声明而不提供实现,必须在派生类中实现。 - **方法重载**: - 方法可以通过参数列表...
方法的覆写发生在继承关系中,子类覆盖父类的方法,但覆写时要注意访问权限不能低于父类,且调用子类对象的覆写方法时,实际执行的是子类的方法。如果想调用父类被覆写的方法,可以使用`super`关键字。
- **定义**: 方法覆写(也称方法重写)是指子类重新定义父类中的方法。这使得子类能够提供自己特定版本的方法实现。 - **规则**: 方法的签名(即方法名、参数列表和返回类型)必须完全相同;访问修饰符不能更严格;...
多态性是Java面向对象的特性之一,表现为方法的重载和覆写以及对象的向上转型和向下转型。 - 向上转型(父类引用指向子类对象)允许任何子类对象赋值给父类引用,调用的方法是子类覆写过的版本。 - 向下转型...
子类访问父类和方法覆写** 子类可以通过`super`关键字访问父类的属性和方法。方法覆写(overriding)允许子类重写父类的方法。 **12. super关键字和调用父类构造方法** `super()`用于在子类构造方法中调用父类构造...
MyThread类继承自Thread类,并覆盖了run()方法,使得MyThread具有线程的能力。当创建MyThread类的实例并调用start()方法时,就会在新线程中执行run()方法,开始线程的运行。 4. 启动和运行线程 通过调用线程对象的...
- **实例变量** 属于对象级别,每个对象拥有自己的副本。它们在对象实例化时才会被分配内存,并且只能通过对象实例来访问。 - **示例代码**: ```java public class MyClass { static int staticVar = 1; // 静态...