密封类:

sealed 被继承类 permits可以被继承的类

public  sealed  class  Animal  permits  Dog ,  Cat{
//定义一个 密封类 Animal, 只允许 Dog, Cat 继承

允许某个类的可以被 特定的类继承 ,子类必须是final或密封类(一般都用final),且 必须定义需要继承的子类

abstract 修饰(抽象)

抽象类

1.抽象类用 abstract 修饰,此类不能实例化 2.抽象类不能创建对象、但必须定义定义构造器,便于子类实例化是调用(子类对象实例化的过程) 3.抽象类使用前提:继承性

抽象方法

1.方法为抽象方法,此时该方法不能实现(不能实例化),具体实现由子类完成。 2.包含抽象方法的类,一定是一个抽象类。但是,抽象类中可以没有抽象方法的 3.子类 重写父类中的 所有抽象方法后,此子类才可以实例化(涉及到接口知识点,接口可以看成是特殊的抽象类) 4.若子类没重写父类中的所有的抽象方法,则此子类也是一个抽象类, 需要使用abstract修饰。

注意:

1.abstract不能用来修饰:属性、构造器等结构 2.abstract不能用来修饰私有方法、静态方法、final方法、final的类

public abstract class TuXing {

    public abstract double zhouchang();

    public  double mianji(){
    return 0;
    }
}

关键字是有冲突的:

abstract与static 或者 final同时使用。

abstract 和 static 同时修饰类(内部类) ——可以。 static 和 final 同时 修饰 类,属性,方法 ——可以。 剩下的一律不可以同时修饰

abstract class Template{
//计算某段代码执行所需要花费的时间
public void spendTime(){
long start = System. currentTimeMillis();
this.code();//不确定的部分、易变的部分
long end = System. currentTimeMillis();
System.out.println("花费的时间为: " + (end-start));
}
public abstract void code();
}
class SubTemplate extends Template{
@Override
public void code() {
	for(int i = 2;i <= 1000;i++){
		boolean isFlag = true;
		for(int j = 2;j <= Math. sqrt(i);j++){
			if(i%j==0){
				isFlag = false; 
				break;
			}
		}
		if(isFlag){
			System. out.println(i);
		}
	}
}
}

匿名内部类

new 类名(参数) implements 接口() { // 匿名内部类的类体部分 }

匿名内部类必须 且只能 继承一个父类,或实现一个接口。 规则: 匿名内部类不能是抽象类。 匿名内部类不能定义构造器。由于匿名内部类没有类名,所以无法定义构造器,但匿名内部类可以初始化块,可以通过初始化块来完成构造器需要完成的工作。

举例说明: 先创建一个接口

public interface Product{
 double getPrice();
 double getName();

定义一个 实体类,实体类 定义一个方法,方法的 参数 为上述的 接口的对象,到时候会传入一个匿名类对象,这个匿名类实现了上述创建的接口。

public class Anony{ public void test(Product product){ System.out.println("购买了一个"+product.getName()+",花掉了"+product.getPrice()); } }

测试运行:

pubic class Test{
	public static void main(String[] args){
		Anony anony=new anony();
		// 注意,此处要传入一个匿名类对象
		anony.test(new Product(){
			@Override
			public double getPrice(){
					return 2000.0;
				}
			@Override
			public String getName(){
					return "联想笔记本";
				}
			}
		);
	}
}

接口

接口很重要

接口的定义:

一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现类可以具有不同的功能

请牢记:接口中不能定义构造器

接口的概念:

用关键字 interface 定义一个接口 用 implements 来实现接口 接口是为了 指定 标准、规则 提高可扩展性 实现低耦合,高内聚 接口与接口之间采用 多继承 接口与类之间采用 多实现 (多个类实现同一个接口)

接口的特点:

接口是特殊的抽象类 接口定义的 方法 必须是 抽象方法

(抽象方法只能存在与 抽象类 和 接口中 但抽象类里允许存在 非抽象方法 接口中必须全部都是抽象方法) 接口中的 属性 都是 public static final(公开静态常量)修饰的 接口中没有构造方法 接口中允许定义 default 成员方法 接口中 允许 定义 私有 成员方法 接口中 允许定义公开/私有 静态方法 ps:一个类实现这个接口 必须实现这个接口中定义的所有的抽象方法。

lambda表达式

接口中有且只有一个抽象方法 这样的接口可以称为函数式接口 @FunctionalInterface 用在接口 作用和@Override类似,用来检测该接口是否符合函数式接口的标准

函数式接口

数组补充 补充工具类方法 注意: 1.这三种方法需要用 流 来调用 2.区分 调用方法的参数列表 3.过滤,映射的返回值是数组的流(也可toArray成数组) 聚合的返回值是单个值 int流 (用getAsInt转成int类型)

过滤filter

Arrays.stream(arr).filter(s -> 判断语句) //返回值是流,有需要可用soArray转回数组 举例:

int[] arr = {1,2,3};
int [] ints = Arrays.stream(arr).filter(s -> s%2==0).toArray();
System.out.println(Arrays.toString(ints));

映射map

 //map
        int[] arr = {1, 2, 3};
        int[] arr2 = Arrays.stream(arr).map(s -> s * 3).toArray();
        System.out.println(Arrays.toString(arr2));

聚合reduce

//reduce 聚合
        int[] arr = {1, 2, 3};
        int arr2 = Arrays.stream(arr).reduce((max,a)->max > a?max:a).getAsInt();
        System.out.println(arr2);