java-多态中变量为什么不能重写。方法却能,这两者有啥不同么?

问题描述

多态中变量为什么不能重写。方法却能,这两者有啥不同么?

为什么多态时,继承。变量不能重写。方法却能重写呢?。在继承时不是变量也能改变数值么???

解决方案

从语法的角度说,就是这么规定的。
从面向对象的角度讲,没有这个需求。方法是一个类的行为和接口,变量是一个类的状态和特征。多态的思想就是相同的接口,多种的实现。变量不是接口,不需要“多态”。

好比为什么洗衣粉不能吃。从生物化学的角度看,洗衣粉有毒。从洗衣粉的用途讲,洗衣粉是洗衣服用的,不是设计拿来吃的。

解决方案二:

一个道理,为什么语法规定变量不能重写,而方法能重写,也是根据编程语言的用途决定的。没有需要“变量重写”的用途。

解决方案三:

方法重写的原因是因为在不同的情况下有不同的用法,变量需要这个功能么?没有必要吧!想用的时候定义就好了呀

解决方案四:

从面向对象来说,确实是没有必要,重写是要改变它,如果你写成和父类一样,没有改变,如果写成和父类不一样,那就是常规的域声明了。从虚拟机层面来说,是因为虚拟机确定域时,不会像找方法一样动态搜索,而是根据声明类型直接确定(通过对象直接引用域时,注意,是可以在子类和父类同时声明同名域的)。

解决方案五:

vtable的指针是指向代码区的, 而变量不在代码区

解决方案六:

当一个子类继承一父类,而子类中的方法与父类中的方法的名称,参数个数、类型都完全一致时,就称子类中的这个方法重写了父类中的方法。
重写不能重写父类的私有方法,只能重写可继承的方法。重写是相对与方法的,不存在变量重写的概念。

时间: 2024-11-02 10:32:43

java-多态中变量为什么不能重写。方法却能,这两者有啥不同么?的相关文章

java线程中 start方法和run方法的区别和联系是什么

问题描述 java线程中 start方法和run方法的区别和联系是什么 java线程中 start方法和run方法的区别和联系是什么 start是启动一个线程到就绪状态 run是运行一个线程 要run一个线程必须先start一个线程,这么理解对不 解决方案 通过start启动线程,内部调用run,如果你直接调用run,就是同步的,会阻塞 解决方案二: run方法里写的是每个线程需要执行的代码 run 只是调用你自己写的run方法而已.根线程调用无关. start才是启动线程的方法 解决方案三:

在Java程序中使用数据库的新方法_java

 Java 8终于到来了! 经过几年的等待, java程序员终于能在java中得到函数式编程的支持了. 函数式编程的支持能流程化现有的代码并且为java提供强大的能力.在这些新特性中最瞩目的是java程序员对数据库的操作方式.函数式编程带来了令人激动的简便高效的数据库API. Java 8 将会支持可与像C#的LINQ等语言竞争的新的数据库访问方式.处理数据的函数式方式 Java 8 不仅仅添加了函数式支持,它也通过新的函数式处理数据的方式扩展了集合(Collection)类. 而通常情况下ja

采用Java 8中Lambda表达式和默认方法的模板方法模式

原文链接 作者:   Mohamed Sanaulla  译者: 李璟(jlee381344197@gmail.com) 模板方法模式是"四人帮"(译者注:Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides)所著<Design Patterns book>一书中所描述的23种设计模式其中的一种,该模式旨在: "Define the skeleton of an algorithm in an op

获取java线程中信息的两种方法

在进行多线程编程中,比较重要也是比较困难的一个操作就是如何获取线程中的信息.大多数人会采取比较常见的一种方法就是将线程中要返回的结果存储在一个字段中,然后再提供一个获取方法将这个字段的内容返回给该方法的调用者.如以下的ReturnThreadInfo类: package threadtest1; /** * * @author shi mingxiang */ public class ReturnThreadInfo extends Thread { private String str; p

java栈中变量的作用域与内存回收问题上的一点小疑问?

问题描述 一个类的实例方法public void test(){ //dosomethings ... for(int i=0;i<100;i++){ //dosomethings ... } //dosomethings.....}这段方法在执行时,变量i的作用域在for循环块中,当出了for循环块以外,变量i失效.但是我想问一下,当出了for循环块以后,变量i的所在内存是否会被回收.也就是说是否在此test方法的栈帧出栈之前被回收? 解决方案 当调用一个java方法时,产生一个帧,帧里面包括

Java程序中代理技术的使用方法简介

如果你这样的需求:在运行时创建实现一组给定接口的类,注意这个类是在运行时创建的,你就需要使用JAVA中的代理类来达成你的要求. 代理类提供在运行时创建类的能力,这个新建的类能实现你指定的接口. 当然你不能在运行时为要实现的接口中的方法定义新代码,而是提供一个调用处理器来实现.调用处理器是实现了InvocationHandler接口的类的对象,此接口只有一个方法: Object invoke(Object proxy,Method mtd,Object[] args) 其中proxy是代理对象:m

实例讲解Java编程中数组反射的使用方法_java

什么是反射"反射(Reflection)能够让运行于JVM中的程序检测和修改运行时的行为."这个概念常常会和内省(Introspection)混淆,以下是这两个术语在Wikipedia中的解释: 内省用于在运行时检测某个对象的类型和其包含的属性: 反射用于在运行时检测和修改某个对象的结构及其行为. 从它们的定义可以看出,内省是反射的一个子集.有些语言支持内省,但并不支持反射,如C++. 内省示例:instanceof 运算符用于检测某个对象是否属于特定的类. if (obj insta

在Java编程中使用正则表达式的基本方法_java

众所周知,在程序开发中,难免会遇到需要匹配.查找.替换.判断字符串的情况发生,而这些情况有时又比较复杂,如果用纯编码方式解决,往往会浪费程序员的时间及精力.因此,学习及使用正则表达式,便成了解决这一矛盾的主要手段.  大 家都知道,正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符(元字符)组成的文字模式,它 用以描述在查找文字主体时待匹配的一个或多个字符串.正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配.   自从jdk1

php中变量及部分适用方法_php技巧

变量:$_SERVER,         在   PHP   4.1.0   及以后版本使用.之前的版本,使用   $HTTP_SERVER_VARS    变量:$_ENV,               在   PHP   4.1.0   及以后版本使用.之前的版本,使用   $HTTP_ENV_VARS    变量:$_COOKIE,         在   PHP   4.1.0   及以后版本使用.之前的版本,使用   $HTTP_COOKIE_VARS    变量:$_GET,