`

java超类

 
阅读更多

this是java使用的一个特定意义的引用,它指向当前对象自身。(指向该关键词所在的类,,用来引用自己所在的类中的成员变量或方法。)
super关键词指向该关键词所在类的父类,用来引用父类中的成员变量或方法。
     通过 super.someMethod([paramlist])将调用父类中的 someMethod()方法。
     该方法不一定是在当前类的直接父类中定义的,可以是直接父类在类的层次体系中继承而来。

Super 超类 (Java编程语言)
  超类 :用java术语来讲,被继承的类称为超类,继承的类称为子类。
  面向对象编程的最重要的特色之一就是能够使用以前创建的类的方法和域。通过简单的类来创建功能强大的类,可以大幅地节省编程时间,更重要的是,这样做可以减少代码

出错的机会。要在以前的类上构造新类,就必须在类声明中扩展这个类。
  通过扩展一个超类,可以得到这个类的一个新副本,并且可以在其上添加其他功能。如果对这个新类并不做任何添加工作,那么,它的工作情况与超类完全相同,新类中会含

有超类所声明和继承的、具有访问权限的所有方法和域。
  对于超类,应该确切地理解this和super关键字的使用,下图演示了这两个关键字的使用。
  import java.awt.*;
  public class TestThisSuper extends Frame
  {
  int b;
  public TestThisSuper(String a)
  {
  this (a,0);
  }
  public TestThisSuper(String a, int b)
  {
  super(a);
  this.b= b;
  }
  }

super是调用父类的构造函数 使用super调用有一些限制条件,不能在super调用中使用实例变量作为参数. 而且在构造函数中,调用必须写在继承类的构造函数定义的第一行,不能在

构造函数的后面使用. this调用的同类的构造函数. super的限制条件同样适用于this函数 一个构造函数定义中不能同时包括this调用和super调用,如果想同时包括的话,可以在

this中首先进行super调用. this是对当前对象的引用 super是调用父类的构造函数.this一般是指你当前这个类的对象 super是自类调用父类的构造函数.


超类(父类)包含继承自该类的所有子类共同的属性和行为,例如,对于animal类而言,所有的哺乳动物都有类似的属性,如有眼睛的颜色,haircolor,另外有一些共同的行为,

所有的哺乳动物都有这些属性和行为,所有没有必要在继承树中对每一种哺乳动物都重复定义这些属性和行为,重复不仅需要做更多工作,可能更麻烦,而且还可能招致错误和不

一致因此,dog和cat从animal种继承了所有这些个共同的属性和方法。Animal类则认为是dog和cat的超类


继承可以带来很多设计上的好处,设计一个cat类时,Animal类提供了很多所需要的功能,通过继承Animal对象cat已经具备成为一个真正哺乳动物的所有属性和行为,为了使它成

为更具体的cat cat类必须包含所特有的属性和行为


Class <? super T > getSuperClass():返回本类的父类
Type getGenericSuperClass();返回本类的父类,包含泛型参数信息
isAssignableForm<Class<?> cls>
判定此class对象所表示的类或接口与指定的class参数所表示的类或接口是否相同,或是否是其超类或超接口

package com.kettas.haofeng.test;

public class ClassA<T> {
private T obj;

public void setObject(T obj) {
this.obj = obj;
}

public T getObject() {
return obj;

}
}


package com.kettas.haofeng.test;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

public class Test <T> extends ClassA <T> {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub

System.out.println("==============getSuperClass=====================");
System.out.println(Test.class.getSuperclass().getName());

System.out.println("====================getGenericSuperClass=============");
Type type=Test.class.getGenericSuperclass();

System.out.println(type);
if(ParameterizedType.class.isAssignableFrom(type.getClass())){
System.out.println("------------->getActualTypeArguments:");
for(Type t1:((ParameterizedType)type).getActualTypeArguments()){
System.out.println(t1+",");
}
System.out.println();
}

}

}
==============getSuperClass=====================
com.kettas.haofen.test.ClassA
====================getGenericSuperClass=============
com.kettas.haofen.test.ClassA<T>
------------->getActualTypeArguments:

 super关键和this作用类似,是被屏蔽的成员变量或者成员方法或变为可见,或者说用来引用被屏蔽的成员变量和成员成员方法。
不过super是用在子类中,目的是访问直接父类中被屏蔽的成员,注意是直接父类(就是类之上最近的超类)。下面是一个综合运用super的例子,有两个类:一个Father类,一个

Father类的子类Son,通过这两个类完全演示了super的用法,一下是代码:

package org.leizhimin;
public class Father {
public String v="Father";
public String x="输出了Father类的public成员变量x!!!";

public Father() {
  System.out.println("Father构造方法被调用!");
}

public Father(String v){
  this.v="Father类的带参数构造方法!运行了.";
}
public void outinfo(){
  System.out.println("Father的outinfo方法被调用");
}
public static void main(String[] args) {
  // TODO 自动生成方法存根
}
}

package org.leizhimin;
public class Son extends Father{
public String v="Son";

public Son() {
  super();      //调用超类的构造方法,只能放到第一行.
  System.out.println("Son无参数构造方法被调用!");
  //super();      //错误的,必须放到构造方法体的最前面.
}

public Son(String str){
  super(str);
  System.out.println("Son带参数构造方法被调用!");
}
//覆盖了超类成员方法outinfo()
public void outinfo(){
  System.out.println("Son的outinfo()方法被调用");
}

public void test(){
 
  String v="哈哈哈哈!";   //局部变量v覆盖了成员变量v和超类变量v
 
  System.out.println("------1-----");
  System.out.println(v);   //输出局部变量v
  System.out.println(this.v);  //输出(子类)成员变量v
  System.out.println(super.v); //输出超类成员变量v
 
  System.out.println("------2-----");
  System.out.println(x);   //输出超类成员变量v,子类继承而来
  System.out.println(super.x); //输出超类成员变量v
 
  System.out.println("------3-----");
  outinfo();   //调用子类的outinfo()方法
  this.outinfo();  //调用子类的outinfo()方法
  super.outinfo(); //调用父类的outinfo()方法
}

public static void main(String[] args) {
  new Son().test();
 
}
}

子类Son运行结果:

Father构造方法被调用!
Son无参数构造方法被调用!
------1-----
哈哈哈哈!
Son
Father
------2-----
输出了Father类的public成员变量x!!!
输出了Father类的public成员变量x!!!
------3-----
Son的outinfo()方法被调用
Son的outinfo()方法被调用
Father的outinfo方法被调用

说明:次例子仅仅为了说明super的用法,实际在设计类的时候一般都尽可能私有(private)化。

通过上面的例子,下面总结一下super的用法:
        第一、在子类构造方法中要调用父类的构造方法,用“super(参数列表)”的方式调用,参数不是必须的。同时还要注意的一点是:“super(参数列表)”这条语句只能用

在子类构造方法体中的第一行。
        第二、当子类方法中的局部变量或者子类的成员变量与父类成员变量同名时,也就是子类局部变量覆盖父类成员变量时,用“super.成员变量名”来引用父类成员变量。

当然,如果父类的成员变量没有被覆盖,也可以用“super.成员变量名”来引用父类成员变量,不过这是不必要的。
        第三、当子类的成员方法覆盖了父类的成员方法时,也就是子类和父类有完全相同的方法定义(但方法体可以不同),此时,用“super.方法名(参数列表)”的方式访问

父类的方法。

        this、super的用法也不过这些,只有理解了其中的原理,才不会跌入陷阱!

分享到:
评论

相关推荐

    java实现超类,子类,异质类

    *建立一个超类House, 和一个子类Home,并提供一系列属性和方法,包括printDetails方法, 这个方法要采用多态性 *建立一个House和Home的异类集合, 测试printDetails方法的多态性

    【IT十八掌徐培成】Java基础第25天-03.递归获取所有超类-内省获取所有属性-getter-setter.zip

    在IT领域,特别是Java编程中,递归获取所有超类以及内省获取所有属性和getter、setter方法是两个重要的概念。这些技术对于理解和操作Java对象的结构和行为至关重要。让我们详细探讨这两个主题。 首先,我们来看递归...

    Eclipse小图标释义

    * 超类的覆盖方法:表示一个 Java 超类的覆盖方法。 * “类型”层次结构中具有焦点的类型:表示一个 Java 类型的层次结构。 * 调用层次结构中的最大扩展级别:表示一个 Java 调用层次结构的最大扩展级别。 * 调用...

    java猜数字游戏源码-cs56-games-hangman:——

    java猜数字游戏源码cs56-games-刽子手 W14 准备好了! (布林·基弗) 具有命令行和图形界面的刽子手游戏。 项目历史 YES | mastergberry | bzimm | Graphical hangman game W14 | bkiefer13 5pm | bzimm | ...

    Hangout:适用于 WindowsMacLinux 的 Java 刽子手游戏

    出去玩Java 刽子手游戏(使用 NetBeans 项目) 游戏包含 100 个单词,但用户可以通过修改 dict.txt 文件添加任意数量的单词(或编辑列表)。 通过提供您自己的 dict.txt 文件将您自己的自定义刽子手游戏发送给朋友,...

    100家大公司java笔试题汇总

    3. 实例方法可直接调用超类的实例方法吗? 答:D. 实例方法可直接调用本类的类方法 Java面向对象编程 4. 下面代码的输出是什么? class Super {public Integer getLenght() { return new Integer(4); }} public ...

    java.io.Reader 和 java.io.InputStream 的区别

    `java.io.Reader`是所有字符输入流的超类。它主要用于读取字符数据,通常以Unicode编码(如UTF-8)的形式。这意味着`Reader`能够处理任何由16位字符组成的文本数据,这在处理包含多种语言和特殊字符的文本文件时尤为...

    java反射,获取所有属性、方法以及List集合类

    Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射主要用于在运行时分析类和对象,包括访问私有成员、调用私有方法、创建对象、获取类...

    Java经典面试题大全(带答案)

    但是,实例方法不能直接调用超类的实例方法,除非显式地使用`super`关键字;同样,也不能直接调用其他类的实例方法。 #### 二、多项选择题知识点解析 1. **Java程序的种类** - **知识点**:Java程序的主要类型。 ...

    2023年Java程序员必考60道Java面试题

    Java 是一种广泛使用的高级编程语言,以其面向对象的特性、平台无关性和高性能著称。面试时,面试官可能会从多个方面考察候选人的 Java 技能,包括基础语法、类、对象、变量、字符串处理、多线程、面向对象概念、...

    java异常机制小结

    Throwable 是 Java 语言中所有错误或异常的超类。Error 和 Exception 是 Throwable 的两个子类,表示严重错误和非严重错误。RuntimeException 是 Exception 的一个子类,表示运行时异常。 六、Java 异常处理的目的...

    100家大公司java笔试题汇总.docx

    2. Java中的实例方法可以直接调用超类的实例方法和类方法,但不能直接调用其他类的实例方法。 3. Java中的多态性是通过方法的重写和重载来实现的。 二、面向对象编程 1. 在Java中,子类可以继承父类的成员变量和...

    深入理解java构造器机理

    “深入理解Java构造器机理” 在 Java 编程语言中,构造器是一种特殊的方法,用于初始化对象的创建。它是 Java 类中最重要的一个概念。下面将深入讨论构造器的机理、执行顺序、作用及与其他概念的区别。 一、构造器...

    Java开发示例代码

    6. **访问权限**:实例方法可以直接调用本类的类方法(静态方法),但不能直接调用超类的实例方法或类方法,也不能直接调用其他类的实例方法。 7. **do-while循环**:给定的do-while循环在条件`a&gt;0`变为假时结束,...

Global site tag (gtag.js) - Google Analytics