黑马程序员技术交流社区

标题: Java中的子类会继承父类的所有成员吗?包括私有的 和静态... [打印本页]

作者: Enhon1992    时间: 2015-6-4 12:42
标题: Java中的子类会继承父类的所有成员吗?包括私有的 和静态...
Java中的子类会继承父类的所有成员吗?包括私有的 和静态...

作者: wdd    时间: 2015-6-4 12:42
class Person //父类
{
       public Person()
        {
        }
}
class Man extends Person  //子类
{
       public Man()
        {
        }
}

类Man继承于Person类,这样一来的话,Person类称为父类(基类),Man类称为子类(导出类)。如果两个类存在继承关系,则子类会自动继承父类的方法和变量,在子类中可以调用父类的方法和变量。在java中,只允许单继承,也就是说 一个类最多只能显示地继承于一个父类。但是一个类却可以被多个类继承,也就是说一个类可以拥有多个子类。(比如说一个儿子只能有一个亲生父亲,一个父亲可以有很多个儿子)

1.子类继承父类的成员变量
  当子类继承了某个类之后,便可以使用父类中的成员变量,但是并不是完全继承父类的所有成员变量。具体的原则如下:
  1)能够继承父类的public和protected成员变量;不能够继承父类的private成员变量;
  2)对于父类的包访问权限成员变量,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承;
  3)对于子类可以继承的父类成员变量,如果在子类中出现了同名称的成员变量,则会发生隐藏现象,即子类的成员变量会屏蔽掉父类的同名成员变量。如果要在子类中访问父类中同名成员变量,需要使用super关键字来进行引用。
  2.子类继承父类的方法
  同样地,子类也并不是完全继承父类的所有方法。
  1)能够继承父类的public和protected成员方法;不能够继承父类的private成员方法;
  2)对于父类的包访问权限成员方法,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承;
  3)对于子类可以继承的父类成员方法,如果在子类中出现了同名称的成员方法,则称为覆盖,即子类的成员方法会覆盖掉父类的同名成员方法。如果要在子类中访问父类中同名成员方法,需要使用super关键字来进行引用。
作者: rexih    时间: 2015-6-4 13:13
会继承,但是私有对子类不可见,不可直接访问。
作者: 山崩地裂    时间: 2015-6-4 13:42
私有private的方法与属性不可继承,可以通过调用继承自父类中的非私有方法进行访问。
作者: 少年闰土    时间: 2015-6-4 13:47
子类对象拥有父类对象中所有的属性和方法,但是父类对象中的私有属性和方法,子类是无法访问到的,只是拥有,但不能使用
静态方法和静态变量是属于类的,所以子类可以调用父类的静态方法
作者: 2666fff    时间: 2015-6-4 17:04
子类可以调用父类除private之外的所有东西,包括构造函数,和静态。要想访问private需要通过父类中的get跟set变量方法,这个方法需要自己实现,或者用反射实现。
作者: lucien_he    时间: 2015-6-4 17:08
私有的    子类 不能用
作者: 路途遥远    时间: 2015-6-4 17:16
子类会继承父类私有的成员. 静态的成员是跟着父类存在于内存的方法区中的静态区域; 所以, 静态成员不被继承,但会被其所在的类,以及子父类所对应的对象来调用.
作者: YongBao_Summer    时间: 2015-6-4 17:26
继承是全部继承,当对于私有的并不具有访问权限,只能通过父类的公有方法进行访问。
作者: 开弓没有回头箭    时间: 2015-6-4 17:28
都继承,父类中私有的成员子类不能直接访问,要通过父类提供的公共方法才能访问
作者: Enhon1992    时间: 2015-6-4 17:47
开弓没有回头箭 发表于 2015-6-4 17:28
都继承,父类中私有的成员子类不能直接访问,要通过父类提供的公共方法才能访问 ...

私有和公共的静态成员也继承吗?
作者: 开弓没有回头箭    时间: 2015-6-4 18:16
本帖最后由 开弓没有回头箭 于 2015-6-4 18:18 编辑

静态成员也一样继承,父类私有静态成员的要通过父类名才能访问,
作者: 开弓没有回头箭    时间: 2015-6-4 18:17
Enhon1992 发表于 2015-6-4 17:47
私有和公共的静态成员也继承吗?

静态成员也一样继承,父类私有静态成员的要通过父类名才能访问,
作者: Enhon1992    时间: 2015-6-4 20:05
路途遥远 发表于 2015-6-4 17:16
子类会继承父类私有的成员. 静态的成员是跟着父类存在于内存的方法区中的静态区域; 所以, 静态成员不被继承 ...

你的意思是静态的不能被继承  怎么有人说:<继承是全部继承,当对于私有的并不具有访问权限,只能通过父类的公有方法进行访问。>  不知道哪个是对的
作者: weifuqing    时间: 2015-6-4 20:25
私有的不能继承啊,protected不就是只给子类用的吗?
作者: 开弓没有回头箭    时间: 2015-6-4 20:50
Enhon1992 发表于 2015-6-4 20:05
你的意思是静态的不能被继承  怎么有人说:  不知道哪个是对的
  1.                 public static void main(String args[])
  2.                 {
  3.                         System.out.println(aaa.i);
  4.                 }
  5.         static class bbb{
  6.                 public static int i=0;
  7.                         // TODO Auto-generated method stub
  8.         }
  9.         static class aaa extends bbb//继承了bbb类中的静态成员i
  10.         {}
复制代码

用代码说明问题,静态成员是可继承的,程序结果输出0
作者: 路途遥远    时间: 2015-6-4 21:10
Enhon1992 发表于 2015-6-4 20:05
你的意思是静态的不能被继承  怎么有人说:  不知道哪个是对的

这块是有点绕。我写代码试了一下,证明能继承
class Father{
        static int m = 1;
        static void show() {
        System.out.println("Father");
}
}

class Son extends Father {
        public void showSon() {

}
}

public class Test{
        public static void main(String[] args) {
        Son.show();
        Father.show();
}
}

运行结果:
Father
Father
作者: 路途遥远    时间: 2015-6-4 21:12
本帖最后由 路途遥远 于 2015-6-4 21:13 编辑
Enhon1992 发表于 2015-6-4 20:05
你的意思是静态的不能被继承  怎么有人说:  不知道哪个是对的

这块是有点绕。我写代码试了一下,证明能继承
  1. class Father{
  2.         static int m = 1;
  3.         static void show() {
  4.         System.out.println("Father");
  5. }
  6. }

  7. class Son extends Father {
  8.         public void showSon() {

  9. }
  10. }

  11. public class Test{
  12.         public static void main(String[] args) {
  13.         Son.show();
  14.         Father.show();
  15. }
  16. }
复制代码
运行结果:
Father
Father
作者: Enhon1992    时间: 2015-6-4 21:36
kikt 发表于 2015-6-4 21:29
私有的字段不能被继承,至于通过父类的共有方法来访问和是否是子类无关
其他的类也可以通过父类的共有方 ...

静态成员会被继承吗?
作者: q757571446    时间: 2015-6-4 22:52
private方法:子类成员能继承父类private修饰的成员,但子类成员不能方法。
  1. class PrivateDemo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 Father f = new Father();//建立父类对象
  6.                 Son s = new Son();//建立子类对象
  7.                 System.out.println(s.name);//打印子类从父类继承的成员name
  8.         }
  9. }
  10. class Father
  11. {
  12.         private String name = "张三";
  13. }
  14. class Son extends Father
  15. {
  16.         //这里继承了父类的Private成员name
  17. }
  18. /*
  19. 程序编译会出现以下结果:
  20. PrivateDemo.java:7:错误:name可以在Father中访问private
  21. 原因:子类在这里是可以继承父类的私有化成员,但一旦子类想要调用这个成员,就必须要
  22. 进入父类中,此时由于被私有化的不能被外部类访问,所以会失败。
  23. 解决方法:将private修饰符改成用protected修饰,这样子类继承后就可以访问了。
  24. */
复制代码

作者: q757571446    时间: 2015-6-4 22:57
而静态是肯定能够继承的。
  1. class StaticDemo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 Father f = new Father();//建立父类对象
  6.                 Son s = new Son();//建立子类对象
  7.                 s.getName();
  8.         }
  9. }
  10. class Father
  11. {
  12.         private String name = "张三";
  13.         public static void getName()
  14.         {
  15.                 System.out.println("这是静态函数");
  16.         }
  17. }
  18. class Son extends Father
  19. {
  20.         //这里继承了父类的Private成员name
  21.         //这里继承了父类中的getName()方法
  22. }
  23. /*
  24. 程序编译会出现以下结果:
  25. 这是静态函数

  26. */
复制代码

作者: MissMr.    时间: 2015-6-5 00:35
private和对象除外
作者: Enhon1992    时间: 2015-6-5 10:05
MissMr. 发表于 2015-6-5 00:35
private和对象除外

我看了很多的回复 有说可以也有说不可以的  我已经晕了
作者: 施洋    时间: 2015-6-5 10:50
说实话我也不太清楚,和楼主一起学习
作者: wangiuh    时间: 2015-6-5 14:49
会的,继承不是使用父类,而是定义了和父类想同的东西,只为理解而如此说的 不严密
作者: 君子无醉    时间: 2015-6-5 15:39
对于权限修饰符来说  只有private修饰的变量不能被继承,这个变量只属于定义它的那个类拥有,是私有的。而其他修饰符修饰的变量,如static  final修饰符修饰的变量,虽然有一定的特别之处,比如static修饰的变量是子类父类共享的  既可以通过父类类名调用,也可以通过子类名调用,或者通过子类 父类的对象调用,final修饰的变量可以被继承,但是这个变量就属于常量了 只能使用,不能修改(被赋值)。final修饰类的话,类不能被继承,修饰方法的话,这个类被继承后,方法不能被重写。。兄弟,我这边没有网 手机给你打的,而且给你举的例子都是流量上传,求分

IMG_20150605_152109.jpg (44.7 KB, 下载次数: 290)

IMG_20150605_152109.jpg

IMG_20150605_152149.jpg (33.63 KB, 下载次数: 298)

IMG_20150605_152149.jpg

作者: 君子无醉    时间: 2015-6-5 15:52
补充一句话 没打上,static final修饰的变量,继承后虽然有一定的特别之处,但是都是可以被继承的 也就是除了private修饰的变量,别的修饰符修饰的变量 都可以被继承!
作者: Enhon1992    时间: 2015-6-5 16:40
君子无醉 发表于 2015-6-5 15:52
补充一句话 没打上,static final修饰的变量,继承后虽然有一定的特别之处,但是都是可以被继承的 也就是除 ...

你说 被只要被private修饰的就不会被继承
  1. public class Test {

  2.         public static void main(String[] args) {
  3.                 // TODO Auto-generated method stub

  4.                 Student s=new Student();
  5.                 System.out.println(s.getName());
  6.         }

  7. }
  8. class Person
  9. {
  10.        
  11.         private String name="fdff";

  12.         public String getName() {
  13.                 return name;
  14.         }

  15.        
  16. }


  17. class Student extends Person
  18. {
  19.        
  20. }
复制代码

最后 输出  fdff  
要是没有继承name 字段 怎么可能输出 name字段的值,难道 在创建Student对象的时候 会先创建Person 对象


作者: cyd1058    时间: 2015-6-5 21:39
1.子类可以直接访问父类中的非私有的属性和行为;2.子类无法继承父类中私有的内容。
作者: Monster    时间: 2015-6-6 09:00
子类会继承父类的所有成员,包括私有的,但是不能直接使用。
作者: 胡亚辉    时间: 2015-6-6 11:32
父类的私有成员  可以通过继承自父类非私有的方法调用
作者: 小黑啊    时间: 2015-6-6 22:44
会继承,除非被private修饰
作者: lijiansheng    时间: 2015-6-7 10:12
私有的不会继承吧
作者: wqw    时间: 2015-6-7 11:04
子类对象拥有父类对象中所有的属性和方法,但是父类对象中的私有属性和方法,子类是无法访问到的,只是拥有,但不能使用
静态方法和静态变量是属于类的,所以子类可以调用父类的静态方法
作者: 路途遥远    时间: 2015-6-7 15:41
Enhon1992 发表于 2015-6-4 20:05
你的意思是静态的不能被继承  怎么有人说:  不知道哪个是对的

我理解错了.  正确的应该是  : 静态成员也会被子类继承的,父类中的私有成员不会被继承, .     子类通常都是通过,子类  父类中的构造器,以及子类构造器中的super()语句来完成父类中私有变量的赋值,通过get set 方法来使用该变量.  
作者: Enhon1992    时间: 2015-6-7 17:08
wdd 发表于 2015-6-7 14:50
class Person //父类
{
       public Person()

  1. public class Test {

  2.         public static void main(String[] args) {
  3.                 // TODO Auto-generated method stub

  4.                 Student s=new Student();
  5.                 System.out.println(s.getName());
  6.         }

  7. }
  8. class Person
  9. {
  10.         
  11.         private String name="fdff";

  12.         public String getName() {
  13.                 return name;
  14.         }

  15.         
  16. }


  17. class Student extends Person
  18. {
  19.         
  20. }
复制代码

就上面的代码而言 在调用 s.getName()方法的时候,执行到getName()方法中的 return name 这行代码的时候,会去访问 name这个字段 ,  在内存中肯定会有一块区域是来保存 name对应的数据,要是没有继承 name的话 怎么可以访问到name 的值。


fgfdgfdgfdg
作者: wdd    时间: 2015-6-7 17:44
Enhon1992 发表于 2015-6-7 17:08
就上面的代码而言 在调用 s.getName()方法的时候,执行到getName()方法中的 return name 这行代码的时 ...

你是调用了父类中的方法,没有直接使用name这个属性,私有成员是可以通过方法获取到的,只是不能直接使用,你可以试试直接使用,看看效果
作者: 邂逅流星雨    时间: 2015-6-7 19:18
子类在继承父类时,会自动拥有父类的所有成员,包括私有和静态。只是私有成员不能直接访问,需要提供公共的访问方式。
作者: Enhon1992    时间: 2015-6-7 19:27
Enhon1992 发表于 2015-6-7 17:08
就上面的代码而言 在调用 s.getName()方法的时候,执行到getName()方法中的 return name 这行代码的时 ...

你确定你的说法是正确的! 不会坑我吧 ,我准备把最佳答案给你了
作者: Enhon1992    时间: 2015-6-7 19:31
wdd 发表于 2015-6-7 17:44
你是调用了父类中的方法,没有直接使用name这个属性,私有成员是可以通过方法获取到的,只是不能直接使用 ...

你确定你的说法是正确的! 不会坑我吧 ,我准备把最佳答案给你了
作者: 程明佳    时间: 2015-6-7 20:22
除了private方法和对象不继承,其他的都能给子类继承
作者: wdd    时间: 2015-6-7 20:30
Enhon1992 发表于 2015-6-7 19:31
你确定你的说法是正确的! 不会坑我吧 ,我准备把最佳答案给你了

其实你自己试一下,就会懂了,我是这么理解的  :lol
作者: hzw@ql    时间: 2015-6-8 19:17
继承
      不管父类中的成员是public、protected、default还是private访问权限、子类都会拥有父类中的成员,也就是说,在堆内存中的子类对象里面有一个父类对象。
     拥有并不代表可以直接访问:private成员变量,子类对象无法直接访问;default成员变量,子父类同一个包,可以直接访问,不在同一个包是不能直接访问的。其他访问权限都是可以使用子类对象直接访问父类成员。
     父类中的成员变量是静态的、还是非静态的,子类都会拥有父类中的这些成员变量。只要没有被private修饰都是可以直接调用的。
  1. class Demo{
  2.    public  static void main(String[] args){
  3.        System.out.println(Son.name);
  4.        Son.show();
  5.    }
  6. }

  7. class Father{
  8.      static String name="hxf";
  9.      static void show(){
  10.       System.out.println("父类:"+name);
  11.       }
  12. }

  13. class Son extends Father{
  14. }
复制代码

输出结果:
hxf
父类:hxf
作者: 逸舟213    时间: 2015-6-8 22:52
讨论的很详细,已拜读:victory:!
作者: kuangzeyu    时间: 2015-6-9 00:54
静态的成员是能被继承的,若是私有的就不能了
作者: 王超群    时间: 2015-6-9 22:34
不会继承私有的成员因为子类根本看不到父类的私有,除非对私有的成员定义访问方式才可被访问
作者: 空白心    时间: 2015-6-11 00:28
(此生即为“无限剑制”。) この体は”无限の剣”で出来ていた 此生,定为无限之剑所成
作者: 莱克神    时间: 2015-7-23 22:30
刚学到这,不明觉厉
作者: java摸索者    时间: 2017-2-4 21:14
少年闰土 发表于 2015-6-4 13:47
子类对象拥有父类对象中所有的属性和方法,但是父类对象中的私有属性和方法,子类是无法访问到的,只是拥有 ...

刚刚试了下, 确实能继承, 否则在公有方法中子类就无法访问父类的私有变量 ,  按照马士兵说得继承原理,子类对象的内存中包含一个父类对象并占用部分父类对象内存,  子类对象一旦new出来后内部的父类对象也会被创建,只是此父类对象并不是真实存在的, 本身作为子类对象的一部分存在,  无法独立存活.(说的感觉像内部类似的....).




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