4. Final, Native, Abstract, 接口, Comparable

Final

final: 最终的意思,是一个修饰符。

  1. 修饰类:可以修饰类,包括内部类和外部类。

    修饰类的时候表示这个类不能被继承,是个太监类,即没有子类。

  2. 修饰方法

    修饰方法的时候表示该方法可以被子类继承,但是不能被子类重写。

  3. 修饰变量:包括属性和局部变量。

    表示被修饰的变量为常量,值不能被修改。

Native

native: 原生的,内置的。

只能修饰方法,被修饰的方法说明不是 Java 语言实现的方法体,而是由 C 语言等实现的,用 C 语言等实现后,编译成 .dll 文件被 Java 调用。使用上和普通的 Java 方法没有区别,可以被正常调用,可以被重写等。

Abstract

抽象的。作用也是修饰符,只能修饰类(包括内部类和外部类)和方法。 当我们在设计父类时,发现某些方法是无法给出具体的实现,具体的实现应该在子类中实现。那么这样的方法,在父类中就可以设计为“抽象方法”,包含抽象方法的类,必须是一个“抽象类”

抽象类的特点:

  1. 抽象类不能直接 new 对象。
  2. 抽象类本来就是用来继承的,那么子类继承抽象类之后,必须实现抽象类的所有方法,否则子类也得是抽象类才行。
  3. 抽象类可以和普通类一样,拥有属性,构造器,代码块,非抽象的方法等成员,虽然抽象类不能 new 对象,但是这些可以给抽象类的子类使用。
  4. 一个类如果有抽象方法,那么这个类必须是抽象类。相反,如果一个类是抽象类,那么不一定有抽象方法。这么做的目的是不希望使用者拥有抽象类的对象,希望你创建其子类的对象。

Abstract 和各类修饰符的混合使用情况:

  1. static 和 abstract 不能同时修饰方法,因为被 static 修饰的方法不能被重写,而被 abstract 修饰的方法需要被重写。
  2. final 和 abstract 不能同时修饰方法,final 是表示不能被重写,而 abstract 修饰的方法需要被重写。
  3. native 和 abstract 不能同时修饰方法,native 是表示方法是由 c 语言实现的,abstract 表示无方法体,由子类实现。
  4. private 和 abstract 不能同时修饰方法,因为 private 的方法在子类中不可见,无法重写。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
public class TestAbstrace {
public static void main(String[] args){
Circle circle = new Circle();
circle.getArea();
}
}

abstract class Graphic{
private String name;
abstract double getArea();

public Graphic(String name) {
this.name = name;
}

public Graphic() {
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

class Circle extends Graphic{
public Circle(String name) {
super(name);
}

public Circle() {
}

/**
* 必须实现抽象类的所有抽象方法
* @return
*/
@Override
double getArea() {
return 0;
}
}

abstract class Triangle extends Graphic{
public Triangle(String name) {
super(name);
}
/**
* 或者子类成为抽象类
*/
}

修饰符总结

权限修饰符

共有,public,protected,缺省,private。

public 和缺省可以修饰:类(包括内部类和外部类),方法,属性,构造器。

protected 和 private可以修饰:内部类,方法,属性,构造器。

static

可以修饰属性,内部类,方法,代码块

final

可以修饰类(包括内部类和外部类),方法,属性,局部变量

native

只能修饰方法

abstract

只能修饰类(包括内部类和外部类)和方法。

接口

接口代表一种标准。和类是同一级别的概念。

接口的特点

  1. 接口就是用来被实现的,实现类在实现接口时,必须实现接口中的所有抽象方法,或者这个实现类是一个抽象类。
  2. 一个类可以同时实现多个接口
  3. 接口不能直接创建对象
  4. 一个类可以同时继承父类,又实现接口,但是要求继承在前,实现在后
  5. 接口与接口之前支持多继承

接口的成员

JDK 1.8 之前

  1. 全局的静态的常量,public static final
  2. 公共的抽象的方法。public abstract
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package com.atguigu.exec1;

public class TestDefineAndUserInterface {

}

interface Flyable{
int MAX_VALUE = 790000; // 全局的静态的常量,public static final
int MIN_VALUE = 0; // 全局的静态的常量,public static final
void fly(); // 公共的抽象的方法。public abstract
}

interface Jumpable{
void jump();
}

class Animal{};

/**
* 接口既继承类 Animal, 又实现 Flyable, Jumpable 两个接口
* @author rex
*
*/
class Bird extends Animal implements Flyable, Jumpable{

@Override
public void fly() {
System.out.println("飞");
}

@Override
public void jump() {
System.out.println("跳");
}

}

interface A{
void a();
}

interface B{
void b();
}

/**
* 接口间的多继承
* @author rex
*
*/
interface C extends A, B{
void c();
}

class D implements C{
@Override
public void a() {

}
@Override
public void b() {

}
@Override
public void c() {

}
}

Comparable

Comparable 是 java.lang 下的一个接口,一个类要是实现了 Comparable 中的 compareTo 方法,那么这个类的实例之间就能进行比较。

Student 类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package com.atguigu.exec1;

public class Student implements Comparable{
private String name;
private int score;

public Student(String name, int score) {
super();
this.name = name;
this.score = score;
}

public Student() {
super();
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getScore() {
return score;
}

public void setScore(int score) {
this.score = score;
}

@Override
public String toString() {
return "Student [name=" + name + ", score=" + score + "]";
}

@Override
public int compareTo(Object o) {
if (!(o instanceof Student)) {
System.out.println("抛出异常");

}

Student student = (Student) o;
if(this.score > student.score){
return 1;
}else if (this.score < student.score) {
return -1;
}else {
return 0;
}
}
}

TestStudent 类

1
2
3
4
5
6
7
8
9
10
package com.atguigu.exec1;

public class TestStudent {
public static void main(String[] args) {
Student s1 = new Student("张三", 90);
Student s2 = new Student("李四", 80);

System.out.println(s1.compareTo(s2));
}
}