一、普通类
1、类的格式
2、Java构造方法的特点
- 构造方法必须具备和所在类相同的名字
- 构造方法没有返回值类型,void也不能有
- 构造方法是在创建一个对象使用new操作符时调用,构造方法的作用是初始化对象。
- 类可以不定义构造方法,会在类中隐含定义一个方法体为空的无参构造方法,称为默认构造方法,当且仅当类中没有明确定义任何构造方法时才会自动调用默认构造方法
二、父子类
1、java不许多重继承,即允许从几个类派生 出一个子类,只能单一继承,通过extends关键字定义一个子类。多重继承可以通过接口来实现。
2、父类的构造方法不会被子类继承。当子类实例化时,不仅要初始化子类成员变量,也要初始化父类成员变量,初始化父类成员变量需要调用父类构造方法,子类使用super关键字调用父类构造方法。
super语法:
super();//调用父类的无参构造方法
super(parameters);//调用父类的有参构造方法
super语句必须放在子类构造方法的第一行(句)。如果没有使用super语句,编译器会自动地将super()作为构造方法的第一条语句;
应用举例如下:
说明:图中①②均为调用父类构造方法,③没有使用super语句,编译器会调用父类的默认构造方法,但是父类Person并没有默认构造方法,因此该处会发生编译错误。
super关键字可以调用父类的构造方法,调用父类的方法。
3、方法的重写和重载
(1)方法重写(覆盖):子类从父类中继承方法,有时子类需要修改父类中定义的方法,即需要在子类中使用和父类一样的签名以及一样的返回类型来对方法进行定义。简单说是子类方法与父类方法完全相同,即相同的方法名、相同的参数列表和相同的返回值,只是方法体不同,成为子类覆盖父类方法。
- 在子类覆盖父类的方法是要注意子类方法不能缩小父类方法的访问权限。
(2)方法重载:使用相同的名字但是不同的签名来定义多个方法。
注意不同点:
- 方法的重写发生在通过继承而相关的不同类中;方法的重载可以发生在同一个类中,也可以发生在由于继承而相关的不同类中。
- 方法的重写具有相同的签名和返回值类型;方法重载具有相同的名字,但是不同的参数列表。
(3)方法重写和重载的判断依据
- 如果方法名、参数和返回类型都一致,那么可以说是子类的方法覆盖了父类的方法。
- 如果方法同名,参数个数或类型不同,这时无需看返回类型,属于重载。
应用举例:
图a)为方法的重写,类A中的方法p(doube i)重写了B类中定义的相同的方法;图b)中,类A中有两个重载方法p(double i)和p(int i)。
同时注意运行结果的不同,运行a中的Test类时,a.p(10),a.p(10.0)调用的都是定义在类A中的p(double i)方法,输出的结果都为10.0;运行b中的Test类时,a.p(10)调用类A中定义的p(int i)方法,显示输出10,而a.p(10)调用定义在类B中定义的p(double i)方法,输出20.0。
三、抽象类
1、抽象类:抽象类与常规类很像,但是不能使用new操作符创建它的实例,抽象方法只能定义而没有实现,它的实现由子类提供。一个包含抽象方法的类必须声明为抽象类。
2、抽象类注意点:
- 抽象方法不能包含在非抽象类中。如果抽象父类的子类不能实现所有的抽象方法,那么子类必须定义为抽象的。即在抽象类扩展的非抽象子类中,必须实现所有的方法。
- 抽象方法是非静态的。抽象类不能用new来初始化。
- 包含抽象方法的类必须是抽象的,但是可以定义一个包含抽象方法的抽象类。
- 即使子类的父类是具体的,这个子类也可以是抽象的。
3、语法结构
修饰符 abstrct 抽象类名{
}
应用举例:
public abstract class Employee //抽象类
{
private String name;
private String address;
private int number;
public Employee(String name, String address, int number) //构造方法
{
System.out.println("Constructing an Employee");
this.name = name;
this.address = address;
this.number = number;
}
public double computePay()
{
System.out.println("Inside Employee computePay");
return 0.0;
}
public void mailCheck()
{
System.out.println("Mailing a check to " + this.name
+ " " + this.address);
}
}
继承抽象类
public class Salary extends Employee
{
private double salary; //Annual salary
public Salary(String name, String address, int number, double
salary)
{
super(name, address, number);
setSalary(salary);
}
public void mailCheck()
{
System.out.println("Within mailCheck of Salary class ");
System.out.println("Mailing check to " + getName()
+ " with salary " + salary);
}
public double getSalary()
{
return salary;
}
}
四、接口
1、接口:接口比类更加抽象,接口中的所有的方法都是抽象的。
2、接口与抽象类的不同点:
3、语法结构
修饰符 interface 接口名{
}
修饰符省略是默认访问级别。
举例:
public interface Figure{ //interface前面的修饰符是public或省略
String name ="123";//静态成员变量 省略public static final
void onDraw(); //抽象方法 省略public
}
接口中的成员变量都是静态成员变量,省略了public static final修饰符。
实现接口:实现接口使用implements关键字。