七、
重载与覆写的区别:
|
重载
|
覆写
|
概念
|
方法名称相同,参数的类型或个数不同
|
方法名称、访问权限[最好]、参数的类型个数一样
|
范围
|
是发生在同一个类
|
是发生在继承关系中,子类实现的
|
Super 关键字:在子类对象实例化时在子类的构造方法中,默认隐含了一个super()的代码。调用父类中的构造方法。
子类调用父类中的方法
1、 调用父类中的特定构造方法 super()
2、 调用父类中被覆盖的方法 super.方法()
class A
{
private String name;
private int age;
public A()
{
System.out.println("1、A ---> public A(){}");
}
public A(String name)
{
System.out.println("2、A ---> public A(String name){}");
}
public A(String name ,int age)
{
System.out.println("3、A ---> public A(String name,int age){}");
}
}
class B extends A
{
private String school;
public B(String name ,int age,String school)
{
super(name,age);
}
}
public class javaoo02
{
public static void main(String srgs[])
{
new B("xtadg", 30, "www.mldn.cn");
}
}
A ---> public A(String name,int age){}
Super
关键字:在子类对象实例化时在子类的构造方法中,默认隐含了一个
super()
的代码。调用父类中的构造方法。
子类调用父类中的方法
3、
调用父类中的特定构造方法
super()
4、
调用父类中被覆盖的方法
super.
方法
()
class A
{
public String say()
{
return "hello ";
}
}
class B extends A
{
public String say()
{
return super.say() + " world!!";
//return say() + “world”; 一直调用本类的方法,死循环。
}
}
public class javaoo02
{
public static void main(String args[])
{
System.out.println(new B().say());
}
}
hello world!!
class A
{
String name = "LXH";
public A()
{
System.out.println("XXXX");
}
public String say()
{
return "hello";
}
}
class B extends A
{
String name = "MLDN";
public B()
{
super();
System.out.println("HELLO");
}
public String say()
{
return super.say() + " world!! ---> " + super.name;
}
}
public class javaoo02
{
public static void main(String args[])
{
System.out.println(new B().say());
}
}
XXXX
HELLO
hello world!! ---> LXH
class Person
{
//先设计好一个完整的Perosn类
private String name;
private int age;
public Person(String name, int age)
{
this.setName(name);
this.setAge(age);
}
public void setName(String name)
{
this.name = name;
}
public void setAge(int age)
{
this.age = age;
}
public String getName()
{
return this.name;
}
public int getAge()
{
return this.age;
}
public String say()
{
return "姓名:" + this.name + ",年龄:" + this.age;
}
}
class Student extends Person
{
private String school;
public Student(String name, int age, String school)
{
super(name , age);
this.setSchool(school);
}
public void setSchool(String school)
{
this.school = school;
}
public String getSchool()
{
return this.school;
}
public String say()
{
return super.say() + ",学校:" + this.school;
}
}
public class javaoo02
{
public static void main(String args[])
{
Student s = new Student ("张三", 30 , "MLDN 人才培养基地");
System.out.println(s.say());
}
}
姓名:张三
,
年龄:
30,
学校:
MLDN
人才培养基地
//为了代码的简单,程序暂时不封装
class Employee
{
String name;
int age;
float salary;
//
表示一个雇员有一个领导
Manager mgr = null;
public Employee (String name, int age, float salary)
{
this.name = name;
this.age = age;
this.salary = salary;
}
public String say()
{
return "姓名;" + this.name + ",年龄:" + this.age + ",薪水:" + this.salary;
}
}
class Manager extends Employee
{
//管理人员数
int number;
public Manager(String name,int age,float salary ,int number)
{
super(name,age,salary);
this.number = number;
}
public String say()
{
return super.say() + ",管理人员数;" + this.number;
}
}
public class javaoo02
{
public static void main(String args[])
{
Employee e = new Employee("李四",20,15000);
Manager m = new Manager("张三",30,3000,5);
//m
是
e
的领导
e.mgr = m;
System.out.println("雇员信息:" + e.say());
//
为了防止
mgr
的内容为空,如果为空则肯定出现
nullPointerException
if (e.mgr != null)
{
System.out.println("
经理信息:
" + e.mgr.say());
}
}
}
//雇员信息:姓名;李四,年龄:20,薪水:15000.0
//经理信息:姓名;张三,年龄:30,薪水:3000.0,管理人员数;5
可以通过super(),里面的根据传入参数去调用父类中指定的构造方法,默认情况下调用的是无参构造方法。
通过super().方法,可以由子类去调用父类中指定的方法(方法被覆写了)
属性也可以被覆写
This 和 super 的区别:
This 和 super在使用上很相似,都可以调用其他方法,其他属性,构造方法[都必须在首行]
This 和 super 调用的构造的操作能同时在一个构造方法中出现吗?this调用构造肯定要留有一个出口
|
This
|
Super
|
使用范围
|
调用本类中的方法或属性
|
从子类中调用父类的方法或属性
|
调用属性
|
This .本类属性,从本类中查找
|
Super .父类属性,从父类中查找
|
调用方法
|
This.本类方法(),从本类中查找
|
Super.父类方法(),从父类中查找
|
调用构造
|
放在本类构造方法的首行,构造方法需要有一个出口(至少有一个构造方法没有用this调用)
|
放在子类构造方法之中,默认情况下子类隐藏一个super(),去调用父类中默认的构造方法
|
特殊点
|
This表示当前对象
|
无
|