抽象类
一个类被abstract所修饰,且含有抽象函数,这个类被称为抽象类。其作用或是应用场景通常是作为父类,知道要有一项功能,但不知应该怎么去写,定义好抽象函数后,交给子类去重写。所以抽象类不能直接被实例化,而且抽象函数必须被重写。注意:抽象类中可以含有普通的成员函数。举例:
abstract class Student{ public void fun(){//普通的成员函数,有方法体 System.out.println("这是个普通方法"); } public abstract void print();//抽象方法。没有方法体 } class Classroom extends Student{//子类 @Override public void print(){//重写抽象方法print() System.out.println("重写抽象方法"); } } public class Test1{ public static void main(String[] args){ Student s1 = new Classroom(); s1.print();//被重写过的方法 } }
注:抽象类中有构造方法,且子类对象实例化的时候,依然满足先执行父类构造,再执行子类构造的顺序。抽象类不能使用final声明,因为抽象类会有子类,final特性下面会有。
接口(interface)
比抽象类更“抽象”的东西:
1、不允许有普通函数,全是抽象函数;因此,abstract标记可以省掉。
2、接口中可以定义变量,但是一旦定义就不能改变,实际上是常量,并且变量默认是静态的。
3、接口中的成员强制都是public。
4、只能够继承一个抽象类,但是可以实现多个接口,用逗号隔开(解决了java无法使用多继承)。写法:class 子类 extends 父类 implements 接口1,接口2,…{}举例:
package interface1; interface Dialog {//接口 public void show(); } class FontDialog implements Dialog{ public void show(){ System.out.println("FontDialog.show()"); } } public class Main { public static void toCenter(Dialog dialog){ System.out.println("计算屏幕数据"); dialog.show(); } public static void main(String[] args){ FontDialog fd = new FontDialog(); toCenter(fd); } }
final 关键字
作用如下:
1、用final来修饰一个类表示该类不能被继承。例 final class Student()
2、用final来修饰一个函数表示该类在被子类继承的情况下,该函数不能被重写。例public final void show();
3、用final来修饰一个成员变量表示该成员变量的值不允许被改变,也就是说,不允许重新赋值(哪怕是同一个值)。l例:public final int i1 = 3;
Object 类
在 Java 中定义一个类时,如果没有用 extends 明确标明直接父类,那么该类默认继承 Object 类,因此,Object 类是所有类的父类,或者说,Java 中任何一个类都是Object 的子类。
常用的方法
1、toString 方法:“System.out.println(cus);”会自动调用其toString方法,例:
package object; public class Student {//默认继承Object类 private String name; public Student (String name){ this.name = name; } public String toString(){//重写从Object继承过来的 toString 方法 return this.name; } public static void main(String[] args){ Student cus = new Student("张三"); System.out.println(cus);//输出张三 } }
注:如果没有重写,输出的会是对象的地址
2、equals方法
package object; public class Student{//默认继承Object类 private String name; public Student(String name){ this.name = name; } public boolean equals(Student cus){//如果不重写,将比较两个对象的地址 if(name.equals(cus.name)){ return true; } return false; } public static void main(String[] args){ Student cus1 = new Student("张三"); Student cus2 = new Student("张三"); System.out.println(cus1.equals(cus2)); } }
注:“==”号不能用在这里,除非两个引用指向同一对象,这两个引用用“==”判断才会相等。而且判断两个字符串相等,也不能用“==”。