一、抽象类
抽象类,就是用abstract关键字修饰的类
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
abstract关键字
1.abstract修饰成员方法叫抽象方法
2.abstract修饰类叫抽象类
【注意事项】:
1.abstract修饰成员方法,但是这个方法没有方法体
2.abstarct修饰的成员方法所在的类,也必须加上abstract修饰
3.abstract修饰的成员方法,没有方法体,没有实现的代码,是一个半成品
4.抽象类下面可以有非抽象的方法
5.抽象类下面可以没有抽象的方法,但是你叫抽象类
6.抽象类不能被实例化
7.抽象类能被继承,但是必须重写抽象方法,非抽象方法可重写可不重写
8.一个类只能继承一个抽象类
abstract class Animal {//抽象类
public abstract boolean eat(int a);//抽象方法,没有方法体
public abstract int sleep();
public void run() {//非抽象方法
System.out.println("跑起来!!!");
}
}
public class Monkey extends Animal{
@Override
public boolean eat(int a) {//重写抽象方法
if (a == 1) {
return true;
}
return false;
}
@Override
public int sleep() {//重写抽象方法
int a = 10;
return a;
}
@Override
public void run() {//重写非抽象方法
System.out.println("上蹿下跳");
}
}
public class Demo1 {
public static void main(String[] args) {
Monkey monkey = new Monkey();
boolean eat = monkey.eat(1);
System.out.println(eat);//true
monkey.run();
int sleep = monkey.sleep();
System.out.println(sleep);
}
}
二、final关键字
字面意思是:最终的,最后的
用法:
1.final修饰成员变量
使用final修饰成员变量的时候必须进行赋值(初始化)。如果赋值以后,这个值就能不能更改了。
2.final可以修饰局部变量
局部变量使用final可以不赋值。使用final修饰的局部变量一旦本赋值就不能修改
3.final可以修饰成员方法
final修饰的成员方法,子类不能重写!!!
4.final可以修饰类
final修饰的类不能被继承
package com.boke.app1;
final class Person {
final int age = 23;//final修饰的成员变量必须赋值,且之后不能更改,否则报错
public final void eat () {
System.out.println("烤枸杞");
}
public void test () {
final int num;//num是一个局部变量 可以不用直接赋值
num = 20;//num被赋值了
//num = 30;//下面想改变num值,不能改变,因为被final修饰
}
}
//class Student extends Person{//报错,final修饰的类不能被继承
// public final void eat() {//报错,final修饰的成员方法,子类不能重写
//
// }
//}
public class Demo3 {
public static void main(String[] args) {
final Person person = new Person();
//person.age = 56;//age被final修饰,age属性的值已经赋值了,不能再更改了
}
}
三、接口
接口由interface关键字修饰
接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
语法格式:
interface 接口名字{
成员属性;//很少用
成员方法;
}
【注意事项】:
1.接口下面可以声明成员属性,但是要赋值,因为默认被final修饰了
2.接口下面的方法必须都是抽象方法,abstract关键字默认有的,可以写也可以不写
3.接口不能被实例化
4.接口必须使用一个类去实现(implements)它
5.必须重写接口中所有的抽象方法
6.一个类可以同时实现多个接口,相当于实现了多继承
package com.qfedu.app1;
interface Usb{//接口
public abstract void write();
public void read();
}
class Computer implements Usb{
@Override
public void write() {
System.out.println("电脑具有了写的功能");
}
@Override
public void read() {
System.out.println("电脑具有了读的功能");
}
}
public class Demo4 {
public static void main(String[] args) {
Computer computer = new Computer();
computer.read();//打印电脑具有了读的功能
computer.write();//打印电脑具有了写的功能
}
}
四、抽象类和接口的区别
1.接口的方法都是抽象的,抽象类可以有抽象方法,也可以有非抽象方法
2.类可以实现多个接口,但是只能继承一个抽象类
3.类如果要实现一个接口的话,必须要实现它所有的抽象方法
类如果要继承一个抽象类,可以不求重写非抽象方法,但是抽象方法必须重写4.抽象类去实现接口,接口的方法在抽象类中可以不强制重写
5.java8及以上的版本可以写默认的方法,这个方法带有方法体
6.接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。