构造方法也叫构造器或者构造函数。它的作用是创建对象,通过new关键字来调用。继承的概念很简单,就是子类继承父类,其作用是子类能够继承父类的非私有部分的属性和方法,可以简化代码量,提高代码的复用率。其中在使用构造方法和类的继承时,又牵扯到几个概念:
1.方法的重载(overload):一个类中可以有多个同名的方法,方法的参数不同(数据类型和数量)
2.方法的重写(override):子类可以重写父类的方法。
3.自动转型:子类对象可以转换成父类类型。
在介绍了类的继承与构造方法的概念之后,好像还不能更好的理解,那么我们通过几个例子来帮助我们理解他们的概念及其一些特性。
1.创建一个学生类
Public class Student{
Private String name;
//创建一个学习方法
Public void study(){
System.out.println(“在学习”);
}
//创建一个玩耍方法
Public void play(){
System.out.println(name+“在玩游戏”);
}
//创建一个有参数的构造函数(是一个构造函数)
Public Student(String stuName){
name=stuName;
//输出一句话,为了观察此构造函数是否被调用
System.out.println(“一个有参数的构造函数创建对象”);
}
//创建一个无参数的构造函数
Public Student(){}
}
2.创建一个高中生类,继承学生类
Public class MiddleStudent extents Student{
/*高中生类继承了父类的学习方法,但又想对其内容进行一些修改时,就需要使用方法的重写来实现了*/
Public void study(){
System.out.println(“备战高考中。。。”);
}
}
3.创建一个大学生类,继承学生类
Public class UNStudent extents Student{
//方法的重写
Public void study(){
System.out.println(“我是大学生,我有自己的学习方法”);
}
//大学生特有的方法
Public void cet4(){
System.out.println(“考四级!”);
}
}
4.创建一个测试类,用来编译运行以上三个类
Public class Test{
//主方法,是一个程序的入口
Public static void main(String[] args){
Student stu0=new Student(“张三”);
//将大学生类,高中生类自动转型为学生类
Student stu1=new UNStudent();
Student stu2=new MiddleStudent();
/*学生对象调用学习方法和玩耍方法,调用同一个对象的同一个方法,观察运行结果的不同之处*/
stu1.study();
stu2.study();
stu0.play();
stu1.play();
stu2.play();
}
}
编译运行Test得到如下结果
从以上结果可以看出,stu0,stu1,stu2都是学生类型的对象,当stu1,stu2都调用sudy()方法时得到的结果分别是我是大学生,我有我的方法;备战高考中。。。并且从输出结果可以判断出stu1,stu2对象调用的学习方法是被重写后的方法;当stu0,stu1都调用play()方法时得到的结果分别是张三在玩游戏,null在玩游戏。
在对代码进行分析,本来stu1是属于大学生类的对象,而stu2是属于高中生类的对象,现在两者都属于学生类对象,说明发生了类型的转换,再观察构造函数,可以发现其函数名和它的类同名,由此可以的出一下一些结论:
1.方法的重写:子类可以重写父类的方法,此时子类对象来调用此方法,则优先调用重写后的方法。
2.自动转型:子类对象可以自动转换成父类类型,此时只能调用父类中有的方法,如果该方法被子类重写,那么 优先调用被重写后的方法,可以用以下符号表示:
A extents B
B b=new A();
3.强制转型:父类对象可以转换成之类类型,可以用以下符号表示:
A extents B
B b=new B();
A a=(A)b;
4.多态:同一类型的对象调用相同的方法,出现的结果不一定相同,出现多态的原因是类的继承与方法的重写。
5.构造方法(构造器/构造函数):作用是创建对象,该方法由new关键字来调用,
其特点是:
(1)在Java中每个类都默认有一个无参数的构造方法(如果在此类中定义了其他的构造方法,则此默认方 法就失效)
(2)构造方法的名称与类同名
(3)构造方法不需要定义返回值
6.方法的重载:一个类中可以有多个同名的方法(构造方法就属于方法的重载),方法的参数不同(数据类型, 数量不同)
此外,补充一点知识:
接口(interface):它是一种特殊的类,接口中的方法都是抽象方法
抽象方法:没有方法体的方法
类的对象可以通过它的构造函数创建,而接口则不可以,接口创建对象主要有以下两种方式:
Public interface C{
Public void doSomething();
}
方式一:使用匿名内部类来创建
C c=new C(){
//实现C中的抽象方法
Public void doSomething(){
//加上方法体
}
};
方式二:通过接口的实现类(子类)构造对象,在自动转型为接口类型即可
跟类与类的继承关系类似,类与接口的关系是实现关系(implements)
实现(跟继承关系是同种意思):一个类去实现接口,必须将接口中所有的抽象方法实现。
A类实现了C接口
Public class A implements C{
//实现C中的抽象方法
Public void doSomething(){
//加方法体
}
}
C a=new A();//自动转型为接口类型
注:在Java中,一个类可以同时实现多个接口,而在类与类的继承关系中,一个子类只能有一个父类,即单根继 承!