Java的类要满足java规范,有包,有无参构造器,实现序列化接口
外部类类修饰符:public、default、abstract、final、strictfp(final和abstract不能一起用,因为abstract抽象类必须被继承,而final修饰的类不能被继承)(外部类不能用private和protected)
接口修饰符 :public、default、abstract(接口本就是抽象,加不加一样)、strictfp 接口的方法:public abstract 接口的常量: public static final (接口默认的就是abstract类型)
构造器修饰符 :public、protected、default、private
全局变量修饰符:public、protected、default、private、static、transient(不序列化)、final、 volatile(同时被几个线程控制修改)
局部变量修饰符:final
方法修饰符 : public、protected、default、private、abstract、static、final、synchronized、strictfp
成员内部类 :public、protected、default、private、static、abstract、final、strictfp(声明成static就是静态内部类了)
方法内部类:default abstract strictfp final 作用域只在该方法中
protected修饰的变量、方法、构造器的使用:包内和子类可见
确定出该protected成员来自何方,其可见性范围是什么? object的clone()就是这种protected方法。
1.父类的protected成员是包内可见的,并且对子类可见;(总结就是该protected来自哪里,只能在该本包或者子类中使用,调用该方法的地方是否合适)
1.1 同一个包:可以任意使用
1.2 不同包:不能通过实例化父类或其它子类来访问父类的protected成员
-
重载overload:方法名相同,参数(个数,顺序,类型)不同,返回值随意,编译期绑定。
-
重写override:子类的返回类型(相同或者是父类返回值类型的子类)、方法名、参数都相同,访问权限只大不小。运行期绑定。
-
构造方法:用于初始化对象。程序会给没有构造方法的类构造一个默认无参的构造方法,如果类定义了构造方法,就不会有默认的构造方法。
- 构造器 Constructor 不能被继承,
-
this:
代表本类的一个对象,在非静态方法中会传入一个this引用进去,this.name this.method()
构造方法也可以用this引用本类的另一个构造方法。在构造方法第一句使用
-
继承(单继承)
-
extends:父类的变量和方法,但是继承父类private的成员变量和方法是不可见的,不能在子类中使用,因为private的成员只能在本类中可见。
-
super:父类的对象
-
子类的构造方法中会先调用父类的构造方法,子类的构造方法中第一行用super(。。)调用父类的构造方法。没写默认调用父类无参构造方法
-
子类不是继承但有和父类相同的变量或方法,这是隐藏父类的成员导致的。是子类自己的。
-
static
-
static方法没有隐士this 实例方法有this参数,所以static方法不能直接使用非static成员,也不能使用this、super关键字,用类名.成员使用。
-
static{}块 在类的加载的时候初始化,static块为属于类的代码块,在类加载期间执行的代码块,可以有多个块,只执行一次,可以用来在软件中加载静态资源(图像、音频等等)。
- static方法不能被重写,jvm认定了static是属于类的,子类再写相同的方法名那是隐藏而已。
- 实例方法可以访问类变量,static可以通过对象调用,一般是直接类名.属性
-
final
-
修饰成员变量:声明同时初始化或者构造方法中初始化,初始化一次,不可更改。
-
修饰局部变量:使用之前初始化就可。
- 修饰的引用变量:只是表示变量指向的地址不会变,但引用对象的内部数据可变的。
- final引用指向对象,表示这个引用只能指向这个对象, 但是这个对象本身内部数据是可以更改的。要使其变成不可更改,使用static final
-
修饰方法:不能被重写
-
修饰类:不能被继承,
-
static final 修饰的成员变量称为常量,必须声明同时初始化,并且不可被改变。大写(编译期间执行)
-
volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
-
抽象类
-
Abstract class类名{}方法中的方法是abstract方法:abstract 返回值 方法名();
- 抽象类不能实例化,需要被子类继承,可以用构造方法,只是不能实例化,可以在子类调用super()
- 抽象方法是修饰不能是private,也不能是final
- 定义抽象类的意义在于:
静态方法:使用 static 修饰,静态与.class 文件相关,不能被子类继承,不能被子类重写,只能使用接口名调用,不可以通过实现类的类名或者实现类的对象调用,接口.方法名()调用。
public interface InterFaceName {
public default void method() {
// 执行语句
}
public static void method2() {
// 执行语句
}
private void func1(){
System.out.println("私有方法");
}
private static void func2(){
System.out.println("私有静态方法");
}
默认方法:子类实现接口之后可以直接调用,也可以自己重写。
public class Son implements InterFacename{
@Override
public void method() {
System.out.println("重写默认方法");
}
}
静态方法的使用
public interface LiveAble {
public static void run(){
System.out.println("跑起来~~~");
}}
public class Animal implements LiveAble {
// 无法重写静态方法
}
public class InterfaceDemo {
public static void main(String[] args) {
// Animal.run(); // 【错误】无法继承方法,也无法调用
LiveAble.run(); //
}
注意:
1.类实现多个接口,这几个接口有相同的默认方法,类必须重写一次,静态方法不用,因为静态方法只有各自接口名访问。
2.当类继承另一个类B并实现了一个接口,这个接口的默认方法和类B有相同方法,子类就近选择执行父类的方法。
3.子类重写接口的默认方法,default关键字不能保留,子接口继承接口,要重写父接口的默认方法,可以保留关键字。