面向对象
–抽象类
–实现接口
–泛型
–抽象
--abstract
当一个类的某个操作没法具体实现时,这个操作可以定义为抽象方法。
抽象方法使用abstract修饰的方法,只有方法的声明部分,没有方法体。
抽象abstract使用方法:
* 抽象可供给类和方法使用
但是抽象类不能实例化对象,只能调用方法
public abstract class Pet {
public abstract void method() ;
}
测试抽象类的特点:
* 1) 只要使用abtract修饰的类就是抽象类
* 2) 含有抽象方法的类必须定义 为抽象类,但是,抽象类中不一定含有抽象方法
* 有时,对现有的类进一步抽象形成更高层级的类(更抽象的类),如食物类,动物类,
它们是没法实例化,这种情况下,可以定义为抽象类
* 3) 抽象类是一种引用数据类型, 可以定义变量, 但是抽象类不能实例化对象,
* 抽象类定义引用可以赋值子类对象
* 4) 抽象类肯定含有构造方法, 子类创建对象时调用子类构造方法,
子类构造方法体执行前会先执行父类的构造方法
* 5) abstract与final不能同时使用
接口实现
–接口
定义接口 interface
实现接口 implements
Java程序中的接口是用来扩展类的功能的,可以把接口理解为功能的封装,
Java中的接口也可以理解为一个操作规范(协议)。
一、
Java接口定义的语法:
[修饰符] interface 接口名 {
接口中的方法默认使用 public abstract修饰
接口中的字段默认使用 public static final修饰
接口中可以定义 public static 静态方法
定义public default方法
}
二、
Java接口的使用:
[修饰符] class 类名 implements 接口{
需要重写接口的抽象方法
--Java接口多态--
1) 接口是一种引用数据类型,可以定义变量,但是接口不能实例化对象,
接口引用可以赋值实现类对象
2) 接口多态 , 通过接口引用调用接口中抽象方法,实际上执行的是实现类对象的方法
--而接口存在的意义就是为了实现多态。
举栗:
//定义飞行接口
public interface Flyable {
//接口中的方法默认使用public abstract修饰
void fly();
}
//定义鸟类,一个类实现了接口,需要重写接口中抽象方法
public class Bird implements Flyable {
@Override 表示重写父类中的方法
public void fly() {
System.out.println("小鸟在天空中自由飞翔");
}
}
//主函数
public class Test {
public static void main(String[] args) {
//1)接口定义变量
Flyable flyable ;
//2)错误写法,接口不能实例化对象
// flyable = new Flyable();//Cannot instantiate the type Flyable
//3)接口引用可以赋值实现类对象
flyable = new Bird();
flyable.fly();
flyable = new Plane();
flyable.fly();
}
}
泛型
* 类<泛型> 定义 = new 类<泛型>();
* 使用泛型的好处是将数据统一化
* 泛型只能使用封装数据类型
* 在集合中使用泛型
例:
public class GenericsTest {
public static void main(String[] args) {
new GenericsTest().Test1(); //匿名对象遍历
}
public void Test1(){
//使用封装数据类型
//定义泛型后其他数据类型不能声明
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(66);
list.add(77);
list.add(88);
list.add(99);
//遍历,只遍历Integer数据类型
for (Integer score : list){
//避免数据强转
int stuScore = score;
System.out.println(stuScore);
}
/*
//第二种遍历方式
Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext()){
int stuScore = iterator.next();
System.out.println(stuScore);
}*/
}