Java基础——类的访问修饰符
1.Java中的外部访问修饰符有如下四种
public,默认,abstract,final
// public,默认,abstract,final
public class Test1 {}
class Test2{}
abstract class Test3{}
final class Test4{}
- 其中public表示任意位置都可以访问该类;
- 不写表示默认访问修饰符,即在同一个包中可以访问;
- abstract是表示该类为一个抽象类,不能实例化该类,即不能使用Test3 test3 = new Test3();的方式获取Test3的实例。如果要使用它则需要找一个类继承该类;
- final表示该类不能被子类继承,该类即为最终类,不可再被继承。
2.为什么不能用private和protected修饰外部类呢?
- private:用private修饰外部类,表示该外部类不能被其他类访问,那么定义这个类就失去了意义,所以private只能修饰内部类。内部类的上一级是外部类,那么对应的有四种访问控制修饰符:本类(private),同包(default),父子类(protected),任何位置(public)。当一个内部类使用了private修饰后,只能在该类的外部类内部使用。
- protected:受保护的类,同一个包内或者不同包内的子类可以访问。如果一个类被protected修饰,外部类无法访问,那又如何继承。所以用protected也是没有意义的
3.下表为Java访问修饰符的使用情况
类的访问修饰符 | 类内部 | 本包 | 子类 | 外部包 |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |
注意:Java的访问控制是停留在编译层的,也就是它不会在.class文件中留下任何的痕迹,只在编译的时候进行访问控制的检查。其实,通过反射的手段,是可以访问任何包下任何类中的成员,例如,访问类的私有成员也是可能的。
Java基础——抽象类 abstract
1.特点
- 使用abstract修饰的类
- 抽象类可以有抽象方法也可以有非抽象方法
- 抽象方法没有方法体
- 有抽象方法的类一定是抽象类,类声明需要使用abstract修饰
- 抽象类可以有构造方法,但不可以被实例化,构造方法由子类实例化的时候调用
2.实现
public abstract class Test1{
public void test2(){}
public abstract void test3();
}
Java基础——接口 Interface
1.概念
接口是一种被规范的标准,接口的表现在于对行为的抽象
例如插座的插口就是一个被规范的标准,所有插座都按照这些插口设计,可以供各类电器插头使用。插口就是接口,插座是实现类
接口是解决Java无法使用多继承的一种手段
接口可以作为一种顶层设计,spring的设计就是从接口开始的
2.声明
格式1:
public interface 接口名
格式2:
interface 接口名
3.特点
①接口的实现用implement关键字
public interface usb{}//定义一个接口
public class computer implements usb{}//创建一个类实现接口
②接口不能被直接实例化,可以通过多态的形式实现实例化
usb u =new computer();
③接口中都是抽象方法和常量,不可能有非抽象方法,常量必须被赋值。
// 常量默认被public static final
// 方法默认被public static abstractl修饰
public final int num1=10;√
num1=20;×
int num2=10;√
num2=20;×
上面两个正确的写法等价
public abstract void method1();√
void method2();√
直接int num=10,创建的a是常量
④接口的实现类
必须重写接口中的所有的普通方法,不想重写则可以是抽象类(加上abstract)
但是子类继承了该抽象类必须重写接口中的普通方法。
default修饰的方法叫默认方法,它可以有方法体,默认方法可以不被实现类重写。
但是如果一个实现类实现了多个接口,并且这些接口中有两个接口的默认方法是一样的,那么就必须在实现类中重写
4.类与接口的关系
类和类之间是继承关系
接口和接口之间是继承关系
类和接口之间是实现关系(类实现接口)
类只支持单继承(即一个子类只有一个父类),可以实现多个类
public class A extends B implements C,B,D....{}
接口之间可以多重继承。
public interface a extends b,c,d.....{}