修饰符,面向对象(抽象)

本文最后更新于:1 年前

二十八、修饰符

1. 包和权限修饰符

1.1 包

​ 包其实就是文件夹,用来管理我们的类的。一个类的全类名其实是包名加类名(在java中要求全类名是不能重复的)。

1.1.1 包的定义格式

​ 在类的最上面加上 package 包名;

例如

1
package com.sangeng;

1.1.2 导包

​ 当我们在一个类中使用另外一个类的时候,如果这个类在另外一个包下。我们必须要写全类名或者导包(如果是在java.lang包下的类我们也不需要)。

格式:import 全类名;
例如

1
import java.util.Scanner;

1.2 权限修饰符

​ 我们使用权限修饰符来控制被修饰的成员的使用权限。Java中有四种权限修饰符:public,protected,default(default并不是关键字,而是代表不写权限修饰符),private

1.2.1 权限

​ 被不同的权限修饰符修饰后,被修饰的成员可以在不同范围内被使用。

本类中 同一个包下 子类 不同包非子类
public
protected
默认
private

1.2.2 使用规律总结

​ 我们在工作中一般不使用默认的权限。如果一个成员我们只想在本类中使用我们就使用private修饰。如果我们想只被本类和子类使用可以使用protected。如果可以被人任意使用,我们使用public。

2. static

​ static是一个修饰符,被其修饰的成员就属于类了。会被类的所有对象所共享。

2.1 静态成员的调用格式

​ 无论是成员变量,还是成员方法。用static修饰后我们即可以用对象名来调用也可以用类名来调用。一般都使用类名称进行调用。

​ 静态变量:类名.静态变量名
​ 静态方法:类名.静态方法名(参数)

例如

1
2
3
4
5
6
7
8
9
10
class Student{
public static int num;
public static void test(){}
}
class Demo{
public static void main(String[] args){
Student.num = 10;
Student.test();
}
}

2.2 注意事项

​ 1.静态方法中不能直接使用非静态的成员

​ 2.静态方法中不能使用this

2.3 理解

​ 因为被static修饰的东西就属于类了,所以可以使用类名来调用
​ 因为被static修饰的东西就属于类了,类的加载优先于对象,所以在静态方法中,不能使用非静态的成员(PS:非静态的成员是属于对象),类出现的时候对象还不存在,所以不能使用还不存在的东西
​ 因为被static修饰的东西就属于类了,而this代表的某个对象,类加载的时候对象还没创建,所以在静态方法中不能使用this,因为对象都没有出现呢

2.4 使用场景

​ ①如果需要共享数据,可以使用static
②如果想要方便调用某些成员,可以使用static修饰(PS:因为就可以直接用类名来调用,不需要创建对象)

3. final

​ final可以修饰类,成员方法,局部变量,成员变量。

​ 修饰后的作用如下:
​ ①可以修饰类,被final修饰的类不能被继承.
​ ②可以修饰成员方法,被final修饰的成员方法不能被重写
​ ③可以修饰局部变量,被final修饰的局部变量就变成了常量,赋值之后就不能被修改
​ ④可以修饰成员变量,被final修饰的成员变量就变成了常量,一旦赋值之后就不能被修改.并且必须初始化。有两种初始化方式,一种是直接赋值,另外一种是要在类的所有的构造方法中对其进行赋值.

二十九、面向对象-抽象类

1. 为什么要抽象

​ 当一个类中有一个方法,这个方法在不同的子类中有不同的实现的时候,在父类中我们没有办法去写具体的方法体,这个时候就可以使用抽象.(即不写方法体)

2. 抽象类和抽象方法的格式

2.1 抽象方法

​ 在成员方法的返回值类型前加abstract修饰,然后去掉方法的大括号,加上一个分号

例如

1
public abstract void eat();

2.2 抽象类

​ 在class关键字的前面加上 abstract 修饰。

例如

1
2
3
public abstract class Animal{

}

3. 抽象类的特点

  • 抽象类可以有抽象方法,还有就是不能直接创建对象,其他所有都和普通类一样
  • 抽象类的子类,要么重写抽象父类中所有的抽象方法,要么子类本身也是一个抽象类

面向对象-接口

1. 接口的概念

​ 接口就是规范\规则,我们可以使用接口来定义一些规则(比如要求某个方法的方法名必须叫什么,方法的参数列表必须是什么,方法的返回值类型必须是什么)

​ 现实生活中的规范

image-20201018110217344

2. 接口的格式

2.1 定义接口

​ 使用interface来定义接口

1
2
3
4
public interface 接口名{
//定义抽象方法
void method();
}

2.2 实现接口

​ 在要实现接口的类名后面加上implements 接口名。如果要实现多个接口,多个接口名用逗号分开。我们在理解的时候可以把接口理解成是一个特殊的父类。

1
public class 类名 implements 接口名{}

3. 接口中的成员

3.1 常用成员

​ 在jdk7版本中接口中只能有常量和抽象方法。

​ 我们接口中定义不了成员变量。因为定义的成员变量默认都会修饰为:public static final

​ 我们在接口中定义的方法默认修饰符为public abstract

例子

1
2
3
4
5
6
public interface InterfaceA {
//常量
int NUM =10;//等价于public static final int NUM =10;
//抽象方法
void method();//等价于 public abstract void method();
}

3.2 新增成员

​ 在新版本的jdk中接口中允许出现更多的成员。

3.2.1 默认方法

​ 在jdk8中允许我们在接口中定义默认方法。默认方法允许有方法体。

​ 默认方法可以选择不进行重写。

3.2.1.1 格式

​ 使用defaut关键字进行修饰。

1
2
3
4
5
6
public interface InterfaceA {
//默认方法
default void method(){

}
}
3.2.1.2 注意事项

​ 如果两个接口中有相同的默认方法。一个类同时实现了这两个接口,必须要重写该方法。

3.2.1.3 应用场景

​ 如果在接口升级的时候某些方法并不想让所有的实现类进行重写,可以使用默认方法来定义。

3.2.2 静态方法

​ 在jdk8中允许我们在接口中定义静态方法。静态方法允许有方法体。

​ 静态方法不能被重写。

3.2.2.1 格式

​ 使用static关键字进行修饰。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public interface InterfaceA {
//静态方法
static void staticMethod(){

}
}

public class Demo {
public static void main(String[] args) {
//使用接口名.方法名(参数) 来调用
InterfaceA.staticMethod();
}
}

3.2.2.2 应用场景

​ 如果在接口升级的时候需要给接口增加一些工具方法。不想让实现类去重写该方法,可以使用静态方法来定义。

3.2.3 私有方法

​ 在jdk9中允许我们在接口中定义私有方法。私有方法允许有方法体。

​ 私有方法不可以被重写。

3.2.3.1 格式

​ 使用private进行修饰。

1
2
3
4
5
6
7
8
9
public interface InterfaceA {
private static void privateStaticMethod(){

}
private void privateMethod(){

}
}

3.2.3.2 应用场景

​ 对默认方法或者是静态方法中重复的代码进行抽取,提高代码复用度。

4. 继承实现关系

​ 在java中一个类可以实现多个接口

例如

1
public class Person implements InterfaceA,InterfaceB{}

​ 在java中接口和接口之间可以有继承关系。继承之后会把父接口的成员继承下来。

1
2
3
public interface InterfaceC  extends InterfaceA{
// void method1();
}

5. 抽象类和接口的使用区别

​ 接口中的基本都是抽象的,而在抽象类中可以有一部分是非抽象方法。而非抽象类中是不可以有抽象方法的。

​ 我们就发现接口是最抽象的,其次是抽象类,最后是非抽象类。
​ 所以我们最顶层设计成接口,然后实现类设计成抽象类(实现部分抽象方法),抽象类的子类可以设计成非抽象类(对剩下的所有抽象方法进行实现)。


修饰符,面向对象(抽象)
http://example.com/2020/02/01/修饰符-面向对象(抽象)/
作者
Crush
发布于
2020年2月1日
更新于
2023年7月9日
许可协议