当我们实例化son s =new Son();其中son()先找到子类无参构造,但是构造方法第一行是super(),所以运行父类的无参构造。
总结:子类初始化前,一定要完成父类的初始化。
注意:每个构造方法的第一句默认为super()(Object类没有父类)
1.父类没有无参构造,而子类有无参构造?
super会报错,因为找不到父类的无参构造
让super找父类的有参构造,并把参数值传递给super()中,让值能传到父类的有参构造。
封装:把共有的属性和行为写出来 Person: 姓名 年龄 get/set 构造方法 吃饭
老师区继承person 老师写出自己的讲课
学生继承person 学生写出自己的学习
package com.demo1.cn;
public class Animal {
private String name;
private int age;
public Animal() {
}
public Animal(String name,int age) {
this.name=name;
this.age=age;
}
public void show() {
System.out.println(name+"吃饭");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
package com.demo1.cn;
public class Student extends Animal {
public Student() {
System.out.println("无参构造");
}
public Student(String name,int age) {
super(name,age);
System.out.println("有参构造");
}
public void show() {
super.show();;
System.out.println(getName()+","+getAge()+"岁正在学习");
}
}
package com.demo1.cn;
public class Teacher extends Animal{
public Teacher() {
System.out.println("无参构造");
}
public void show() {
super.show();
System.out.println(getName()+","+getAge()+"岁正在讲课");
}
}
package com.demo1.cn;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Student s=new Student("学生",16);
s.show();
System.out.println("------------");
Teacher c=new Teacher();
c.setName("老师");
c.setAge(25);
c.show();
}
}
结果:
1.看程序写结果
class Fu{
public int num=10;
public Fu(){
system.out.println("fu")
}
}
class Zi extends Fu{
public int num=20;
public Zi(){
super();
system.out.println("zi");
}
public void show(){
int num=30;
system.out.println(num);
system.out.println(this.num);
system.out.println(super.num);
}
}
class Test{
public static void main(String[] args){
Zi z=new Zi();
z.show();
}
}
结果
2.class Fu{
static{
System.out.println("静态代码块Fu");
}
{
System.out.println("构造代码块Fu");
}
public Fu(){
System.out.println("构造方法Fu");
}
}
class Zi extends Fu(){
static{
System.out.println("静态代码块zi");
}
{
System.out.println("构造代码块zi");
}
public Zi(){
System.out.println("构造方法zi");
}
}
Zi z=new Zi();请指向结果
解析
返回值:方法重载返回值类型可以改变,方法重写返回值类型可以是父类,也可以是子类
方法重载:本类在出现了方法名一样,参数不同(位置,个数,类型)与返回值无关
方法重写:子类出现和父类方法声明一样的方法,与返回值有关,范胡子必须一致。
细化 | 方法重写 | 方法重载 |
方法名 | 相同 | 相同 |
参数列表 | 相同 | 不同(位置个数,类型) |
返回值 | 相同 | 无关 |
方法重写既可以继承原来的功能,也可以添加新的功能,实现升级过程。
子类出现了和父类一模一样的方法(返回值类型可以是子类也可以是父类)
当子类需要父类的功能,而功能主体子类有自己特有的内容,可以重写父类的方法,既沿袭了弗雷德功能,有定义了子类特有的内容。
(1)父类中私有的方法不能被重写。
因为父类私有方法子类无法继承。
(2)子类重写父类方法时,访问权限不能低于父类。
最好一致
(3)父类是静态方法时,子类重写也必须是静态方法
算不上重写,但是现象是重写效果。
(4)子类重写父类方法时,最好写的一模一样
特点(用final定义,代表着不能被改变)
修饰类:类不能被继承
修饰变量:变量就成了常量,只能呗赋值一次。
修饰方法:方法将不能被重写
final关键字,修饰局部变量
基本类型:值不能被改变
引用类型:是地址不能被改变,对象中的属性可以被改变。