Java基础——构造函数、抽象类、父类构造方法初始化
——小实例快速成长
构造函数:
1.在对象初始化时调用,方法名与类名完全相同;
2.构造函数可写,也可以不写;如果不写,系统将当做写了一个无参构造函数处理;
3.不能写返回值类型;
4.不能使用static修饰符。
5.一个类可以同时存在多个构造函数,这些构造函数之间呈重载关系——即函数名相同,参数类型或参数个数不同。
6.如果类中已写了构造函数,那在对象初始化时,系统将去搜索符合条件的对应构造函数。
7.特注:如果类中已写有参构造函数,没重载无参构造函数。在初始化时,却去调用无参构造函数(如例中的第3句代码),编译将无法通过,报错“实际参数列表和形式参数列表长度不同”。
抽象类(关键字abstract):
1.先继承,再使用;不能直接实例化,通过非抽象类继承后,才能实例化对象。
2.类中含有抽象方法,那这个类需要声明为抽象类。(含有抽象方法的类,必须为抽象类)
3.抽象方法:只声明,不含方法体;
4.在子类中必须实现父类(肯定是抽象类)所有抽象方法。
父类构造方法初始化(关键字super):
1.显示调用父类构造方法——用super();
2.若显示调用,必须将super()方法写在最前面;
3.若不显示调用,则要求父类必须写了‘无参构造函数’,系统会自动调用,否则报错“实际参数列表和形式参数列表长度不同”。
示例代码:
<pre name="code" class="java">public class TestBase{ public static void main(String[] args) { //Cat cat1 = new Cat(); //提示“实际参数列表和形式参数列表长度不同”的错误 Cat cat2 = new Cat("波斯"); Wolf wolf1 = new Wolf(); Wolf wolf2 = new Wolf("蒙古狼"); Tiger tiger = new Tiger(); tiger.eat("肉"); }}//抽象类abstract class Animal{ String Food; protected String Name; //无参构造函数 public Animal(){System.out.println("父类 无参构造方法!\n");} //有参构造函数 public Animal(String name){this.Name = name;System.out.println(Name + "的 父类 有参构造方法!\n");} //抽象方法 abstract void eat(String food);}//继承 父类Animal class Cat extends Animal{ //有参构造函数 public Cat(String name){//初始化父类构造方法super(name);System.out.println("子类Cat有参构造函数!\n");} public void eat(String food) {//成员变量Food继承自父类——protected成员变量this.Food = food;System.out.println("猫以"+food+"为食!\n");}}//继承 父类Animalclass Wolf extends Animal{ //无参构造方法 public Wolf(){//非显示调用父类构造方法,当程序使用本无参构造方法是,系统将自动调用父类无参构造方法//检验————无参构造函数调用的时机System.out.println("调用了Wolf类的无参构造方法!\n");} public Wolf(String name){//非显示调用父类构造方法,当程序使用本有参构造方法是,系统将自动调用父类无参构造方法//成员变量Name继承自父类——public成员变量this.Name = name;System.out.println("子类Wolf有参构造函数!\n");} public void eat(String food) {//成员变量Food继承自父类——protected成员变量this.Food = food;System.out.println("狼以"+food+"为食!\n");}}//继承 父类Animalclass Tiger extends Animal{ public void eat(String food) {this.Name = "东北虎";System.out.println("我的名字叫:" + Name + "; 我以" + food + "为食!\n");}}
运行效果图:
可是我知道结果是惨淡的,但还是心存希望!