课堂知识整理

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();//即答案  
     }  
}  







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值