多态
多态的形式和体现
1.对象的多态性
对象的多态性:父类的引用指向子类的对象
格式:(父类类型:指子类继承的父类类型,或者实现的接口类型)
父类类型 变量名 = 子类对象;
例:
Person p = new Student();
Object o = new Person();//Object类型的变量o,指向Person类型的对象
o = new Student(); //Object类型的变量o,指向Student类型的对象
2.多态的理解
多态访问成员的特点:
1、成员变量: 编译看左,运行看左
2、成员方法: 编译看左,运行看右
3、静态成员方法: 编译看左,运行看左
多态的使用前提:① 类的继承关系 ② 方法的重写
例:
public class Pet {
private String nickname; //昵称
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public void eat(){
System.out.println(nickname + "吃东西");
}
}
public class Cat extends Pet {
//子类重写父类的方法
@Override
public void eat() {
System.out.println("猫咪" + getNickname() + "吃鱼仔");
}
//子类扩展的方法
public void catchMouse() {
System.out.println("抓老鼠");
}
}
public class Dog extends Pet {
//子类重写父类的方法
@Override
public void eat() {
System.out.println("狗子" + getNickname() + "啃骨头");
}
//子类扩展的方法
public void watchHouse() {
System.out.println("看家");
}
}
3.多态的好处和弊端
好处:变量引用的子类对象不同,执行的方法就不同,实现动态绑定。代码编写更灵活、功能更强大,可维护性和扩展性更好了。
弊端:一个引用类型变量如果声明为父类的类型,但实际引用的是子类对象,那么该变量就不能再访问子类中添加的属性和方法。
关键字:abstract
1.语法格式
- 抽象类:被abstract修饰的类。
- 抽象方法:被abstract修饰没有方法体的方法。
例:
抽象类
[权限修饰符] abstract class 类名{
}
[权限修饰符] abstract class 类名 extends 父类{
}
抽象方法
[其他修饰符] abstract 返回值类型 方法名([形参列表]);
注意:抽象方法没有方法体
2.使用说明
- 抽象类不能创建对象,如果创建,编译无法通过而报错。只能创建其非抽象子类的对象。
抽象类是用来被继承的,抽象类的子类必须重写父类的抽象方法,并提供方法体。若没有重写全部的抽象方法,仍为抽象类。
- 抽象类中,也有构造方法,是供子类创建对象时,初始化父类成员变量使用的。
- 抽象类的子类,必须重写抽象父类中所有的抽象方法,否则,编译无法通过而报错。除非该子类也是抽象类。
注意:不能用abstract修饰变量、代码块、构造器;
不能用abstract修饰私有方法、静态方法、final的方法、final的类。
接口interface
1.概述
interface主要是为了提供一个类的扩展功能,可以被看成一个特殊的类
2.特点
- 成员变量必须是被final修饰的,默认会添加public static final的修饰符
- 成员方法在jdk1.8之前必须是抽象方法,默认会添加public abstrct修饰符
3.接口声明的格式
[修饰符] interface 接口名{
//接口的成员列表:
// 公共的静态常量
// 公共的抽象方法
// 公共的默认方法
// 公共的静态方法
}
4.接口的使用规则
- 接口不能直接创建对象,但是可以通过接口名直接调用接口的静态方法和静态常量。
例:
public class TestUSB {
public static void main(String[] args) {
//通过“接口名.”调用接口的静态方法 (JDK8.0才能开始使用)
USB.show();
//通过“接口名.”直接使用接口的静态常量
System.out.println(USB.MAX_SPEED);
}
- 接口不能创建对象,但是可以被类实现(implements ,类似于被继承)。
【修饰符】 class 实现类 implements 接口{
// 重写接口中抽象方法【必须】,如果实现类是抽象类,那么可以不重写
// 重写接口中默认方法【可选】
}
【修饰符】 class 实现类 extends 父类 implements 接口{
// 重写接口中抽象方法【必须】,如果实现类是抽象类,那么可以不重写
// 重写接口中默认方法【可选】
}
- 接口中的静态方法不能被继承也不能被重写
5.接口的多实现
在继承体系中,一个类只能继承一个父类。而对于接口而言,一个类是可以实现多个接口的,这叫做接口的多实现。并且,一个类能继承一个父类,同时实现多个接口。
实现格式:
【修饰符】 class 实现类 implements 接口1,接口2,接口3。。。{
// 重写接口中所有抽象方法【必须】,当然如果实现类是抽象类,那么可以不重写
// 重写接口中默认方法【可选】
}
【修饰符】 class 实现类 extends 父类 implements 接口1,接口2,接口3。。。{
// 重写接口中所有抽象方法【必须】,当然如果实现类是抽象类,那么可以不重写
// 重写接口中默认方法【可选】
}
接口中,有多个抽象方法时,实现类必须重写所有抽象方法。
6.接口的多继承
一个接口能继承另一个或者多个接口,接口的继承也使用 extends
关键字,子接口继承父接口的方法。
例:
定义父接口:
public interface Chargeable {
void charge();
void in();
void out();
}
定义子接口:
public interface UsbC extends Chargeable,USB3 {
void reverse();
}
定义子接口的实现类:
public class TypeCConverter implements UsbC {
@Override
public void reverse() {
System.out.println("正反面都支持");
}
@Override
public void charge() {
System.out.println("可充电");
}
@Override
public void in() {
System.out.println("接收数据");
}
@Override
public void out() {
System.out.println("输出数据");
}
}
所有父接口的抽象方法都有重写。
方法签名相同的抽象方法只需要实现一次。
参数与返回值
参数类型
1.基本参数类型
整数型:byte short int long
浮点型:float double
字符型:char
布尔型:boolean
2.引用数据类型
数组:传入数组的地址值
类:当一个类作为方法参数类型传递的时候,将来调用时应该传入该的类对象
抽象类:当你看到一个抽象类作为方法形式参数类型的时候,将来调用时,应该传入该抽象类的具体子类的对象
接口:当你看到一个接口作为方法形式参数类型的时候,将来调用该方法时,应该传入实现该接口的具体子类对象
返回值类型
1.基本参数类型
基本参数类型返回对应类型的返回值
2.引用数据类型
数组:返回一个数组地址值
类:当你看到一个类作为方法的返回值类型的时候,将来方法内部定义时应该返回该类的对象
抽象类:当你看到一个抽象类作为方法的返回值类型的时候,将来方法内部定义时应该返回该抽象类具体子类对象
接口:当你看到一个接口作为方法的返回值类型的时候,将来方法内部定义时应该返回实现该接口的具体子类对象
标签:Java,记录,子类,接口,学习,抽象类,重写,方法,public From: https://www.cnblogs.com/yinzhanpeng123/p/18674818