A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 徐青松 中级黑马   /  2014-2-23 17:49  /  5352 人查看  /  24 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

如题,假设A类中有静态方法和静态属性、普通方法和普通属性以及代码块、构造方法等。请问B类是A类的子类时,他会继承A类的哪些东西,静态的都可以继承吗?构造方法算是继承了吗?A类的普通变量会被B类继承吗?各种···求大神指点!

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

24 个回复

倒序浏览
除构造器外其他的所有都继承
回复 使用道具 举报
子类可以继承父类的所有属性和方法,构造方法要用关键字super([参数])调用。
另外,当父类的方法或属性被声明为private时,子类是不可以继承的。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
除了静态代码块,局部代码块,构造代码块不能够继承之外,其他的所有成员方法 成员变量都可以被继承。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
静态代码块 是当所在类加载时只运行一次,不能被继承
构造函数 是被调用 不是被继承
回复 使用道具 举报
静态属性和静态方法也是会继承的,但继承的静态方法不能被重写,构造方法在继承中,会访问父类的空构造函数,要想访问父类中指定的构造函数用super。普通变量会被继承。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
sgs_gzy 发表于 2014-2-23 18:34
子类可以继承父类的所有属性和方法,构造方法要用关键字super([参数])调用。
另外,当父类的方法或属性被声 ...

构造方法也是可以继承的?
回复 使用道具 举报
xiaochen33520 发表于 2014-2-23 18:35
除了静态代码块,局部代码块,构造代码块不能够继承之外,其他的所有成员方法 成员变量都可以被继承。 ...

public class DuoTaiTest {
        public static void main(String args[]) {
                B.b();
        }
}
class A {
    protected void a() {
                System.out.println("A:a");
        }

        public static void b() {
                System.out.println("A:static b");
        }
}

class B extends A {
    @Override
        protected void a() {
                // TODO Auto-generated method stub
                super.a();
        }

//        public static void b()
//        {
//                System.out.println("B:static b");
//        }
}
经验证,B中静态方法b()没有时,B.b()方法仍然被调用输出为“A:static b”,说明B有此静态方法,那就是静态方法被继承了。请验证,请解释

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
osully 发表于 2014-2-23 18:47
静态代码块 是当所在类加载时只运行一次,不能被继承
构造函数 是被调用 不是被继承
...

哦,构造方法不能被继承能懂,但是
public class DuoTaiTest {
        public static void main(String args[]) {
                B.b();
        }
}
class A {
    protected void a() {
                System.out.println("A:a");
        }

        public static void b() {
                System.out.println("A:static b");
        }
}

class B extends A {
    @Override
        protected void a() {
                // TODO Auto-generated method stub
                super.a();
        }

//        public static void b()
//        {
//                System.out.println("B:static b");
//        }
}
经验证,B中静态方法b()没有时,B.b()方法仍然被调用输出为“A:static b”,说明B有此静态方法,那就是静态方法被继承了。请验证,请解释

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1 很给力!

查看全部评分

回复 使用道具 举报
sgs_gzy 发表于 2014-2-23 18:34
子类可以继承父类的所有属性和方法,构造方法要用关键字super([参数])调用。
另外,当父类的方法或属性被声 ...

比较同意你的观点!呵呵
回复 使用道具 举报
徐青松 发表于 2014-2-23 19:34
哦,构造方法不能被继承能懂,但是
public class DuoTaiTest {
        public static void main(String  ...

静态代码块是指
static
{
}
静态函数 也是函数 可以继承
回复 使用道具 举报
乔青山 发表于 2014-2-23 18:29
除构造器外其他的所有都继承

那子类中能重载父类的中静态或非静态方法吗?比如:
public class DuoTaiTest {
        public static void main(String args[]) {
                B.b(1, 3);
                B bb=new B();
                bb.a(2, 3);
        }
}

class A {
        protected void a() {
                System.out.println("A:a");
        }

        protected void a(int a, int b) {
                System.out.println("A:非静态 a方法  传入两个参数,求和得:" + (a + b));
        }

        public static void b(int a, int b) {
                System.out.println("A:static b 传两个参数进去,求得和为:" + (a + b));
        }
}

class B extends A {
        @Override
        protected void a() {
                // TODO Auto-generated method stub
                super.a();
        }

        protected void a(int b) {
                // TODO Auto-generated method stub
                System.out.println("B:非静态 a方法  传入1个参数,求和得:" + b);
        }

        public static void b() {
                System.out.println("B:static b");
        }
}
题中A类a方法又两个参数的,B类a方法只有一个参数的,方法名什么的都相同,就参数列表不同,对于B bb=new B( );bb.a(2,3);B中能调用两个参数的方法,说明B类中有从A类继承来的a方法,即B中有两个参数的方法,另外又定义了一个只有一个参数的a方法,这样的方式属于重载吗?!求解
回复 使用道具 举报
osully 发表于 2014-2-23 19:40
静态代码块是指
static
{

“静态代码块 是当所在类加载时只运行一次,不能被继承。”把你的回答看错了。sorry,嗯知道了,静态代码块和构造函数是不能被继承的,还有private修饰的都不能被继承。
回复 使用道具 举报
徐青松 发表于 2014-2-23 19:47
“静态代码块 是当所在类加载时只运行一次,不能被继承。”把你的回答看错了。sorry,嗯知道了,静态代码 ...

特地验证了一下
静态代码块 也被继承了!!
  1. package day20140223;

  2. class A {
  3.         void show() {
  4.                 System.out.println("A的函数");
  5.         }

  6.         static {
  7.                 System.out.println("A的静态构造代码块");
  8.         }

  9.         {
  10.                 System.out.println("A的构造代码块");
  11.         }
  12. }

  13. class B extends A {
  14.         static void bshow() {
  15.                 System.out.println("B");
  16.         }
  17. }

  18. public class train1 {
  19.         public static void main(String[] args) {
  20.                 B.bshow();
  21.         }
  22. }
复制代码


运行结果为

A的静态构造代码块
B

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报 1 0
osully 发表于 2014-2-23 19:53
特地验证了一下
静态代码块 也被继承了!!

嗦嘎。实践出真知呀,我也在验证中呢。哈哈。没事还是得多敲敲代码呀
回复 使用道具 举报
osully 发表于 2014-2-23 19:53
特地验证了一下
静态代码块 也被继承了!!

这个不应该算是继承吧,这个算是类的初始化过程,子类继承父类,肯定要先初始化静态代码区的,如果子类也有静态代码块,就是先执行父类的静态代码块,然后子类,然后父类的构造代码块,构造函数,然后子类的
回复 使用道具 举报
看了这么多回复,我自己都晕了。。什么这么多乱七八糟的。。静态代码块也好,构造代码块也好,那都是类的初始化过程!子类继承父类,初始化时,肯定要先初始化静态代码区的,如果A继承B,AB都有静态代码块,也有构造代码块,那么初始化的顺序肯定是:先执行B的静态代码块,然后A的静态代码块,然后B的构造代码块,构造函数,然后A的构造代码块,构造函数。这些都是初始化过程好吧,不叫继承方法!那么子类继承父类究竟继承了哪些东西呢?
子类和父类在同一个包中时,子类可以继承父类的除private属性的所有方法和成员变量(不包括构造函数方法,但是能够用super()调用),当子类与父类不在同一个包中时,子类只能继承父类的protected和public属性的成员变量和方法

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
徐青松 发表于 2014-2-23 19:44
那子类中能重载父类的中静态或非静态方法吗?比如:
public class DuoTaiTest {
        public static void mai ...

属于
重载只能在一个类中是错误的,继承可以实现这种跨类重载。
不过从原理上说和一个类中相似,因为子类继承了父类的方法,所以也相当于在重载自己的方法。
回复 使用道具 举报
徐青松 发表于 2014-2-23 19:47
“静态代码块 是当所在类加载时只运行一次,不能被继承。”把你的回答看错了。sorry,嗯知道了,静态代码 ...

private修饰的属性可以继承,只不过不能被调用。
这个知识点没什么用感觉,但是是可以继承的。
回复 使用道具 举报
疲劳的小马 发表于 2014-2-23 21:18
看了这么多回复,我自己都晕了。。什么这么多乱七八糟的。。静态代码块也好,构造代码块也好,那都是类的初 ...

private继承但是不可调用。
同理,不同包的默认属性和私有属性一样继承,只不过是不可调用。
在一个子类被创建的时候,首先会在内存中创建一个父类对象,然后在父类对象外部放上子类独有的属性,两者合起来形成一个子类的对象。
个人见解。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马