JAVA继承时this和super关键字

JAVA继承时this和super关键字

本文主要讨论在方法前使用this或super关键字时,编译器在什么地方查找对应的函数。

  1. 在子类中指定this关键字。首先在本类中查找,如果本类中找不到,再在父类中查找。

class A

{

public void fun()

{

System.out.println("父类的fun()");

}

}

class B extends A

{

public void test()

{

this.fun();

}

public void fun()

{

System.out.println("子类中的fun()");

}

}

public class Hello

{

public static void main(String[] args)  throws Exception

{

B b =  new B();

b.test();

}

}

输出结果是子类中的fun。如果我们将子类中的该函数删去,那么调用的就是父类中的fun。


class A

{

public void fun()

{

System.out.println("父类的fun()");

}

}

class B extends A

{

public void test()

{

this.fun();

}

// public void fun()

// {

// System.out.println("子类中的fun()");

// }

}

public class Hello

{

public static void main(String[] args)  throws Exception

{

B b =  new B();

b.test();

}

}

输出父类中的fun

  1. 在子类中使用super,那么跳过子类查找直接从父类中查找

class A

{

public void fun()

{

System.out.println("父类的fun()");

}

}

class B extends A

{

public void test()

{

super.fun();

}

public void fun()

{

System.out.println("子类中的fun()");

}

}

public class Hello

{

public static void main(String[] args)  throws Exception

{

B b =  new B();

b.test();

}

}

输出父类中的fun

  1. 在父类中指定this关键字。和子类中指定this关键字一样,先从子类中找覆写的方法,如果找到,直接调用子类的该方法,如果没找到再从父类中寻找。

class A

{

public void test()

{

this.fun();

}

public void fun()

{

System.out.println("父类的fun()");

}

}

class B extends A

{

public void fun()

{

System.out.println("子类中的fun()");

}

}

public class Hello

{

public static void main(String[] args)  throws Exception

{

B b =  new B();

b.test();

}

}

输出子类中的fun

如果此时将子类中的fun删除


class A

{

public void test()

{

this.fun();

}

public void fun()

{

System.out.println("父类的fun()");

}

}

class B extends A

{

// public void fun()

// {

// System.out.println("子类中的fun()");

// }

}

public class Hello

{

public static void main(String[] args)  throws Exception

{

B b =  new B();

b.test();

}

}

输出父类中的fun

但此时有一点需要注意的是,如果修改父类的fun的访问权限为private,这时输出的就是父类中的fun


class A

{

public void test()

{

this.fun();

}

private void fun()

{

System.out.println("父类的fun()");

}

}

class B extends A

{

public void fun()

{

System.out.println("子类中的fun()");

}

}

public class Hello

{

public static void main(String[] args)  throws Exception

{

B b =  new B();

b.test();

}

}

时间: 2024-11-07 22:58:56

JAVA继承时this和super关键字的相关文章

java学习中,面向对象的三大特性:封装、继承、多态 以及 super关键字和方法的重写(java 学习中的小记录)

java学习中,面向对象的三大特性:封装.继承.多态 以及 super关键字和方法的重写(java 学习中的小记录) 作者:王可利(Star·星星) 封装     权限修饰符:public 公共的,private 私有的     封装的步骤:          1.使用private 修饰需要封装的成员变量.          2.提供一个公开的方法设置或者访问私有的属性              设置 通过set方法,命名格式:     set属性名();  属性的首字母要大写 访问 通过ge

Java泛型边界问题,super关键字

背景 Java给定一个具体的类型参数A之后的泛型List,与给定另一个具体的类型参数X的泛型List super或者extends可以定义一大类的泛型,作为给出具体类型参数的泛型的父类. super或者extends定义的有边界泛型,根据参数类型的层次覆盖判定和具体参数类型泛型之间的层次关系. 不要对super望文生义 super关键字,用于类的方法中表示指向父类对象的引用. 在泛型边界语法中指出泛型下界. 假设有继承关系,A <- B <- C <- D <- E void f(

JAVA继承时构造函数的问题

今天看到java继承部分时,关于构造函数是否继承以及如何使用时遇到了点问题,后来查找相关资料解决了. 下面是我个人的总结: 先创建一个父类,里面有两个构造函数: public class Jisuan { protected int a=4; //构造函数1 Jisuan() { System.out.println("父类的无参数构造函数"); } //构造函数2 Jisuan(int a) { System.out.println("父类的有参数构造函数");

Java中this和super关键字

今天练习到Java中的this和super关键字,我有如下总结: 1.子类继承父类,子类初始化对象,必须先调用父类构造方法,因为随时有可能要使用父类的成员变量. 2.get和set方法只是对成员变量进行赋值操作,而非初始化. 3.构造方法既能对成员变量进行初始化,又能对其进行赋值操作. 4.子类只要调用父类的构造方法(不管是带参还是无参都行,都用super(······)调用)即可对父类的成员进行初始化, 5.如果子类有两个构造方法,一个可以调用父类带参构造方法,另一个可以用this(···)调

JAVA中继承时方法的重载(overload)与重写/覆写(override)

JAVA继承时方法的重载(overload)与重写/覆写(override) 重载-Override 函数的方法参数个数或类型不一致,称为方法的重载. 从含义上说,只要求参数的个数或参数的类型不一致就说两个函数是重载函数,而至于返回值是否一样,没关系.同时,重载可以发生在同一个类中也可以发生在继承关系中. class A { } class B extends A { public void fun(String data1) { System.out.println(data1); } pub

Java 继承与重写、重载

1.类的继承 1)继承 父类:所有子类所共有的属性和行为 子类:子类所特有的属性和行为 通过extends关键字来实现类的继承 子类(Sub class)可以继承父类(Super class)的成员变量及成员方法,同时也可以定义自己的成员变量和成员方法 Java语言不支持多重继承,一个类只能继承一个父类(单一继承),但一个父类可以有多个子类 继承具有传递性,子类的子类可以继承父类的父类的成员变量及成员方法 2)继承中构造方法(super关键字) Java规定:构造子类之前必须先构造父类 子类的构

java继承机制

1 继承  关键字:extends   java没有多重继承 实例 父类: package unit4; public class Base { public int publicVarofBase=1; private int privateVarofBase=1; int defaultVarofBase=1; protected void methodOfBase() { System.out.println("执行父类的方法"); } } 子类: package unit4;

JAVA笔记5__构造块、静态块/单例设计模式/继承/final关键字/super关键字

public class Main { { //构造块(在构造对象时调用,先于构造方法执行) System.out.println("我是构造块!"); } static{ //静态块(在类加载时执行,且只执行一次[在构造块前执行]eg:数据库连接) System.out.println("我是静态块!"); } public Main(){ System.out.println("我是构造方法!"); } public static void

JAVA构造方法,继承关系和SUPER关键字

SUPER可调用父类的构造方法,但要注意默认调用和参数调用. 同时,在继承类时,可以用SUPER调用其它非构造方法哟. class Test extends Object{ public Test(){ System.out.println("Test1 First thing"); } public Test(String welcome){ System.out.println("Test1 " + welcome); } protected void doSo