java知识总结——基本概念(二)
说明
本文仅仅为了博主面试时方便查阅与梳理相关知识,如果有错误与不到位的地方,欢迎大佬指点改正,谢谢!
阅读书籍:《java程序员面试笔试宝典》
一、为什么java中有的接口没有任何方法?
java不支持多重继承,一个类只有一个父类,为了克服单继承的缺点,java语言引入了接口这个概念。由于一个类可以实现多个接口,因此通常可以采用实现多个接口的方式来间接达到多重继承的目的。
接口:接口是抽象方法定义的集合(接口中也可以定义一些常量值),是一种特殊的抽象类。接口中只包含方法的定义,没有方法的实现。java8开始,接口可以默认方法与静态方法。接口中的所有方法都是抽象的。接口中成员的作用域修饰符都是public,接口中的常量值默认使用public static final修饰。
在java语言中,有些接口内部没有声明任何方法,即实现这些接口的类不需要重写任何方法,这些没有任何方法声明的接口被称作标识接口。标识接口对实现它的类没有任何语义上的要求,它仅仅充当一个标志的作用,用来表明实现它的类属于一个特定的类型。
java类库中已存在的标识接口有Cloneable和Serializable接口等。在使用时经常使用instanceof来判断实例对象的类型是否实现了一个给定的标识接口。
二、java中的clone()方法
java语言中取消了指针的概念,但这只是在java语言中没有明确提供指针的概念与用法,二实质上每个new语句返回的都是一个指针的引用。
java在处理基本数据类型时,都是采用安置传递(传递的是输入参数的赋值)的方式执行,除此之外的其他类型都是按引用传递(传递的是对象的一个引用)的方式执行。对象处理在函数调用时是引用传递,在使用“=”赋值时也采用引用传递。
在实际编程中,经常会遇到从某个已有的对象A创建出另外一个与A具有相同状态的对象B,并且对B的修改不会影响到A的状态。而在java语言中,通过简单的赋值操作无法达到这个目的,因此java提供了一个简单有效的方法clone()。
java中的所有默认类都继承自Object类,而Object类提供了一个clone()方法,这个方法的作用是返回一个Object对象的赋值。这个赋值函数返回的是一个新的对象而不是一个引用。
使用clone()方法的步骤
1、实现clone()的类首先需要继承Cloneable接口。Cloneable接口实质上是一个标识接口,没有任何接口方法。
2、在类中重写Object类中的clone()方法。
3、在clone()方法中调用super.clone()。无论clone类的继承结构是什么,super.clone()都会直接或间接调用java.lang.Object类的clone()方法。
4、把浅复制的引用指向原型对象新的克隆体。
浅复制和深复制的区别
浅复制(Shallow Clone):被复制对象的所有变量都含有与原来对象相同的值,而所有对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不赋值它所引用的对象。
深复制(Deep Clone):被复制对象的所有变量都含有与原来对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制的新对象,而不再是原有的那些被引用的变量。即深复制把复制的对象所引用的对象都复制了一遍。
clone()方法的保护机制:Object中的clone()是被声明为protected的。
三、什么是反射机制?
反射机制是java语言中一个非常重要的特性,它允许程序在运行时进行自我检查,同时也允许对其内部成员进行操作。由于反射机制能够实现在运行时对类进行装载,因此能够增加程序的灵活性,但是不恰当地使用反射机制,也会严重影响系统的性能。
反射机制提供的主要功能:
1、得到一个对象所属的类;
2、获取一个类的所有成员变量和方法;
3、在运行时(动态地)创建对象;
4、在运行时调用对象的方法。
获取Class类的3中方法:
1、Class.forName(“类的路径”);
2、类名.class;
3、实例.getClass()。
java创建对象的四种方法:
1、通过new语句实例化一个对象;
2、通过反射机制创建对象;
3、通过clone()方法创建一个对象;
4、通过反序列化的方式创建对象。
获取父类类名的方式:
java提供了获取类名的方法:getClass().getName。
注意:java语言中任何类都继承自Object类,getClass()方法在Object类中被定义为final和native,子类不能覆盖该方法。
getClass()的释义:返回此Object的运行时类。
通过java的反射机制,获取父类的名字:
getClass().getSuperClass().getName()
四、package的作用
package(包),是一个比较抽象的逻辑概念,其宗旨是把.java文件(java源文件)、.class文件(编译后的文件)以及其他resource文件(如.xml文件)有条理地进行组织,以供使用。
package的作用:
1、提供多层命名空间,解决命名冲突,通过使用package,使得处于不同package的类可以存在相同的名字;
2、对类按功能进行分类,使项目的组织更加清晰。
package的用法
1、在每个源文件的开头加上“package packagename;”,然后源文件所在目录下创建一个新目录,名称为packagename;
2、用javac指令编译每个sourcename.java源文件,将生成的sourecename.classname文件复制到packagename目录;
3、用java指令运行程序:java packagename.sourcename。
五、java中实现类似C语言中函数指针的功能
回调函数:指函数先在某处注册,而它将在稍后某个需要的时候被调用。回调函数一般用于截获消息、获取系统信息或处理异步事件。
利用接口与类来实现同样的效果。先定义一个接口,然后在接口中声明要调用的方法,接着实现这个接口,最后把这个实现类的一个对象作为参数传递给调用程序,调用程序通过这个参数来调用指定的方法,从而实现回调函数的功能。