1. 4个访问修饰符的访问权限
访问权限 类 包 子类 其他包
public √ √ √ √
protected √ √ √ ×
default √ √ × ×
private √ × × ×
2. 重载与重写
重载:方法重载是指在同一个类中,多个方法的方法名相同,但是参数列表不同(参数列表不同指的是参数个数、参数类型或者参数的顺序不同),返回值类型可以相同也可以不相同(但是不能通过返回值判断重载!)。
例子:
Class Person {
{String name;
int age;
void print(){
System.out.println("姓名:" +name+"年龄:" +age);
}
void print(String a,int b){
System.out.println("姓名:" +a+"年龄:"+b);
void print(String a,int b,intC){
System.out.println("姓名:"+a+"年龄:" +b+"ID号:" +c);
}
void print(String a,int b,doubleC){
System.out.println("姓名:"+a+"年龄:" +b+"ID号:"+c);
}
}
用时,Java虚拟机就会根据不同的参数列表来选择合适的方法执行。
重写:在子类中可以根据需要对从父类中继承来的方法进行改造重写方法,在程序执行时,子类的方法将覆盖父类的方法。方法重写必须和被重写的方法具有相同的方法名、参数列表和返回值类型。重写方法不能使用比被重写方法更严格的访问权限。如果要在子类中调用父类被覆盖的方法使用super().父类中方法。
例子:Person p1=new Person();
p1.getInfo();
//调用Person类的getInfo()方法
Student s1=new Student();
s1.getInfo();
//调用Student类的getInfo()方法
这是一种“多态性”:同名的方法,用不同的对象来区分调用的是哪一个方法。
3 多态性
多态性在Java中有两种体现
(1)方法的重载(overload)和重写(overwrite)
(2)对象的多态性(可以直接应用在抽象类和接口上)
对象的多态性是什么?
一个对象多种形态;在Java中,子类的对象可以替代父类的对象使用
例子:Person student = new Student(); //Student继承自Person,Person是一个类
ItemService itemService = new ItemServiceImpl();//ItemServiceImpl实现ItemService这个接口
多态的作用
(1)应用程序不必为每一个派生类编写功能调用,只需要对抽象基类进行处理即可。大大提高程序的可复用性。
(2)派生类的功能可以被基类的方法或引用变量所调用,这叫向后兼容,可以提高可扩充性和可维护性。
4 final 关键字
final修饰的类不能被继承。提高安全性,提高程序的可读性。
比如:String类、System类、StringBuffer类
final修饰的方法不能被子类重写。
比如:Object类中的getClass()。
final修饰的属性为常量。一旦初始化后,不可再被赋值。对于类类型的变量,该变量不可以被赋值,但其中的属性可以改变。习惯上,常量用大写字符表示。
final标记的成员变量必须在声明的同时或在每个构造方法中或代码块中显式赋值,然后才能使用。比如:final double PI=3.14;
若变量用static final修饰:全局常量。比如:Math 类的PI,public static final double PI = 3.14159265358979323846;
5 问题
1 项目结构如下
package1和package2中Student类都继承自Person,person中有一个protected修饰的方法study(),在package1和package2中的Student类中能否访问study()方法?能。StuDemo中创建Student类对象student能访问study()方法吗?不能。
2 老师上午讲的Animal、Cat、Dog例子
Cat类新加一个方法如下:
public void eat(){
System.out.println("cat eat");
}
那么在测试类中
Animal animal = new Cat();
animal.shout();
animal.eat();
animal.shout();这条语句输出什么? miao~
animal.eat();这条语句输出什么?报错。原因:当把子类对象赋给父类对象,调用的方法必须是父类存在的方法,但是如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法。
3 final修饰的属性为常量。一旦初始化后,不可再被赋值。对于类类型的变量,该变量不可以被赋值,但其中的属性可以改变。
4 重写与重载的区别?
(1) 重载是指在同一个类中,而重写是在子类中,要有继承关系。
(2) 重载的多个方法的方法名相同,但是参数列表不同。方法重写必须和被重写的方法具有相同的方法名、参数列表和返回值类型。
(3) 重写方法不能使用比被重写方法更严格的访问权限。重载没有这一个要求。