JavaSE学习笔记(2)

面试题:简单叙述以下以下三个关键字有什么区别?

Enum                    à 枚举类默认继承的类

Enumeration        à 早期的迭代器类型,主要用于Vector和顺序流

enum                    à 定义一个类为枚举时候的关键字

u  泛型

问题:如果不使用泛型,那么请看下面的代码发生的转型异常?

public static void printList(List list){

for(Object temp:list){

String str = (String) temp;

System.out.println(temp);

}

}

public static void main(String[] args) {

List  list = new ArrayList();

list.add("aaa");

list.add(123);

list.add("bbb");

printList(list);

}

因此我们在实际的开发环境中需要进行泛型的使用。通过使用泛型我们可以约束在集合中存储的对象的类型。

泛型其实就是给容器上贴一个标签而已,指定容器存放的数据类型。

泛型的有点其实就是将运行时候的异常前置在编译时解决。

泛型的使用

原则“使用泛型的时候左右两边要一致!”

List  list = new ArrayList<String>();     add提示的是Object

List<String>  list = new ArrayList ();    add提示的是String

List<String>  list = new ArrayList<String>();  add提示的是String

以上的语法全对,但是推荐使用第三种。

泛型的自定义

如果在定义一个类的时候成员的类型不明确,那么可以先使用泛型进行代替,直到创建该类的对象的时候可以使用具体的数据类型来替换泛型的类型。

举例1:定义一个方法返回任意数据类型的数据。

public static <T> T returnType(T t){

return t;

}

如果一个类中很多地方都使用到了泛型,那么可以将泛型的定义放在类上。

public class Demo1<T>{

// 非静态成员都可以直接使用T泛型

}

如果是静态成员那么不能使用类上定义好的泛型。如果需要的话需要单独的进行声明。

泛型的继承和实现

public interface List<E> extends Collection<E>

public class Person implements Comparable<Person>

compareTo(T o)

泛型的通配符

举例1: 实现一个方法可以打印输出任意集合数据?

// 提供一个输出任意集合数据的方法

// Collection<Object> coll = new ArrayList<String>()

public static void printCollection(Collection<?> coll){

for(Object temp:coll){

System.out.println(temp);

}

}

泛型的限定

在通配符的基础上可以对实际的类型进行基本的限制

? extends 父类

? super 子类

举例2:实现数字集合的输出。

public static void printCollection(Collection<? extends Number> coll){

for(Object temp:coll){

System.out.println(temp);

}

}

实战:

查看List的boolean addAll(Collection<? extends E> c) 方法

注意:

在给泛型传递实际的数据类型的时候必须是对象类型,如果是基本数据类型那么默认会自动的进行装箱操作。

u  反射(Reflect)

反射即将Class类中的所有的成员映射为相应的对象。

要学习反射那么需要先了解和掌握以下几个类:



描述


Class


描述所有的Class文件的共性


Filed


描述的是Class文件的中的属性的共性


Constructor


描述的是Class文件中的构造函数的共性


Method


描述的是Class文件中的函数的共性

1. 获取指定类的Class对象

方式一: 类名.class

方式二: 对象名.getClass()

方式三: forName(String className) 该方法是Class类的静态方法   推荐

举例1: 获取字符串类的Class对象。

public static void main(String[] args)throws Exception {

// 使用不同的方式会过去Class对象

Class clazz1 = String.class;

Class clazz2 = new String("jnb").getClass();

// 参数必须指定类的全名(类的全限定名)

Class clazz3 = Class.forName("java.lang.String");

// class文件时候独一无二的,那么Class对象也应该是单例的

System.out.println(clazz1 == clazz2);   // true

System.out.println(clazz2 == clazz3);   // true

}

以上的方式都可以获取指定类的Class对象,在实际的开发中到底要使用哪一个?

一般的情况下我们都需要在不知道类名的情况下获取类的Class对象并进而获取类中包含的成员进行操作。

大家可以参考Tomcat的一个基本的server.xml文件

<Resource name="UserDatabase" auth="Container"

type="org.apache.catalina.UserDatabase"

description="User database that can be updated and saved"

factory="org.apache.catalina.users.MemoryUserDatabaseFactory" à 类

pathname="conf/tomcat-users.xml" />

2. 将Class对象中的属性进行反射为Filed对象

常用的获取属性字段的方法


方法


描述


Field[] getDeclaredFields()


获取所有声明的字段数组对象


Field[] getFields()


获取所有的声明的共有字段数组对象


Field getDeclaredField(String name)


获取指定名称的声明的字段对象


Field getField(String name)


获取指定名称的声明的共有字段对象

举例1:获取所有的声明字段数组对象。

public static void main(String[] args)throws Exception {

// 获取Shape类的Class对象

Class clazz = Class.forName("cn.itcast.bean.Shape");

// 获取所有的属性

Field [] fs = clazz.getDeclaredFields();

System.out.println(fs.length);   // 2

// 获取所有共有的属性

fs = clazz.getFields();

System.out.println(fs.length);   // 1

// 获取指定名字的私有的属性

Field field = clazz.getDeclaredField("x");

System.out.println(field);

// 获取指定名字的共有的属性

field = clazz.getField("y");

System.out.println(field);

}

举例2:调用Field类的方法进行字段对象的操作。

u  内省

u  BeanUtils工具

总结

大家主要要掌握以下几点内容:

增强for循环,而且必须要清楚底层采用的是迭代器进行的迭代。

安全的枚举,全部要会。枚举是单例的,有时候在项目中如果要使用单例,那么可以使用枚举。

泛型的应用。

练习

  1. 使用Properties类读取配置文件中的属性值。
  2. 使用Properties配置一个以下的值:

class=java.lang.String

使用程序获取指定类的Class对象进行属性对象的反射。

时间: 2024-07-29 09:23:44

JavaSE学习笔记(2)的相关文章

javasE学习笔记:关键字super的使用

/* super 的作用: 1 . super可以在子类中引用父类的成员,通过 .的方式和属性.this相对应. 2. 在子类的构造方法中可以可使用super(参数列表)语句调用父类的构造方法 3. 注意: 子类的构造方法中一定要调用父类的构造方法.... */ javasE学习笔记:关键字super的使用,布布扣,bubuko.com

JavaSE学习笔记(五)——类与对象

一.  类和对象 1.1           面向对象与面向过程的区别 1.面向过程 采用面向过程必须了解整个过程,每个步骤都有因果关系,每个因果关系都构成了一个步骤,多个步骤就构成了一个系统,因为存在因果关系每个步骤很难分离,非常紧密,耦合度高,当任何一步骤出现问题,将会影响到所有的系统.如:采用面向过程生产电脑,那么他不会分CPU.主板和硬盘,它会按照电脑的工作流程一次成型. 2.面向对象 面向对象对会将现实世界分割成不同的单元(对象),实现各个对象,如果完成某个功能,只需要将各个对象协作起

JavaSE学习笔记(一)———Java简介与基础

一.  Java语言简介 1.1           计算机语言的发展过程 计算机语言发展主要分为三个阶段: 1.第一代:机器语言 2.第二代:低级语言 3.第三代:高级语言 1.2           Java发展简史 1.Java 是一种程序开发语言,既然是一门语言,就像其他语言一样,具备一定的语法 和自己的数据结构. 2.Java语言来源于sun公司,sun指的是斯坦福大学网络.由james gosling领导并开发. Java语言的具体发展历程 1991~1995  Sun 为了占领智能

javaSE学习笔记—HTTP协议(10)

客户端浏览器和服务器Tomcat要进行基本的请求和响应的处理. 其实浏览器和服务器通信的数据的格式已经使用协议进行固定好了,只要双方发送固定格式的数据,那么就可以完成基本的通信. 如果开发者需要查看这样的数据格式,那么就需要安装一个浏览器的HTTP协议相关的插件. 如果要深入的学习浏览器和服务器通信的数据,那么需要详细的掌握他们之间发送的数据内容. 1  请求信息 GET / HTTP/1.1 ? 请求行 Accept: */* Accept-Language: zh-cn,en-US;q=0.

javase学习笔记]-7.7 this之细节与应用

这一节我们接着上一节来继续学习this关键字. 我们之前在7.5节中的构造函数应注意的细节中提到过一个细节就是构造函数可以调用一般函数,但一般函数不能直接调用构造函数.但是我们没有深究构造函数能不能调用构造函数,那么现在我们就来看一看这个问题. 那么构造函数与构造函数之间是怎么访问呢? 为了掌握这个问题,我们必须要明确一个概念,那就是在一个类中的成员如果要被执行,就必须由对象调用.而每个对象都有一个所属的this. java语言给了关键字this这个功能,那就是用this调用构造函数,而且也是通

[javase学习笔记]-6.2 类与对象的关系

这一节我们来看一下类与对象之间的关系. 我们学习java语言,目的就是用java语言对现实生活中的事物进行描写叙述.那么我们如何来描写叙述呢.这就引出了类,我们在实际实现时,是通过类的形式来体现的. 那么对于现实生活中的事物怎样描写叙述呢? 我们在现实生活中对于事物描写叙述通常仅仅关注两个方面,一个是属性,还有一个就是行为. 那么非常自然.计算机的描写叙述就产生出详细的对象. 比方我们要描写叙述一个小汽车.那么我们要怎么描写叙述呢?通过上面关注两个方面,我们非常轻松的从两个方面进行下面描写叙述:

[javase学习笔记]-7.5 构造函数须要注意的几个细节

这一节我们简单的说几个在使用构造函数时须要注意的细节. 通过我们前几节的学习,我们对构造函数有了一个比較清楚的认识,当我们在创建对象时.我们会调用构造函数.那么我们在定义和调用构造函数时.须要注意哪些细节呢? 第一个须要注意的细节:构造函数与set方法 看两个函数代码: class Person { private String name; private int age; //构造函数,初始化name Person(String n) { name = n; System.out.printl

[javase学习笔记]-8.1 statickeyword之特点

这一节我们来学习java语言中一个新的keyword就是statickeyword. 当然对于每个keyword,我们都要明白的是它有什么作用,怎么用.我们先来看一个样例: class Person { String name;//姓名 String country = "中国";//国籍 public void printInfo() { System.out.println(name+":"+country); } } class StaticTest { pu

[javase学习笔记]-7.4 构造函数的内存加载

这一节我们来说说构造函数在内存中是如何被加载的. 我们之前说过,构造函数只有创建对象时才会被调用并且只调用一次.那么在创建对象的过程中内存中的变化是什么样的呢? 我们接着上一节的Person类,我们分析 class Person { private String name; private int age; Person()//构造函数,分别为成员变量name和age赋固定的值 { name = "baby"; age = 1; System.out.println("per

[javase学习笔记]-7.5 构造函数需要注意的几个细节

这一节我们简单的说几个在使用构造函数时需要注意的细节. 通过我们前几节的学习,我们对构造函数有了一个比较清楚的认识,当我们在创建对象时,我们会调用构造函数.那么我们在定义和调用构造函数时,需要注意哪些细节呢? 第一个需要注意的细节:构造函数与set方法 看两个函数代码: class Person { private String name; private int age; //构造函数,初始化name Person(String n) { name = n; System.out.printl