java子类中的实例方法能否java子类调用父类属性中的实例方法

java继承中子类对象调用父类方法的问题? - 知乎13被浏览2151分享邀请回答/javase/tutorial/essential/concurrency/locksync.html41 条评论分享收藏感谢收起synchronized(this){
doSomething();
可以看到锁的是对象。回到你这里的问题class Foo{
synchronized doSomething(){
.........................
class Son extends Foo{
synchronized doSomething(){
..................
super.doSomething();
注意这里锁的是对象,不管父类还是子类他们对应的都是同一个对象,因为是一个对象在调用这个方法,此时this关键字指向的就是这个对象,你可以想象子类现在是这样的:class Son{
doSomething(){
synchronized (this){
............//Son类doSomething()中的操作
synchronized (this){
............//Foo类doSomething()中的操作
可以看到这里该对象的锁获取了两次,如果锁是不可重入的,那么第二次锁将获取不到。对象维持一个锁的计数器,进入锁加一,退出锁减一,如果为零则可以获取该锁。没有你提到的子类对象和父类对象之分。这里需要注意的是:synchronized(Son.class){
}synchronized(Foo.class){
}这两个锁的是类的类类型,也就是Class类的实例对象,每一个类编译之后会生成一个.class文件,.class文件加载到jvm中时会实例化一个对应的Class对象,并且只会实例化一次。32 条评论分享收藏感谢收起public void fun1(){
System.out.println("a:fun1");
this.fun2();
private void fun2(){
System.out.println("a:fun2");
class B extends A{
public void fun2(){
System.out.println("b:fun2");
public class Main {
public static void main(String[] args) {
A a=new B();
本文已收录于以下专栏:
相关文章推荐
//构造函数
public WebappClassLoader(ClassLoader parent) {
super(new URL[0], parent);
* Created by liuyazhou on .
public class Test {
public ...
程序员升职加薪指南!还缺一个“证”!
CSDN出品,立即查看!
= =今天看书看到覆盖和重载
我就在想能不能再实例化的子类中调用父类已经被覆盖的方法
百度了很久
除了说super
貌似就不行了
也能在子类中做一个新方法来调用父类已经...
我们经常在项目中使用继承,但是往往不太明白,程序运行的顺序以及原理,尤其是使用上转型对象的时候,以及父类子类中都有static变量和方法时,不知道先运行谁。
下面是一个简单的继承,来查看代码的执行顺...
在子类的重写方法中用super关键字
示例代码:
void a() {
System.out.println("parent'a()");
原文地址:http://blog.csdn.net/qq_/article/details/
父类能调用子类的方法吗?
当一个类继承于另一个类,子类中没有父类的方法时。用子类的对象调用方法时,会首先在子类中查找,如果子类中没有改方法,再到父类中查找。
当一个方法只在父类中定义时,调用该方法时会使用父类中的属性。
深入浅出,保证一看就懂
* Created by liuyazhou on .
public class Test {...
在Java中,子类的构造过程中,必须调用其父类的构造函数,是因为有继承关系存在时,子类要把父类的内容继承下来,通过什么手段做到的?
答案如下:
当你new一个子类对象的时候,必须首...
1.前提:父类和子类同时都有有参的构造函数和无参构造函数。
java中的子类初始化时初值为空。调用顺序为先调用父类无参构造函数,然后调用子类无参构造函数。
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)2444人阅读
= =今天看书看到覆盖和重载
我就在想能不能再实例化的子类中调用父类已经被覆盖的方法
百度了很久
除了说super &貌似就不行了
也能在子类中做一个新方法来调用父类已经被覆盖的方法 &
import java.io.BufferedR
public class baidu extends Search {
public static void main(String[] args) throws IOException {
new baidu().superFunction() ;
public void function(){
System.out.println(&I am baidu!&);
public void superFunction(){
super.function() ;
class Search{
public void function(){
System.out.println(&I am search!&);
A为父类,B为子类,都有一个m()方法
B b = new B();
想通过((A)b).m()
实际上也是不行的&
详见见识:
B b=new B(); 这种方式,实际上是实例化了子类的对象,注意:内存中还是子类对象。
((A)b).m();
表面上看起来是父类对象了,但是由于内存中是子类对象,所以调用的还是子类方法。
A b=new B();
这种方法和你写的实际是一个效果,虽然上溯造型到了父类,由于子类重写了父类的方法,调用的还是子类的方法(也就是所:方法的实现,最后是在子类中实现的)。
所以,总结如下:
如果子类没有重写父类的方法,调用父类的方法的时候,实际上是去父类的内存中实现,可以调用父类方法。
如果子类重写了父类的方法,那么,你虽然上溯造型到了父类,由于内存还是子类,该方法的实现还是在子类,所以用实例化的对象是调用不到父类的,这种情况下,只能用super关键字。
如果不是类内部,而是外部调用,比如你例子中的main方法,答案是&不能。你不能调用已经被覆盖掉的父类的方法。&这也是覆盖override的最初设计意图之一。&大多数时候,覆盖父类意味着子类想做些特殊的处理。如果能够跳过子类的特殊处理,就会打开一个无法控制的缺口,会导致很多很多问题。&唯一可以调用父类方法的地方,就只有类内部。子类自己控制,什么时候该调用父类,什么时候做自己的处理。
想到最后才发现自己为啥会纠结这么一个问题=。=
方法被覆盖自然是需要修改
既然修改了为什么还要想着去调用父类中的方法
真是多此一举
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:7264次
排名:千里之外new一个类的实例出来,这个实例居然不能调用它父类的方法,何解【java吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:636,390贴子:
new一个类的实例出来,这个实例居然不能调用它父类的方法,何解收藏
搞不懂,居然要我把它强转为父类才能调用,咋回事?
java,亚马逊网上书城,满59元免运费,好书不间断!700多万种中外正版精品图书一网打尽!买java,就上Z.CN!正版图书,天天低价特惠,让您挚爱阅读!
没代码你说个j8
private ? 发源码吧
new一个实例出来?也就是一个对象?对象又不是子类,哪来的父类啊?如果你说的不是父类而是实例化这个对象的类,那么你实例化这个对象的时候就已经调用了这个类的构造方法了,而其他的方法只要没私有化,都能用对象名.方法名(实参)来调用啊
我去,连个代码都没有!你是猴子请来的逗比么?
代码帖出来,简单写一下public class B {
public void method(){
}}public class A extends B{...此处省略}然后在另一个类C中public class C {
public void abc(){
A().method();//此处居然不可以,要改成这样:(B)(new A()).method();
我们用的一定不是同一个世界的javac
此贴终结,我的失误。
A是B的子类,必须是B的类型才能调用B中的方法。new A();只是A的实例,正入下面,改成B类型就可以调用了。
登录百度帐号推荐应用抽象类中子类为什么不能调用父类的非抽象方法?
function DetectorBase() {
throw new Error('Abstract class can not be invoked directly!');
DetectorBase.detect = function() {
console.log('Detection starting...');
DetectorBase.stop = function() {
console.log('Detection stopped.');
DetectorBase.init = function() {
throw new Error('Error');
//var d = new DetectorBase();// Uncaught Error: Abstract class can not be invoked directly!
function LinkDetector() {}
LinkDetector.prototype = Object.create(DetectorBase.prototype);
LinkDetector.prototype.constructor = LinkD
var l = new LinkDetector();
console.log(l); //LinkDetector {}__proto__: LinkDetector
l.detect(); //Uncaught TypeError: l.detect is not a function
l.init(); //Uncaught TypeError: l.init is not a function主要是倒数第二行代码。为什么会报错,这里不是应该执行的吗?控制台应该输出 Detection starting... 吗?---我把老师的代码补全,实例化,调用了一下,为什么没有成功呢?
非常感谢!
那老师讲这里的时候,虽然没有深入讲完,但是他是不是代码写的不太对?
嗯嗯, 是的,估计是做ppt的时候没注意到吧
点击展开后面1条评论
写下你的评论...
写下你的评论...
Copyright (C)
All Rights Reserved | 京ICP备 号-2

我要回帖

更多关于 java 父类调用子类 的文章

 

随机推荐