课堂知识整理

来源:互联网 发布:开淘宝店需要什么资料 编辑:程序博客网 时间:2024/05/18 01:13

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