首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在类上面指定其他类名?

在类上面指定其他类名是为了实现多态性。多态性是面向对象编程的一个重要特性,它允许我们使用一个接口来表示多种不同的实现。在类上面指定其他类名可以实现继承,继承是面向对象编程的另一个重要特性,它允许我们创建一个新类,该类继承了另一个类的属性和方法。

通过在类上面指定其他类名,我们可以实现代码的重用和模块化。我们可以创建一个基类,该类包含了一些通用的属性和方法,然后创建一些继承自基类的子类,这些子类可以重写基类的方法,或者添加新的属性和方法。这样,我们可以在不同的场景下使用不同的子类,而不需要重复编写相同的代码。

例如,我们可以创建一个名为“动物”的基类,该类包含了一些通用的属性和方法,如“名称”、“年龄”和“叫声”。然后,我们可以创建一些继承自“动物”类的子类,如“狗”、“猫”和“鸟”。这些子类可以重写基类的方法,如“叫声”,或者添加新的属性和方法,如“品种”和“飞行速度”。

在实际应用中,我们可以根据需要创建不同的子类,并使用它们来实现不同的功能。例如,我们可以使用“狗”类来模拟一只狗的行为,使用“猫”类来模拟一只猫的行为,使用“鸟”类来模拟一只鸟的行为。这样,我们可以在不同的场景下使用不同的子类,而不需要重复编写相同的代码。

总之,在类上面指定其他类名是为了实现多态性和代码的重用和模块化。这是面向对象编程的重要特性之一,可以帮助我们更好地组织和管理代码,提高代码的可维护性和可扩展性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么 waitnotifynotifyAll Object 定义而不是 Thread

就像为什么 Java 中不支持多继承或者为什么 String Java 中是 final 的问题一样,这个问题也可能有多个答案。...为什么 Object 中定义 wait 和 notify 方法,每个人都能说出一些理由。...为何 wait,notify 和 notifyAll 属于 Object ? 为什么它们不应该在 Thread 中?...线程监视器上等待,为执行等待,我们需要2个参数: 一个线程 一个监视器(任何对象) Java 设计中,线程不能被指定,它总是运行当前代码的线程。...但是,我们可以指定监视器(这是我们称之为等待的对象)。 这是一个很好的设计,因为如果我们可以让任何其他线程在所需的监视器上等待,这将导致“入侵”,影响线程执行顺序,导致设计并发程序时会遇到困难。

1.5K20
  • java中String为什么要设计成final?

    String为什么被定义为final面试中经常被问到。 首先,先得清楚 final 这个关键字。 final的出现就是为了为了不想改变,而不想改变的理由有两点:设计(安全)或者效率。...final 修饰的是不被能继承的,所以 final 修饰的是不能被篡改的。...所有 *java程序中的字符串,如“ABC”,是 *实现为这个的实例。 * *字符串是常量,它们的值它们之后不能更改 *创建。支持可变字符串字符串缓冲区。...数组变量只是stack上的一个引用,数组的本体结构heap堆。String里的value用final修饰,只是说stack里的这个叫value的引用地址不可变。...[] value={1,2,3}; value[2]=100; //这时候数组里已经是{1,2,100} 当String为final类型时: package test; public class 为什么

    93330

    java中String为什么要设计成final?

    String不可变很简单,如下图,给一个已有字符串"abcd"第二次赋值成"abcedl",不是原内存地址上修改数据,而是重新指向一个新对象,新地址。 ? 2. String为什么不可变?...也就是说Array变量只是stack上的一个引用,数组的本体结构heap堆。String里的value用final修饰,只是说stack里的这个叫value的引用地址不可变。...而且设计师还很小心地把整个String设成final禁止继承,避免被其他人继承后破坏。所以String是不可变的关键都在底层的实现,而不是一个final。考验的是工程师构造数据类型,封装数据的功力。...示例1 package _12_01字符串;public class 为什么String要设计成不可变你 { public static void main(String[] args) { String...如果String是可变的,就可能如下例,我们使用StringBuffer来模拟String是可变的 package _12_01字符串;public class 为什么String要设计成不可变2 {

    1.1K31

    python2中为什么进行定义时最好

    _repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name'] Person很明显能够看出区别...,不继承object对象,只拥有了doc , module 和 自己定义的name变量, 也就是说这个的命名空间只有三个对象可以操作....Animal继承了object对象,拥有了好多可操作对象,这些都是中的高级特性。...对于不太了解python的同学来说,这些高级特性基本上没用处,但是对于那些要着手写框架或者写大型项目的高手来说,这些特性就比较有用了,比如说tornado里面的异常捕获时就有用到class来定位的名称...最后需要说清楚的一点, 本文是基于python 2.7.10版本,实际上python 3 中已经默认就帮你加载了object了(即便你没有写上object)。

    1.2K20

    为什么文件必须和public修饰的名称必须一致

    而是遇到import的时候才去相应的文件目录找相应的class文件。 对于一个public,它是可以被项目中任何一个所引用的,只需使用它前import一下它所对应的class文件即可。...将与文件一一对应就可以方便虚拟机 相应的路径(包)中找到相应的的信息。如果不这么做的话,就很难去找,而且开销也会很大。...---- 为什么一个java源文件中只能有一个public? 答案: 每个编译单元(文件)只能有一个public。...一个源文件中可以存在和文件不一致的情况,但不能用public修饰....如以前用一种汇编语言写过程序,那么可能已习惯编译器先分割出一种过渡形式(通常是一个.obj 文件),再用一个链接器将其与其他东西封装到一起(生成一个可执行文件),或者与一个库封装到一起(生成一个库)。

    1.9K30

    ReadWriteLock中读锁为什么不能升级为写锁?

    上篇文章中已经介绍过Java并发包里面的读写锁 ReadWriteLock lock=new ReentrantReadWriteLock(); 读写锁的最大功能在于读共享写独占,从而在读多写少的场景下能够提升并发性能...那么为什么是这样?...其实也不难理解,只要线程获取写锁,那么这一刻只有这一个线程可以临界区操作,它自己写完的东西,自己的是可以看见的,所以写锁降级为读锁是非常自然的一种行为,并且几乎没有任何性能影响,但是反过来就不一定行的通了...举个生活中的例子,一个演唱会中,台上有一歌手在唱歌,我们可以理解为它是写锁,只有他在唱歌,同时台下有很多观众听歌,观众也就是读锁,现在假如歌手唱完了,它可以立马到台下很轻松的就降级为一观众,但是反过来我们宣布一项规定...这就是读锁为什么不能直接升级写锁的主要原因,当然这里并不是绝对,升级写锁的最佳条件是一次只允许一个读线程升级,这样以来就不会产生大量不可控的竞争,JDK8中新增的StampedLock就可以比较优雅的完成这件事

    2.9K71

    OC代码规范2——的头文件中尽量少引入其他头文件

    解决该问题的方案就是:的.h文件中使用@class来声明引用,然后.m文件中再使用#import来导入引用。...总结 之前我写过一篇本文主题的文章:Effective Objective-C 2.0——的头文件中尽量少引用其他头文件,该文章举的例子是错误的。下面我做一下阐述。 错误片段如下: ?...这里我说,头文件中使用#import引入其他,很有可能会重复引入一些内容。可是通过前文我们可知,#import对比#include的一大优势就是不会重复引入相同的。...所以,不要在当前的头文件中使用#import引入其他,因为如果引入的头文件中也import了其他的杂七杂八的,那么当前就会引入许多根本用不到的,这势必会增加编译时间。...因此,我们的头文件中少使用import引入其他的头文件,而是使用@class来声明一个。 以上。

    2.7K20

    熟悉OC--2:的头文件中尽量少引入其他头文件

    OC中的标准方式 #import @interface Person : NSObject @property (nonatomic,copy) NSString...property (nonatomic,copy) NSString *lastName; @end #import "Person.h" @implementation Person @end 利用@Class的头文件中可以减少编译时间...当我们实际工作中,可能需要创建一个名为Student的新,然后Person的中应该有一个Student的属性,一般做法是引入Person.h文件中引入Student.h #import <Foundation...假设要是把Student.h引入到Person.h中,那么就会引入Student.h的所有文件,有很多根本用不到的内容,反而增加了编译的时间 有时候必须在头文件中引入其他头文件 如果你写的, 集成某个..., 则必须引入定义那个父的头文件,或者是你声明的遵从某个协议, 那么该协议必须有完整定义, 而且不能用向前声明, 向前声明只能告诉编译器有某个协议, 而此时编译器却需要知道该协议中定义的方法 参考

    17310

    java中String为什么要设计成final?Java面试常见问题

    final关键词修饰的不可以被其他继承,但是该类本身可以继承其他,通俗地说就是这个可以有父,但不能有子类。.../** * ......其他略.........我们继续把上面的代码深入地分析一下。Java中,因为数组也是对象, 所以value中存储的也只是一个引用,它指向一个真正的数组对象。...这个代码案例进一步证明了我们上面的结论:String字符串的不可变,指的其实是value对象栈中的引用地址不可变,而不是说常量池中value里的数据元素不可变!...为什么要用final修饰java中的String呢? 核心:因为它确保了字符串的安全性和可靠性。 2. java中的String真的不可变吗?

    41200

    CMD窗口中使用javac和java命令进行编译和执行带有包的具有继承关系的

    因为我们在编写程序时用到了包,所以运行文件时,需要完整名称,命令修改为:java com.hafiz.zhang.Zi 我们会发现出现以下错误 ?...这是因为我们不存在子文件夹com/hafiz/zhang并且该子文件夹下不存在Zi.class文件,故找不到主。 解决办法是:使用javac  -d . *.java("-d ."...代表在当前目录下创建包路径)命令来进行编译,这样javac命令会自动帮我们创建包指定的文件夹,并在该文件夹下创建Zi.class文件。 ?...由此我们得出了CMD窗口中使用javac和java命令进行编译和执行带有包的具有继承关系的的方式: 1.使用javac -d . *.java进行编译 2.使用java com.hafiz.Zi(...带包全名)命令进行运行!

    1.6K40

    为什么Java中的成员变量不能被重写?成员变量Java中能够被重写么?不会重写成员变量,而是隐藏成员变量访问隐藏域的方法

    这篇文章讨论了Java面向对象概念中一个基本的概念--Field Hiding(成员变量隐藏) 成员变量Java中能够被重写么?...这是为什么呢?...意思就是: 一个中,子类中的成员变量如果和父中的成员变量同名,那么即使他们类型不一样,只要名字一样。父中的成员变量都会被隐藏。子类中,父的成员变量不能被简单的用引用来访问。...而是,必须从父的引用获得父被隐藏的成员变量,一般来说,我们不推荐隐藏成员变量,因为这样会使代码变得难以阅读。...其实,简单来说,就是子类不会去重写覆盖父的成员变量,所以成员变量的访问不能像方法一样使用多态去访问。

    3.5K40

    泛型接口,泛型和泛型通配符

    泛型接口和泛型 泛型接口的定义,public interface man{...}。接口后面加上泛型类型参数T,这样就定义了一个泛型接口。 ?...泛型的定义,public class Man{...},后面加上泛型类型参数T,这样就定义了一个泛型。 ? 泛型 和泛型接口不同,有构造器,并且构造器也可以使用泛型类型参数。...比如父是Book,子类不能直接extends Book,而是需要指定T的类型,上例中使用的Book作为类型。 java中,泛型不能继承和实现。为什么?WHY?...那为什么继承的时候也要确定泛型呢?因为继承就是使用一个已经定义好的,使用泛型,就要指定类型。 3.用什么样的参数形式来接受List这种形式的参数?...List提供的add(E e)方法是需要指定类型的,这里不是E吗?这是个泛型类型啊?为什么要提供类型?因为这是定义,一旦要使用add(E e)方法,必须指定具体的类型。

    2.3K20

    探秘Java:从main函数启动开始

    为什么是main函数   众所周知,我们编写的Java文件都是运行在JVM虚拟机上面,也就是说程序的编译和运行都是要遵循JVM的规定,那么我们就来看一看JVM源码中是如何规定的。   ...JVM启动程序中定义了这样一个方法 int JNICALL JavaMain(void * args); ,在这个方法中确定了如何加载Java应用程序的入口和入口方法,这里我们暂时省略其他代码,直接阅读一下加载入口方法的代码...,JVM启动过程中会根据指定的 MainClass 即初始去获取该类中的 main 方法,同时这里也明确了main方法必须是静态的、公有的且参数列表为 String 数组。...当我们idea中去执行上述代码时,实际上执行的是这样一行命令: java {}.java   在上面这行命令中出现的 java 指令实际上是jdk提供的执行java程序的指令,指令后面紧跟着的文件就是待执行的...,一种是通过获取jar包中 META-INF/MANIFEST.MF 文件中指定的Main-Class,一种是通过指定className来获取(也就是上面示例中方式)。

    1.3K30
    领券