一(访问权限修饰符)
在Java中,针对类,成员方法和属性提供了4种访问级别,访问级别由大到小分别为:public(共有的)---protected(受保护的)---default(默认的)---private(私有的)。
public:公共访问级别,如果一个类或者类的成员被public访问控制符修饰,那么这个类或者类的成员能被所有的类访问,不管访问类与被访问类是否在同一个包中。
protected:子类访问级别,如果一个类的成员被protected访问控制符修饰,那么这个成员既能被同一包下的其他类访问,也能被不同包下该类的子类访问。
default:包访问级别,如果一个类或者类的成员不适用任何访问控制符修饰,则称它为默认访问控制级别,这个类或类的成员只能被本包中的其他类访问。
private:当前类访问级别,如果类的成员被private访问控制符修饰,则这个成员只能被该类的其他成员访问,其他类无法访问。类的良好封装就是通过private关键字来实现的。
访问范围 | public | protected | default | private |
同一个类 | √ | √ | √ | √ |
同一个包 | √ | √ | √ | × |
不同包的子类 | √ | √ | × | × |
不同包的非子类 | √ | × | × | × |
在实际的开发过程中,private和public用得相对多一点。
二(重写)
当子类出现了和父类一模一样的方法声明(方法名和参数列表必须是一样的),就是重写。
覆盖(重写):@0verride(重写的标志),会帮你检查是否符合重写的语法格式 ,标志着这个方法是重写的父类的方法,可写可不写 。
访问修饰词:子类方法的访问权限大于等于父类方法的访问权限
例如:
父类方法访问权限是public,那么子类若想重写该方法必须用public
父类方法访问权限是protected,那么子类若想重写该方法必须用public/protected
父类方法访问权限是默认的,那么子类若想重写该方法必须用public/protected/默认
返回值:
void:若父类方法的返回值是void,则子类重写时,子类方法返回值必须也是void
基本类型:若父类方法的返回值是基本类型,则子类重写时,子类方法返回值必须也是该基 本类型
引用类型:若父类方法的返回值是引用类型,则子类重写时,子类方法返回值可以是该引用类 型也可以是该引用类型的子类
结论:子类方法的返回值可以是父类方法的返回值的子类
方法名:子类与父类相同
参数列表(参数):子类与父类相同
方法体:可以相同,也可不同
重写的应用场景:
当子类需要父类的功能,而且功能主体子类又持有自己内容时,可以重写父类的方法
这样即沿袭父类的功能,又定义子类特有的内容
重写和重载的区别:
方法的重载
1.方法名相同参数列表不同
2.重载对访问权限没要求
3.重载是发生在同一个类上的关系
4.重载对返回值类型没要求
方法的重写:
1.方法名和参数列表相同
2.方法重写时:子类方法的访问权限必须大于或等于父类的访问权限
访问权限由小到大:private < 默认
4.方法重写时:子类方法的返回值类型,要么和父类的相同,要么是父类返回值类 型的子类
方法的重写作用:
1.在父类中定义方法,子类里面会继承此方法。(保底方法)
在父类中添加各种子类共同的行为方式
2.方法重写之后,可以在父类的方法基础上做扩展。
方法的重写什么时候用:当子类的方法,需要在父类的方法基础上进一步扩展时,可以重写父类 的方法
方法的重载什么时候用: 当完成某件事情可以有不同的方式时,可以将这些不同的方式定义成重 载的方法。
三(多态)
多态的含义:在java中,多态是指不同类的对象在调用同一个方法时所呈现的多种不同行为。通过多态,消除了类之间的耦合(耦合大概意思就是,若父类的属性一旦改变,所有子类的属性都会跟着改变.) 关系,大大提高了程序的可扩展性和可维护性。
多态需要满足的前提条件:
1.要有继承或者实现(接口)关系
2.要有方法的重写
3.要有父类接收子类对象(父类引用指向子类对象)
package day10;
/*
多态需要满足的前提条件
1.要有继承或者实现(接口)关系
2.要有方法的重写
3.要有父类接收子类对象
*/
public class Demo1 {
public static void main(String[] args) {
// 3.要有父类接收子类对象(多态的表达形式:向上造型)
Person p1=new Teacher();//父类引用指向子类对象
/*
通过p1可以调用什么,看p1前面的类型 p1.什么看Person有什么
当方法发生重写,p1调用重写方法时,看new的对象 p1.重写方法()看后面new 类型是什么就调用该子类重写方法
*/
//p1不能访问子类特有的方法,(装成父类,所以只能用父类中的属性和行为)
//p1.teaching()不能调用子类特有的方法
p1.name="仓#null";
p1.sleep();
//若想要调用Teacher特有的,则按照下列写法
// Teacher t1=new Teacher();//子类引用指向子类对象
// t1.name="波多野结衣";
// t1.teaching();
}
}
class Person{
String name;
public void sleep(){
System.out.println(name+"在睡觉....");
}
}
//1.要有继承
class Teacher extends Person {
public void teaching(){
System.out.println(name+"在上课....");
}
// 2.要有方法的重写
@Override
public void sleep() {
System.out.println(name+"老师在睡觉....");
}
}
在多态的学习中,涉及将子类对象当做父类类型使用的情况,这种情况在Java的语言环境中称为“向上转型”或“向上造型”,例如下面两行代码。
Animal an1=new Cat();//将Cat类对象当做Animal类型来使用
Animal an2=new Dog();//将Dog类对象当做Animal类型来使用
将子类对象当做父类使用时不需要任何显示声明,需要注意的是,此时不能通过父类变量去调用子类特有的方法。
注意问题:当父类和子类有相同属性和方法时,调用时分别调用谁的?
口诀:属性看类型(属性看父类),方法看对象(方法看子类)。 能点出什么,看类型。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)