2017/3/13
1.为什么要把变量设置为私有,get/set方法设置为共有?
封装。函数比变量更加灵活,可以增加未来修改的灵活性。当不是直接return变量,而是需要多条语句组合进行计算的时候会更方便。
2.匿名内部类是什么?(借鉴此文章 http://www.cnblogs.com/nerxious/archive/2013/01/25/2876489.html)
匿名内部类就是没有名字的内部类,正因为没有名字,所以匿名内部类只能使用一次,通常用来简化代码编写。
使用匿名内部类的前提:必须继承一个父类或实现一个接口。
实例1:不使用匿名内部类来实现抽象方法
abstract class Animal{
public abstract void eat();
}
class Tiger extends Animal{
public void eat(){
System.out.println("eat meat!");
}
}
public class Demo{
public static void main(String[] args){
Animal a = new Tiger();
a.eat();
}
}
运行结果: eat meat!
Tiger类继承了Animal类,然后实现了Tiger的一个实例,将其向上转型为Animal类的引用。
但是如果此处的Tiger类只使用一次,将其编写为一个独立的类很麻烦,此时引入匿名内部类。
实例2:匿名内部类的基本实现
abstract class Animal{
public abstract void eat();
}
public void eat(){
System.out.println("eat meat!");
}
}
public class Demo{
public static void main(String[] args){
Animal a = new Animal(){
public void eat(){
System.out.println("eat meat!");
}
};
a.eat();
}
}
运行结果:eat meat!
直接将抽象类Animal中的方法在大括号中实现了,可以省略一个类的书写。
实例3:在接口上使用匿名内部类
interface Person {
public void eat();
}
public class Demo {
public static void main(String[] args) {
Person p = new Person() {
public void eat() {
System.out.println("eat something");
}
};
p.eat();
}
}
由以上可知,只要一个类是抽象的或是一个接口,那么其子类中的方法都可以使用匿名内部类实现
最常用的情况是在多线程的实现上,因为要实现多线程必须继承Thread类或是继承Runnable接口
实例4:Thread类的匿名内部类实现
public class Demo {
public static void main(String[] args) {
Thread t = new Thread() {
public void run() {
for (int i = 1; i <= 5; i++) {
System.out.print(i + " ");
}
}
};
t.start();
}
}
运行结果:1 2 3 4 5
实例5:Runnable接口的匿名内部类实现
public class Demo {
public static void main(String[] args) {
Runnable r = new Runnable() {
public void run() {
for (int i = 1; i <= 5; i++) {
System.out.print(i + " ");
}
}
};
Thread t = new Thread(r);
t.start();
}
}
运行结果: 1 2 3 4 5
3.构造函数是用来干嘛的?
构造函数用来在创建对象时完成对对象属性的一些初始化等操作,当创建对象时,对象会自动调用它的构造函数。
一般来说,构造函数有以下几方面的作用:
①给创建的对象建立一个标识符
②为对象数据成员开辟内存空间
③完成对象数据成员的初始化
2017/03/26
1.Q: C++ 里string类中size()和length()的区别
A:没有区别。C++ Reference中对于String字符串中函数 size和length的解释是这样的:
size Return length of string
length Return length of string
两者的微小区别就是:
size() 一般用作返回容器大小的方法
length() 一般用作返回一个序列的长度
但是无论用size还是length,返回的结果都是一样的。
2.Q:Java中length、length()和size()的区别
1.Java中的length属性是针对数组说的,比如知道数组的长度。
2.length()方法是针对字符串String说的,用来返回字符串的长度。
3.size()方法是针对泛型集合说的,返回泛型中元素个数。
2017/4/02什么是java模板类
给定一个带模板参数的类
class A<T>
{
}
如何在运行时获取 T的类型?
java中没有直接方法来获取T.Class. (至少JDK 1.7以前不可能)
其根本原因在于: Java语言是支持反射的,但是JVM不支持,因为JVM具有“Type erasure”的特性,也就是“类型擦除”。
但是Java无绝人之路,我们依旧可以通过其他方法来达到我们的需求。
方法1. 通过构造函数传入实际类别. 【有人说这个方法不帅气,但是不可否认,这种方法没有用到反射,但是最为高效,反射本身就不是高效的。】
public class A<T>
{
private final Class<T> clazz;
public A<T>(Class<T> clazz)
{
this.clazz = clazz;
}
// Use clazz in here
}
方法2. 通过继承这个类的时候传入模板T对应的实际类:(定义成抽象类也可以)
class A<T>{
public Class getTClass(int index) {
Type genType = getClass().getGenericSuperclass();
if (!(genType instanceof ParameterizedType))
{
return Object.class;
}
<span style="white-space:pre"> </span> Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
<span style="white-space:pre"> </span> if (index >= params.length || index < 0) {
<span style="white-space:pre"> </span> <span style="white-space:pre"> </span>throw new RuntimeException("Index out of bounds");
<span style="white-space:pre"> </span> }
<span style="white-space:pre"> </span> if (!(params[index] instanceof Class)) {
<span style="white-space:pre"> </span> return Object.class;
<span style="white-space:pre"> </span> }
<span style="white-space:pre"> </span> return (Class) params[index];
}
}
继承类:
public class B extends A<String> {
public static void main(String[] args) {
B bb =new B();
bb.getTClass();//即答案
}
}