抽象类
- 概念:普通的java类再抽象一步,得到更抽象的模板,其不能实例化
- 意义:用来被继承
- 作用:可以提高代码的灵活性,使得编程变得通用。
声明语法:
- 表示:public abstract class 类名{类体}
- 解释:
- 类体:可以有属性,方法(实例及静态方法、抽象方法),构造方法。。。
- 抽象方法:
- 表示:public abstract 返回值类型 方法名称(参数列表);
- 意义:就是用来被子类重写。
抽象类与抽象方法的关系
抽象类中不一定有抽象方法,但有抽象方法一定有抽象类。
一个子类继承了一个抽象的父类,要么实现类中的抽象方法,要么将自己定义为抽象类。
abstract使用注意
- 不能修饰常量;
- 不能修饰静态;
- 不能修饰final修饰的方法及类
接口
- 意义:为了解决java类中类单继承的缺陷。
- 作用:可以提高代码的灵活性,使得编程变得通用。
- 声明语法
- 表示:public interface 接口名称{接口体}
- 解释:
- 接口体:可以有静态的常量,抽象方法,静态方法。(没有构造方法)
实现方法:
- public class 实现类 implements 接口名称{}
- public interface 接口名称 extends 接口列表{接口体}
- public class 实现类 extends 抽象类 implements 接口列表{}
应用:后面的编程基本上是面向接口编程,其实质是使用接口进行结构搭建,具体功能根据需要具体实现。
多态
- 概念:对外表现一种形式,对内存在多种实现。
- 多角度理解
- 宏观:从不同类之间的多态关系来看,要实现多态,必须有继承或者实现,方法的重写,父类的引用指向子类的对象。
- 微观:从一个类的多态来看。必须要有方法重载。
- 注意事项:
- 多态必须有继承或者实现,方法的重写,父类的引用指向子类的对象。
- 多态环境下,子父类之间出现同名的属性时,访问父类。
- 多态环境下,访问同名方法时,编译期看左边,运行时访问右边。
- 多态环境下,访问同名静态方法时,访问父类。
- 多态环境下,父类不能访问子类新扩展的方法。
- 应用
- 返回值
- 多态参数
多态参数
- 问题:父类不能访问子类新扩展的方法,如果想访问该怎么办?
- 解答:必须有继承或者实现的前提下,类型转换(多态环境下对象造型)
方法:
- 首先,父类的引用指向子类的对象(向上造型)
父类的类型 父类引用 = new 子类构造方法; - 然后,向下造型
子类的类型 子类的引用 = (子类类型)父类的引用;
- 首先,父类的引用指向子类的对象(向上造型)
instanceof操作符的应用
Arrays类的sort方法补充
在对引用数据类型的数组进行排序时,要求排序所在的类实现Compareable接口,并且重写用来排序的规则方法compareTo方法,根据返回值判断大小,大于0,则前者值大;小于0,后者值大;等于0,一样大。
代码
package com.xzy.abstract_and_interface;
/**
* 接口
* @author abi
*
*/
public interface ShengWu {
public abstract void birth();
}
package com.xzy.abstract_and_interface;
public class MuDan extends Plant implements ShengWu {
private String name;
public MuDan() {
super();
// TODO Auto-generated constructor stub
}
public MuDan(String name) {
super();
this.name = name;
}
@Override
public void birth() {
System.out.println(name+"发芽");
}
@Override
public void dead() {
System.out.println(name+"凋谢");
}
}
package com.xzy.abstract_and_interface;
public class HeHua extends Plant implements ShengWu {
private String name;
public HeHua() {
super();
// TODO Auto-generated constructor stub
}
public HeHua(String name) {
super();
this.name = name;
}
public void flow() {
System.out.println(name+"开花");
}
@Override
public void birth() {
System.out.println(name+"发芽");
}
@Override
public void dead() {
System.out.println(name+"凋谢");
}
}
package com.xzy.abstract_and_interface;
public class Student implements Comparable<Student> {
private String name;
private double grade;
private int age;
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(String name, double grade, int age) {
super();
this.name = name;
this.grade = grade;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getGrade() {
return grade;
}
public void setGrade(double grade) {
this.grade = grade;
}
@Override
public int compareTo(Student s) {
if (this.getAge()>s.getAge()) {
return 1;
}else if(this.getAge()<s.getAge()){
return -1;
}
return 0;
}
@Override
public String toString() {
return "Student [name=" + name + ", grade=" + grade + ", age=" + age + "]";
}
}
package com.xzy.abstract_and_interface;
import java.util.Arrays;
public class Test {
//instanceof 实例
public static void getInstances(ShengWu sw) {
if(sw instanceof HeHua) {
HeHua hh = new HeHua("荷花");
hh.flow();
}else if(sw instanceof MuDan) {
MuDan md = new MuDan("牡丹");
md.dead();
}
}
public static void main(String[] args) {
//Arrays类sort方法
Student[] stu =new Student[]{new Student("张三",96,19),new Student("李四",100,20),new Student("王二",64,23)};
Arrays.sort(stu);
System.out.println(Arrays.toString(stu));
ShengWu sw1 = new HeHua("荷花");//向上造型
ShengWu sw2 = new MuDan("牡丹");//向上造型
getInstances(sw1);
sw1.birth();
sw2.birth();
//sw1.dead();
HeHua he = (HeHua)sw1;//向下造型
he.flow();
}
}