一、抽象类:abstract
1、只要有一个或一个以上抽象方法的类,必须用abstract声明为抽象类;
2、抽象类中可以有具体的实现方法;
3、抽象类中可以没有抽象方法;
4、抽象类中的抽象方法必须被它的子类实现,如果子类没有实现,则该子类继续为抽象类
5、抽象类不能被实例化,但可以由抽象父类指向的子类实例来调用抽象父类中的具体实现方法;通常作为一种默认行为;
6、要使用抽象类中的方法,必须有一个子类继承于这个抽象类,并实现抽象类中的抽象方法,通过子类的实例去调用;
二、接口:interface
1、接口中可以有成员变量,且接口中的成员变量必须定义初始化;
2、接口中的成员方法只能是方法原型,不能有方法主体;
3、接口的成员变量和成员方法只能public(或缺省不写),效果一样,都是public
4、实现接口的类必须全部实现接口中的方法(父类的实现也算,一般有通过基类实现接口中个异性不大的方法来做为适配器的做法)
三、关键字:final
1、可用于修饰:成员变量,非抽象类(不能与abstract同时出现),非抽象的成员方法,以及方法参数
2、final方法:不能被子类的方法重写,但可以被继承;
3、final类:表示该类不能被继承,没有子类;final类中的方法也无法被继承.
4、final变量:表示常量,只能赋值一次,赋值后不能被修改.final变量必须定义初始化;
5、final不能用于修饰构造方法;
6、final参数:只能使用该参数,不能修改该参数的值;
四、关键字:static
1、可以修饰成员变量和成员方法,但不能修饰类以及构造方法;
2、被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享
3、static变量和static方法一般是通过类名直接访问,但也可以通过类的实例来访问(不推荐这种访问方式)
4、static变量和static方法同样适应java访问修饰符.用public修饰的static变量和static方法,在任何地方都可以通过类名直接来访问,但用private修饰的static变量和static方法,只能在声明的本类方法及静态块中访问,但不能用this访问,因为this属于非静态变量.
五、static和final同时使用
1、static final用来修饰成员变量和成员方法,可简单理解为“全局常量”!
2、对于变量,表示一旦给值就不可修改,并且通过类名可以访问。
3、对于方法,表示不可覆盖,并且可以通过类名直接访问。
六、this关键字
1、表示对当前对象的引用!
2、表示用类的成员变量,而非函数参数,注意在函数参数和成员变量同名是进行区分!其实这是第一种用法的特例,比较常用,所以那出来强调一下。
3、用于在构造方法中,当在构造器里要调用自己的其他构造器时,就用this
。但是这里必须非常注意:只能引用一个构造方法且必须位于开始!
4、this不能用在static方法中;
例子
public class A {
private String name;
public A() {
this("no name");
}
public A(String name) {
this.name = name;
//other codes
}
}
七、super关键字
1、显式的调用父类的方法。当子类覆盖父类的方法时,需要调用父类的方法,此时需要使用super调用父类的同名方法。如下
public class MyPanel extends JPanel {
@Override
public void paint(Graphics g) {
super.paint(g);//如果不用super,那么就会调用自己的paint方法
}
}
2、super也可以用在构造器,与this是调用子类本身的其他构造器不同,super是调用父类的构造器 。当使用时它们两个都必须是写在构造器里的第一行。
public class Person {
private String name;
private int age;
public Person() {
name = "";
age = 0;
}
public Person(String n, int a) {
name = n;
age = a;
}
}
public class Student extends Person {
private String id;//学号
public Student(String name, int age) {
super(name, age);//必须写在第一行,子类无法直接访问父类的私有属性,所以通过调用父类的构造器类初始化属性
}
public Student(String id, String name, int age) {
this(name, age);//因为本类已经有个构造器初始化name和age了,所以交给他来做就行了,也必须写在第一行
this.id = id;
}
}