目录
阐述
final的概念
final是状态修饰符,意思是”最终的“。
被final修饰的类不能被继承
被final修饰的方法不能被重写
被final修饰的变量就是常量,只能赋值一次
拓展知识:
修饰符有三种
1.状态修饰符(final、static)
2.抽象修饰符(abstract)
3.权限修饰符(public、protected、private)
static相关知识
static修饰的成员随着类的加载而加载,可以直接被类调用。它们优先于对象存在。
this和super是随着对象的创建而存在,所以静态方法中是没有这两个关键字的。
任何没有static修饰的方法都是成员方法,随着对象的创建而存在。有static修饰的方法是“静态成员方法”,不是“成员方法”,它是随着类的加载而加载的。
抽象的概念
抽象类是用来继承共性功能的,不能实例化对象,其具体的功能留给子类实现。
抽象方法没有方法体,方法体就是参数列表后面的花括号代码块。
接口的概念
接口是用来实现拓展功能的,没有构造函数,不能实例化对象
它的成员变量只能是公共静态常量,默认 public static final修饰
它的成员方法只能是抽象的,默认public abstract修饰
抽象类和接口的区别
三点
1.成员区别:
抽象类的成员可以是常量,也可以是变量;接口的成员只能是常量。
抽象类有构造方法;接口没有构造方法。
抽象类的成员方法可以是抽象方法,也可以是非抽象方法;接口的成员方法只能是抽象方法。
2.关系区别
类与类是继承关系。只能单继承和多层继承,不可以多继承。
类与接口是实现关系。可以单实现,也可以多实现。多实现的接口名字用逗号隔开。
接口与接口是继承关系。可以单继承、多继承、多层继承。
3.设计理念区别
抽象类中定义的是继承体系的共性功能;接口中定义的是实现体系的拓展功能。
包的概述和注意事项
包是用于对类进行分类管理的文件夹。
注意事项:
package语句的定义格式为 package 包名; ,多级包名用.隔开。
package语句必须是程序的第一条可执行代码。
每个Java文件只能有一个package语句。
四种权限修饰符的访问特点
public | protected | 默认 | private | |
同一类中 | √ | √ | √ | √ |
同一包的不同类 | √ | √ | √ | |
不同包的子类 | √ | √ | ||
不同包的其他类 | √ |
public(公共权限)可以修饰 类、成员变量、方法,可以被任意调用、访问,是权限最高的修饰符。
protected(受保护权限)可以修饰 成员变量、方法,不能修饰外部类,只能被同一个类、同一个包的类、不同包的子类调用、访问。
default(默认权限,不写任何关键字)可以修饰 类、成员变量、方法,只能被同一个类、同一个包的其他类调用、访问。
private(私有权限)可以修饰成员变量、方法,不能修饰外部类,只能被同一个类调用、访问。
课后题
让所有的猫具备跳高的额外功能
1. 定义跳高接口Jumpping,该接口中有一个抽象跳高方法jump()。
2. 定义抽象类Animal,该类中有属性姓名name、年龄age,还有一个抽象吃饭eat()方法。
3. 定义猫类Cat,该类继承Animal,并实现跳高接口,重写抽象类中eat()方法与接口中的跳高jump()方法。
4. 定义测试类InterfaceTest,在测试类中,创建猫对象,给对象成员变量赋值,最后调用猫的吃饭和跳高方法。
//定义跳高接口Jumpping,该接口中有一个抽象跳高方法jump()。
public interface Jumpping {
void jump();
}
//定义抽象类Animal,该类中有属性姓名name、年龄age,还有一个抽象吃饭eat()方法。
public abstract class Animal {
private String name;
private int age;
public abstract void eat();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
//定义猫类Cat,该类继承Animal,并实现跳高接口,重写抽象类中eat()方法与接口中的跳高jump()方法。
public class Cat extends Animal implements Jumpping {
@Override
public void eat() {
System.out.println(super.getName() + "是个" + super.getAge() + "岁的小猫,它在吃鱼。");
}
@Override
public void jump() {
System.out.println("小猫" + super.getName() + "跳得真高!");
}
}
//定义测试类InterfaceTest,在测试类中,创建猫对象,给对象成员变量赋值,最后调用猫的吃饭和跳高方法。
public class InterfaceTest {
public static void main(String[] args) {
Cat cat = new Cat();
cat.setName("咪咪");
cat.setAge(1);
cat.eat();
cat.jump();
}
}