Java面向对象4
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
开发工具与关键技术:MyEclipse 10 Java
作者:陈剑波
撰写时间:2019年05月19日
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1、方法的重写(Override)
重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改 变。
重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。
方法的重写规则:
- 参数列表必须完全与被重写方法的相同;
- 返回类型必须完全与被重写方法的返回类型相同;
- 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方 法被声明为public,那么在子类中重写该方法就不能声明为protected。
- 父类的成员方法只能被它的子类重写。
- 声明为final的方法不能被重写。
- 声明为static的方法不能被重写,但是能够被再次声明。
- 子类和父类在同一个包中,那么子类可以重写父类所有除了声明为private和final 的方法。
- 子类和父类不在同一个包中,那么子类只能够重写父类的声明为public和 protected的非final方法。
- 重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是, 重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性 异常,反之则可以。
- 构造方法不能被重写。
- 如果不能继承一个方法,则不能重写这个方法。
示例代码:
public class Person2 { |
private int age; |
private String name; |
|
public int getAge() { |
return age; |
} |
|
public void setAge(int age) { |
this.age = age; |
} |
|
public String getName() { |
return name; |
} |
|
public void setName(String name) { |
this.name = name; |
} |
|
public String getInfo() {//方法 |
return "姓名:" + name + ",年龄: " + age; |
} |
|
}
|
public class Student extends Person2 { |
private String school; |
|
public String getSchool() { |
return school; |
} |
|
public void setSchool(String school) { |
this.school = school; |
} |
|
public String getInfo() {//重写父类的方法 (override) |
return "姓名:" + getName() + ",年龄:" + getAge() + ",学校:" + school; |
} |
}
|
public class Test3 { |
public static void main(String[] args) { |
Person2 person = new Person2(); |
person.setAge(22); |
person.setName("普罗利"); |
System.out.println(person.getInfo()); |
|
Student student = new Student(); |
student.setAge(23); |
student.setName("卡洛特"); |
student.setSchool("哈佛大学"); |
System.out.println(student.getInfo()); |
} |
}
|
运行结果:
姓名:普罗利,年龄: 22 |
姓名:卡洛特,年龄:23,学校:哈佛大学 |
2、super 与 this 关键字
super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对 象的父类。
this关键字:指向自己的引用。
示例代码:
public class Bird { |
int weight=1; |
String name="小鸟"; |
public void fly() { |
System.out.println("我会飞,你会吗?"); |
} |
}
|
public class Ostrich extends Bird { |
int weight = 20; |
String name = "鸵鸟"; |
public void fly() { |
System.out.println("会飞了不起啊!!"); |
} |
|
public void superThisDemo() {// super this 关键字 |
//this,调用自身的成员变量 |
System.out.println("体重:"+this.weight + ",姓名:" + this.name); |
//this,调用自身的方法 |
this.fly(); |
|
//super,子类中调用父类的成员变量 |
System.out.println("体重:"+super.weight + ",姓名:" +super.name); |
//super,子类中调用父类的方法 |
super.fly(); |
} |
}
|
public class Test3 { |
public static void main(String[] args) { |
Ostrich ostrich=new Ostrich(); |
ostrich.fly(); |
ostrich.superThisDemo(); |
} |
}
|
运行结果:
会飞了不起啊!! |
体重:20,姓名:鸵鸟 |
会飞了不起啊!! |
体重:1,姓名:小鸟 |
我会飞,你会吗? |
|
3、final修饰符
final可以用来修饰变量(包括类属性、对象属性、局部变量和形参)、方法(包括类方法和对象方法)和类。
- fianl修饰类:修饰的类不能被继承。
- fianl修饰方法:修饰的方法不能被重写。
- fianl修饰变量:一旦定义了final变量并在首次为其显示初始化后,final修饰的变量值不可被改变。
示例代码:
/** |
* @author KO.ZERO final修饰数据,包括成员变量和局部变量,该变量只能被赋值一次且它的值无法 被改变。 |
* 对于成员变量来说,我们必须在声明时、构造方法或者初始化块中对它赋值; |
* |
*/ |
public class FinalMemberVariables {// final修饰的实例变量 |
// 声明实例变量并赋初始值 |
final int age = 22; |
// 在初始化块中赋初始值 |
final int age1; |
{ |
age1 = 22; |
} |
// 在构造器中赋初始值 |
final int age2; |
|
public FinalMemberVariables() { |
age2 = 22; |
} |
|
// final修饰类变量 |
// 声明该类变量时指定初始值或在静态初始化块中指定初始值 |
final static int age3 = 22; |
final static int age4; |
static { |
age4 = 22; |
} |
} |
/** |
* @author KO.ZERO |
*final修饰局部变量,表示在变量的生存期中它的值不能被改变 |
*/ |
public class FinalLocalVariable {//fianl修饰的局部变量 |
public static void main(String[] args) { |
//在定义变量时指定初始值就不能在后面的代码中为变量赋值了 |
final String name = "剑魔"; |
//在定义变量时不指定初始值可以在后面的代码中为变量赋值一次 |
final String name2; |
name2 = "剑神"; |
} |
public void test(final int age){ |
//不能对final修饰的形参赋值 |
// age=22; |
} |
} |