1、父类私有的成员不能被继承
2、父类的构造函数不能被继承
3、创建子类对象的时候会默认先调用父类的无参的构造函数。
(为什么要调用父类的构造方法?答案:初始化从父类继承下去的属性的!)
注意:调用和继承直接没有关系
3 创建子类对象的时候会默认先调用父类的无参的构造函数。(为什么要调用父类的构造方法?答案:初始化从父类继承下去的属性的!)
下面例子中,子类从父类继承name的属性,调用父类的构造方法就是为了初始化name属性的
class Person
{
String name;
private int age;
public Person(String name)
{
this.name=name;
}
public Person()
{
System.out.println("person类的构造方法被调用了");
}
public void eat()
{
System.out.println("在吃饭");
}
}
class Student extends Person
{
int num;
public Student()
{
System.out.println("Student类的构造方法被调用了");
}
public void study()
{
System.out.println(name+"在学习");
}
}
class Demo1
{
public static void main(String[] args)
{
Student s=new Student();
}
}
person类的构造方法被调用了
Student类的构造方法被调用了
4.案例分析:
(1)
父类int x=10,子类int x=20;当创建对象 Zi z=new Zi("小头儿子");的时候,z内存地址所对应的内存内有两份数据,x=10和x=20,一份自身的一份从父类继承下来的 如下System.out.println("x2="+super.x);可以打印从父类继承的x
(2)创建子类对象的时候会默认先调用父类的无参的构造函数。这时候从父类继承下来的name属性初始化为空。要想初始化name不为空,就要调用父类有参的构造函数,即 public Fu(String name)
{
this.name=name;
System.out.println("父类有参的构造方法");
}
这就需要在子类构造函数中加一个 super(ame)
class Fu
{
int x=10;
String name;
public Fu(String name)
{
this.name=name;
System.out.println("父类有参的构造方法");
}
public Fu()
{
System.out.println("弗雷无参的构造方法");
}
}
class Zi extends Fu
{
int x=20;
public Zi(String name)
{
super(name);//zhiding调用父类一个参数的构造函数 ,若没有这句话,就会调用父类无参的构造函数
System.out.println("子类的构造方法");
}
public void print()
{
System.out.println("x1="+x);
System.out.println("x2="+super.x);
}
}
class Demo1
{
public static void main(String[] args)
{
Zi z=new Zi("小头儿子"); //
////在对象里面是存在两份x的;z地址所指向的对象的内存内有两份x(一份自身的,一份是从父类继承下来的)!
System.out.println("name"+z.name);//z.name初始化时null 若想对象一创建就初始化成一个非null的名字,需要调用父类不带参的构造方法(而子类一创建对象就默认调用父类带参的构造方法)
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |