权限修饰符
作用:1、可用来控制一个成员能够访问的范围
2、可以修饰成员变量,方法,构造器,内部类。
在不同包下 子类 继承 父类 后 除了 private修饰的成员变量不能调用 别的都能在实例化子类对象后使用
final修饰符(最终的,不可改变的)
1、关键字final可以修饰变量、方法,还有类。
2、final修饰的类无法被继承(多用于工具类)。
3、final修饰的方法无法被覆盖,无法被重写。
4、final修饰的变量是基本类型时 变量存储的数据值不能发生改变。
5、final修饰的变量是引用类型时 变量存储的地址值不能发生改变,但是地址指向的对象内容可以改变。
可通过 public static final String 变量名 = "值" 来定义字符串常量 (其他基本数据类型均可) 方便复用提高可读性 (多用于系统的配置信息等)
抽象类 abstract
当子类都有该方法但实现方法不同时使用 (可用来规范方法命名、返回值、接收参数等),在抽象类中 可以调用抽象方法 即使他没被重写(因为子类只有重写抽象方法成为具体类后才能被实例化)
特点:
1、抽象类中可以没有抽象方法,但有抽象方法的类必须是抽象类。
2、抽象方法必须在子类中进行重写,除非子类也是抽象类。
3、抽象类和 final不能同时存在 因为final修饰的类不能被继承 类中的实例方法也不能再被重写
4、抽象类不能直接创造对象(实例化)
5、抽象类可以有构造方法,目的是让子类来调用构造方法初始化
//抽象类
//当执行 Myfather myfather = new Myfather();会报错 'Myfather' 为 abstract;无法实例化
public abstract class Myfather {
public void write(){
System.out.println("《我的爸爸》");
System.out.println("我的爸爸是啥样,来说说:");
System.out.println(text());
System.out.println("我的爸爸简直太好了:");
}
public abstract String text();
}
//子类
public class Small extends Myfather {
@Override //重写抽象类中方法
public String text() {
return "我是小学生";
}
}
接口 interface
接口可以来规范类中必须有哪些方法
接口特点
1,接口中可以定义常量,不能定义变量,接口中的属性默认都被 public static final 修饰
2,接口中所有的方法都是抽象方法,接口中方法都会自动用 public abstract 修饰
3,接口不能被实例化(即 new 一个对象)
4,接口中不能有构造器(构造函数,构造方法)
5,一个接口可以继承多个接口,但不能继承类,一个类也可以继承多个接口
6,接口的实现类必须实现接口中全部的方法,或者定义为抽象类
//接口使用 interface 声明
//接口 Inter1
public interface Inter1 {
public static final String name = "黑马"; //public static final 可省略 在接口中会默认生成
void run();// 不需要用 public abstract 声明 默认会有
default void see
}
//使用
public class Cs1 implements Inter1 {
@Override
public void run() {
System.out.println("run");
}
}
接口注意事项
原因:
1、接口中没有构造方法,所以接口不能new对象来创造
2、静态方法不支持子类去使用,只能接口去调用
3、就近原则 先从本类中找,没有再去找上级
4、就近原则 重写后无法在使用接口中的同名默认方法
5、如下图(重载)
//可以
public interface Inter1 {
void run();
}
public interface Inter2 {
void run();
}
//可以
public interface Inter1 {
void run();
}
public interface Inter2 {
void run(String name);
}
//不可以
public interface Inter1 {
void run();
}
public interface Inter2 {
String run();
}
//不可以
public interface Inter1 {
void run(String name);
}
public interface Inter2 {
String run(String name);
}