黑马程序员技术交流社区

标题: 子类可以继承父类的哪些属性? [打印本页]

作者: 徐青松    时间: 2014-2-23 17:49
标题: 子类可以继承父类的哪些属性?
如题,假设A类中有静态方法和静态属性、普通方法和普通属性以及代码块、构造方法等。请问B类是A类的子类时,他会继承A类的哪些东西,静态的都可以继承吗?构造方法算是继承了吗?A类的普通变量会被B类继承吗?各种···求大神指点!
作者: 乔青山    时间: 2014-2-23 18:29
除构造器外其他的所有都继承
作者: sgs_gzy    时间: 2014-2-23 18:34
子类可以继承父类的所有属性和方法,构造方法要用关键字super([参数])调用。
另外,当父类的方法或属性被声明为private时,子类是不可以继承的。
作者: xiaochen33520    时间: 2014-2-23 18:35
除了静态代码块,局部代码块,构造代码块不能够继承之外,其他的所有成员方法 成员变量都可以被继承。
作者: osully    时间: 2014-2-23 18:47
静态代码块 是当所在类加载时只运行一次,不能被继承
构造函数 是被调用 不是被继承

作者: 不似侽紸角.    时间: 2014-2-23 19:20
静态属性和静态方法也是会继承的,但继承的静态方法不能被重写,构造方法在继承中,会访问父类的空构造函数,要想访问父类中指定的构造函数用super。普通变量会被继承。
作者: 徐青松    时间: 2014-2-23 19:21
sgs_gzy 发表于 2014-2-23 18:34
子类可以继承父类的所有属性和方法,构造方法要用关键字super([参数])调用。
另外,当父类的方法或属性被声 ...

构造方法也是可以继承的?
作者: 徐青松    时间: 2014-2-23 19:33
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有此静态方法,那就是静态方法被继承了。请验证,请解释
作者: 徐青松    时间: 2014-2-23 19:34
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有此静态方法,那就是静态方法被继承了。请验证,请解释
作者: 徐青松    时间: 2014-2-23 19:35
sgs_gzy 发表于 2014-2-23 18:34
子类可以继承父类的所有属性和方法,构造方法要用关键字super([参数])调用。
另外,当父类的方法或属性被声 ...

比较同意你的观点!呵呵
作者: osully    时间: 2014-2-23 19:40
徐青松 发表于 2014-2-23 19:34
哦,构造方法不能被继承能懂,但是
public class DuoTaiTest {
        public static void main(String  ...

静态代码块是指
static
{
}
静态函数 也是函数 可以继承
作者: 徐青松    时间: 2014-2-23 19:44
乔青山 发表于 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方法,这样的方式属于重载吗?!求解
作者: 徐青松    时间: 2014-2-23 19:47
osully 发表于 2014-2-23 19:40
静态代码块是指
static
{

“静态代码块 是当所在类加载时只运行一次,不能被继承。”把你的回答看错了。sorry,嗯知道了,静态代码块和构造函数是不能被继承的,还有private修饰的都不能被继承。
作者: osully    时间: 2014-2-23 19:53
徐青松 发表于 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


作者: 徐青松    时间: 2014-2-23 20:06
osully 发表于 2014-2-23 19:53
特地验证了一下
静态代码块 也被继承了!!

嗦嘎。实践出真知呀,我也在验证中呢。哈哈。没事还是得多敲敲代码呀
作者: 疲劳的小马    时间: 2014-2-23 21:03
osully 发表于 2014-2-23 19:53
特地验证了一下
静态代码块 也被继承了!!

这个不应该算是继承吧,这个算是类的初始化过程,子类继承父类,肯定要先初始化静态代码区的,如果子类也有静态代码块,就是先执行父类的静态代码块,然后子类,然后父类的构造代码块,构造函数,然后子类的
作者: 疲劳的小马    时间: 2014-2-23 21:18
看了这么多回复,我自己都晕了。。什么这么多乱七八糟的。。静态代码块也好,构造代码块也好,那都是类的初始化过程!子类继承父类,初始化时,肯定要先初始化静态代码区的,如果A继承B,AB都有静态代码块,也有构造代码块,那么初始化的顺序肯定是:先执行B的静态代码块,然后A的静态代码块,然后B的构造代码块,构造函数,然后A的构造代码块,构造函数。这些都是初始化过程好吧,不叫继承方法!那么子类继承父类究竟继承了哪些东西呢?
子类和父类在同一个包中时,子类可以继承父类的除private属性的所有方法和成员变量(不包括构造函数方法,但是能够用super()调用),当子类与父类不在同一个包中时,子类只能继承父类的protected和public属性的成员变量和方法
作者: 乔青山    时间: 2014-2-23 21:56
徐青松 发表于 2014-2-23 19:44
那子类中能重载父类的中静态或非静态方法吗?比如:
public class DuoTaiTest {
        public static void mai ...

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

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

private继承但是不可调用。
同理,不同包的默认属性和私有属性一样继承,只不过是不可调用。
在一个子类被创建的时候,首先会在内存中创建一个父类对象,然后在父类对象外部放上子类独有的属性,两者合起来形成一个子类的对象。
个人见解。

作者: 徐青松    时间: 2014-2-23 22:09
乔青山 发表于 2014-2-23 21:58
private修饰的属性可以继承,只不过不能被调用。
这个知识点没什么用感觉,但是是可以继承的。 ...

都不能被调用,那怎么确定能不能被继承呀?!
作者: 乔青山    时间: 2014-2-23 22:11
疲劳的小马 发表于 2014-2-23 21:18
看了这么多回复,我自己都晕了。。什么这么多乱七八糟的。。静态代码块也好,构造代码块也好,那都是类的初 ...

补充一句,为什么构造器不继承,因为继承的时候创建父类对象,创建对象用到构造器,所以对象中不包含构造器,所以构造器不集成。同理代码块和静态代码块也不继承。
作者: 乔青山    时间: 2014-2-23 22:12
徐青松 发表于 2014-2-23 22:09
都不能被调用,那怎么确定能不能被继承呀?!

内存分析
作者: 乔青山    时间: 2014-2-23 22:20
徐青松 发表于 2014-2-23 22:09
都不能被调用,那怎么确定能不能被继承呀?!

最后加一嘴
从继承流程上还有内存分析上想,除了构造器和代码块子类是继承父类的所以其他属性的。但是私有的(不同包中还包括默认default)是不可调用的,所以说这个到底是属于继承来了,还是没有继承来,只是占一点空间,说不好。
另外感觉这个东西没用。知道能不能调用就行。
作者: 疲劳的小马    时间: 2014-2-24 01:47
乔青山 发表于 2014-2-23 22:11
补充一句,为什么构造器不继承,因为继承的时候创建父类对象,创建对象用到构造器,所以对象中不包含构造 ...

咕嘎-_-!。。好吧,学习了,争取做同一期的同学哦\(^o^)/




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2