Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.1基本概念(4.1.8-4.1.9)
2017-05-28 18:12
821 查看
4.1.8什么是构造函数
具体实例分析详见上一篇博文http://blog.csdn.net/qq_28814687/article/details/72781820,此处只是总结归纳构造函数是用来在对象实例化时初始化对象的成员变量的函数
在Java中,构造函数具有如下特点:
1>构造函数必须与类同名,且不能有返回值(返回值也不能为void);
2>每个类可以有多个构造函数,如果开发人员没有提供构造函数(显示的在类中定义),编译器会在把源代码编译成字节码的过程中提供一个没有参数默认的构造函数。如果在类中提供了构造函数,那么编译器就不会再创建默认的构造函数了。
3>构造函数可以有0个、1个或1个以上的参数。
4>构造函数必须和new一起使用,由系统调用,即形如A a = new A()。构造函数是在对象实例化时自动被调用,且一个对象只运行一次;普通方法是在程序执行到它时被调用,且可以被同一对象调用多次。
5>构造函数不可以被继承,所以不可以被重写,但是可以被重载,可以使用不同的参数定义多个构造函数
6>子类可以通过super关键字显式的调用父类的构造函数。当父类没有提供无参构造函数,子类构造函数中必须显式的调用父类的构造函数;如果父类提供了无参构造函数,子类可以不显式的调用父类的无参构造函数,编译器会默认调用父类提供的无参构造函数;如果父类中没有显式的无参构造函数,子类中又没有显式的调用,那么在子类的无参构造函数中就会出错。当有父类时,在实例化对象是会先执行父类的构造函数,然后执行子类的构造函数。
7>当父类和子类都没定义构造函数时,编译器会为父类生成一个默认的无参数构造函数,给子类也生成一个默认的无参数构造函数。默认构造函数额类型修饰符只和当前类的修饰符有关(类为public,那么它的构造函数也是public)。
普通方法是可以和构造函数有相同的方法名,因为构造函数没有返回值,普通方法加了返回值以后,在Java的语法里面算是两个不同的方法,所以是允许的。不过为了便于代码理解,一般不这么做
4.1.9为什么Java中有些接口没有任何方法
由于Java不支持多重继承,即一个类只能有一个父类,为了克服单继承的缺点,Java引入了接口的概念。接口是抽象方法定义的集合,也可以定义一些常量值,是一种特殊的抽象类。接口中只包含方法的定义,没有方法的实现,因为接口是抽象方法的集合,所以当然接口中的所有方法都是抽象的,无论是否把这些方法显示的声明为abstract。接口中的成员作用域修饰符都是public,接口中的常量默认使用public static final修饰。一个类可以实现多个接口,使用implements加接口名,如果有多个接口,用逗号隔开,然后重写实现的所有接口的成员方法。
有些接口内部没有声明任何方法,也就是说,实现这些接口的类不需要重写任何方法,这些没有任何方法声明的接口又被叫做标识接口,标识接口对他的类没有任何语义上的要求,仅仅充当一个标识的作用,用来表明实现它的类属于一个特定的类型。Java类库中已存在的标识接口有Cloneable和Serializable等。在使用时会经常用到instanceof来判断实例对象的类型是否实现了一个给定的标识接口。
下面的实例详细说明标识接口的作用。程序需求如下:要开发一款游戏,游戏里面有一个任务专门出去负责寻找有用的材料,假设这个人物只负责收集矿石和武器,而不会收集垃圾。
下面通过标识接口来实现这个功能:
Stuff.java
public interface Stuff { }
Ore.java
public interface Ore extends Stuff{ }
Weapon.java
public interface Weapon extends Stuff{ }
Rubbish.java
public interface Rubbish extends Stuff{ }
Gold.java
public class Gold implements Ore{ public String toString(){ return "Gold Ore"; } }
Gun.java
public class Gun implements Weapon{ public String toString(){ return "Gun Weapon"; } }
Stone.java
public class Stone implements Rubbish{ public String toString(){ return "Stone Rubbish"; } }
Test,java
import java.util.ArrayList; public class Test { public static ArrayList<Stuff> collectStuff(Stuff[] s){ ArrayList<Stuff> al = new ArrayList<>(); for(int i=0;i<s.length;i++) { //判断是否是无用的材料 if(!(s[i] instanceof Rubbish)) al.add(s[i]); } return al; } public static void main(String[] args) { Stuff[] s={new Gold(),new Gun(),new Stone()}; ArrayList<Stuff> als = collectStuff(s); System.out.println("The useful Stuff collected is:"); for(int i=0;i<als.size();i++) { System.out.println(als.get(i)); } } }
运行结果:
The useful Stuff collected is:
Gold Ore
Gun Weapon
相关文章推荐
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.1基本概念(4.1.6-4.1.7)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.1基本概念(4.1.2)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.1基本概念(4.1.10)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.1基本概念(4.1.3)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.1基本概念(4.1.11-4.1.12)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.1基本概念(4.1.1)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.4基本类型与运算(4.4.5-4.4.10)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.4基本类型与运算(4.4.1)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.6异常处理(4.6.1-4.6.3)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.3关键字(4.3.4-4.3.6)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.2面向对象技术(4.2.1-4.2.2)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.2面向对象技术(4.2.3-4.2.5)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.7输入输出流(4.7.4-4.7.6)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.2面向对象技术(4.2.6)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.2面向对象技术(4.2.10-4.2.11)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.10多线程(4.10.1-4.10.4)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.5字符串与数组(4.5.4-4.5.6)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.3关键字(4.3.7-4.3.9)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.2面向对象技术(4.2.7-4.2.9)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.11Java数据库操作(4.11.1-4.11.8)