最全Java期末复习速成(八),java并发面试题

写在最后

还有一份JAVA核心知识点整理(PDF):JVM,JAVA集合,JAVA多线程并发,JAVA基础,Spring原理,微服务,Netty与RPC,网络,日志,Zookeeper,Kafka,RabbitMQ,Hbase,MongoDB,Cassandra,设计模式,负载均衡,数据库,一致性哈希,JAVA算法,数据结构,加密算法,分布式缓存,Hadoop,Spark,Storm,YARN,机器学习,云计算…

image

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

for(int i=0; i<arrayList.size();i++){

String item = (String)arrayList.get(i);

System.out.println("test === ", item);

}




这段程序不能正常运行,原因是Integer类型不能直接强制转换为String类型



java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String




如果我们用泛型进行改写后,示例代码如下



List<String arrayList = new ArrayList();

arrayList.add(100);




这段代码在编译期间就会报错,编译器会在编译阶段就能够帮我们发现类似这样的问题。



[]( )泛型的使用

----------------------------------------------------------------------



泛型的使用有多种方式,下面我们就来一起探讨一下。



### []( )用泛型表示类



泛型可以加到类上面,来表示这个类的类型



//此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型

public class GenericDemo{

//value这个成员变量的类型为T,T的类型由外部指定

private T value;



public GenericDemo(T value) {

	this. value = value;

}



public T getValue(){ 		//泛型方法getKey的返回值类型为T,T的类型由外部指定

	return value;

}



public void setValue(T value){

	this.value = value;

}

}




### []( )用泛型表示接口



泛型接口与泛型类的定义及使用基本相同。



//定义一个泛型接口

public interface Generator {

public T next();

}




一般泛型接口常用于 **生成器(generator)** 中,生成器相当于对象工厂,是一种专门用来创建对象的类。



### []( )泛型方法



可以使用泛型来表示方法



public class GenericMethods {

public <T> void f(T x){

	System.out.println(x.getClass().getName());

}

}




### []( )泛型通配符



List是泛型类,为了表示各种泛型List 的父类,可以使用类型通配符,类型通配符使用 **问号(?)** 表示,它的元素类型可以匹配任何类型。例如



public static void main(String[] args) {

List<String> name = new ArrayList<String>();

List<Integer> age = new ArrayList<Integer>();

List<Number> number = new ArrayList<Number>();

name.add("cxuan");

age.add(18);

number.add(314);

generic(name) ;

generic(age);

generic(number);

}

public static void generic(List<?> data) {

System. out.println( "Test cxuan :" + data.get(0));

}




**上界通配符:** <? extends ClassType>该通配符为ClassType 的所有子类型。它表示的是任何类型都是ClassType 类型的子类。



**下界通配符:** <? super ClassType>该通配符为ClassType的所有超类型。它表示的是任何类型的父类都是ClassType。



  



[]( )反射

===================================================================



* * *



  



反射是Java 中一个非常重要同时也是一个高级特性,基本上Spring等一系列框架都是基于反射的思想写成的。我们首先来认识一下什么反射。



**Java反射机制是在程序的运行过程中,对于任何一个类,都能够知道它的所有属性和方法;对于任意一个对象,都能够知道调用它的任意属性和方法,这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。**(来源于百度百科)



Java反射机制主要提供了以下这几个功能



*   在运行时判断任意一个对象所属的类

*   在运行时构造任意一个类的对象

*   在运行时判断任意一个类所有的成员变量和方法

*   在运行时调用任意一个对象的方法



这么一看,反射就像是一个掌控全局的角色,不管你程序怎么运行,我都能够知道你这个类有哪些属性和方法,你这个对象是由谁调用的,嗯,很屌。



在Java中,使用 **Java.lang.reflect** 包实现了反射机制。Java.lang.reflect所设计的类如下



![在这里插入图片描述](https://img-blog.csdnimg.cn/985b85745796492f91005554a84dacd0.png#pic_center)



下面是一个简单的反射类



public class Person {

public String name;//姓名

public int age;//年龄



public Person() {

	super();

}



public Person( String name,int age) {

	super();

	this.name = name;

	this.age = age;

}



public string showInfo() {

	return "name=" +name + ", age=”+age;

}

}

public class Student extends Person implements Study {

public string className;//班级

private string address;//住址



public student(){

	super();

}



public student(String name,int age,String className,String address) {

	super(name,age);

	this.className = className;

	this.address = address;

}



public student(String className) {

	this.className = className;

}



public string toString() {

	return"姓名: " + name + ",年龄;" + age +",班级: "+ className + ",住址:" +address;

}



public String getAddress() {

	return address;

}



public void setAddress(String address) {

	this.address = address;

}

}

public class TestRelect {

public static void main(String[]args) {

Class student = null;

try {

	student -=Class.forName( " com. cxuan.reflection.Student");

}catch (classNotFoundException e) {

	e.printstackTrace();

}



//获取对象的所有公有属性

Field[] fields = student.getFields();

for (Field f : fields) {

	System. out.println(f);

}

System. out.println( "------------")

//获取对象所有属性,但不包含继承的。

Field[] declaredFields = student.getDeclaredFields();

for (Field df : declaredFields) {

	System. out.println(df );

}



//获取对象的所有公共方法

Method[]methods = student.getMethods();

for (Method m : methods) {

	System.out.println(m);

}

System. out.println( "---------------------");



//获取对象所有方法,但不包含继承的

Method[] declaredMethods = student.getDeclaredMethods();

for (Method dm : declaredMethods) {

	System.out.println(dm);

}



//获取对象所有的公共构造方法

Constructor[] constructors = student. getConstructors();

for (constructor c : constructors) {

	System. out.println(c);

}

System. out.println( "---------------------");



//获取对象所有的构造方法

Constructor[] declaredConstructors = student.getDeclaredConstructors();

for (constructor dc : declaredConstructors) {

	System. out.println(dc);

}



Class c = class.forName( "com. cxuan.reflection. Student");

Student stu1 = (Student) c.newInstance();

//第一种方法,实例化默认构造方法,调用set赋值

stu1.setAddress("河北石家庄");

System. out.println(stu1);



//第二种方法取得全部的构造函数使用构造函数赋值

Constructor<Student> constructor = c.getConstructor(String.class,int.class,String.class,string.class);

Student student2 = (Student) constructor .newInstance( " cxuan",24,"六班","石家庄");

System. out.println(student2);



/**

*玃取方法并执行方法

*/

Method show = c.getMethod("showInfo");//获取showInfo()方法

object object = show.invoke(stu2);//调用showInfo()方法

}

}




有一些是比较常用的,有一些是我至今都没见过怎么用的,下面进行一个归类。



与Java反射有关的类主要有



[]( )Class类

-----------------------------------------------------------------------



在Java 中,你每定义一个java class实体都会产生一个 Class对象。也就是说,当我们编写一个类,编译完成后,在生成的\*\*.class\*\*文件中,就会产生一个Class对象,这个Class对象用于表示这个类的类型信息。Class 中没有公共的构造器,也就是说Class对象不能被实例化。下面来简单看一下Class类都包括了哪些方法



**toString()**



public string toString(){

return (isInterface() ? "interface " : (isPrimitive() ? "" : "class "))+getName();

}




toString() 方法能够将对象转换为字符串,toString() 首先会判断Class类型是否是接口类型,也就是说,普通类和接口都能够用Class对象来表示,然后再判断是否是基本数据类型,这里判断的都是基本数据类型和包装类,还有**void** 类型。



所有的类型如下



*   java.lang.Boolean :代表boolean数据类型的包装类

*   java.lang.Character:代表char数据类型的包装类

*   java.lang.Byte:代表 byte数据类型的包装类

*   java.lang.Short:代表short 数据类型的包装类

*   java.lang.Integer:代表int数据类型的包装类

*   java.lang.Long:代表long 数据类型的包装类

*   java.lang.Float:代表float 数据类型的包装类

*   java.lang.Double:代表double 数据类型的包装类

*   java.lang.Void:代表void数据类型的包装类



然后是 **getName()** 方法,这个方法返回类的全限定名称。



*   如果是引用类型,比如String.class.getName() -> java.lang.String

*   如果是基本数据类型,byte.class.getName() -> byte

*   如果是数组类型,new Object\[3\]).getClass().getName() -> \[Ljava.lang.0bject



**toGenericString()**





# 最后

各位读者,由于本篇幅度过长,为了避免影响阅读体验,下面我就大概概括了整理了

![](https://img-blog.csdnimg.cn/img_convert/4d9c92cf15858c51658d8a195db96a92.webp?x-oss-process=image/format,png)

![](https://img-blog.csdnimg.cn/img_convert/df680e916bd99c7e14447ea533031092.webp?x-oss-process=image/format,png)

![](https://img-blog.csdnimg.cn/img_convert/2039c92d3455fb0a21f6342c94a7182e.webp?x-oss-process=image/format,png)

![](https://img-blog.csdnimg.cn/img_convert/36bc3ab8fd76786573216e34fc673368.webp?x-oss-process=image/format,png)

> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**

**[需要这份系统化的资料的朋友,可以点击这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

ava.lang.String

*   如果是基本数据类型,byte.class.getName() -> byte

*   如果是数组类型,new Object\[3\]).getClass().getName() -> \[Ljava.lang.0bject



**toGenericString()**





# 最后

各位读者,由于本篇幅度过长,为了避免影响阅读体验,下面我就大概概括了整理了

[外链图片转存中...(img-fKgP1f2P-1715570409240)]

[外链图片转存中...(img-y6SHtqzD-1715570409241)]

[外链图片转存中...(img-8o3bGAG6-1715570409241)]

[外链图片转存中...(img-TzL7ESgN-1715570409242)]

> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**

**[需要这份系统化的资料的朋友,可以点击这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值