一、软件安装
1.jdk
1.1 jdk安装
一般安装目录使用全英文
1.2 jdk环境配置
jdk版本:1.8
安装环境:win10
安装教程:可参考https://blog.csdn.net/weixin_44084189/article/details/98966787?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165871027916781647525687%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=165871027916781647525687&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-98966787-null-null.142v33new_blog_fixed_pos,185v2control&utm_term=jdk1.8%E4%B8%8B%E8%BD%BD%E4%B8%8E%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B&spm=1018.2226.3001.4187
2.idea
2.1 idea安装
idea版本:2019
链接:https://pan.baidu.com/s/1e2QR4Kqf3trqgIRpc-lwaA
提取码:0n82
2.2 idea配置
idea安装好后通过对安装好的软件注册完毕后进行相应的配置,这里要配置的是maven环境,因此需要maven安装包:
链接:https://pan.baidu.com/s/1NdZMAfm_Ea6RkZpPIn7G5g
提取码:0g98
有关maven的配置可参考https://blog.csdn.net/qq_42057154/article/details/106114515?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165871390016781432962621%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=165871390016781432962621&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-106114515-null-null.142v33new_blog_fixed_pos,185v2control&utm_term=ideamaven%E9%85%8D%E7%BD%AE&spm=1018.2226.3001.4187
下载完成后进行idea的配置:
在Configure的Settings里面进行配置全局环境(避免每次创建项目都要进行环境配置):
点击Apply后配置Mave:
配置好maven后即可。
3.MySQL
3.1 MySQL安装
安装版本:5.7版本(自己安装)
安装环境:win10
安装步骤:由于安装较早,具体安装步骤可参考https://blog.csdn.net/weixin_43579015/article/details/117228159?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165870444716781685372682%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=165870444716781685372682&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-117228159-null-null.142v33new_blog_fixed_pos,185v2control&utm_term=mysql%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE%E6%95%99%E7%A8%8B&spm=1018.2226.3001.4187(教程是8版本)
可视化工具:同时可以安装MySQL的可视化工具,推荐Navicat
二、Java泛型
1.泛型的本质
泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法
泛型是JavaSE1.5的新特性
2.泛型的好处
Java语言引入泛型的好处是安全简单。可以将运行时类型相关错误提前到编译时错误说明:
泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。
在JavaSE1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”(Java中的所有类型都是Object类的子类),“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错 误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。
3.泛型了解前的基础练习
java package com.*; public class SimpleGen { // 成员变量,构造的时候接受传进来的值,不确定什么类型 private Object obj; // 定义构造方法 public SimpleGen(Object obj){ this.obj=obj; } // set和get方法 public void setObj(Object obj){ this.obj=obj; } public Object getObj(){ return this.obj; } // 定义普通方法 // this.obj.getClass().getName()是反射 public void shoeType(){ System.out.println("obj的类型:"+this.obj.getClass().getName()); } public static void main(String []args){ // 创建对象 SimpleGen s = new SimpleGen(99); s.shoeType(); // 强制转换 // String obj1 = (String) s.getObj(); Integer obj1 = (Integer) s.getObj(); System.out.println(obj1); SimpleGen s2 = new SimpleGen("zhangsan"); s2.shoeType(); String obj2 = (String)s2.getObj(); System.out.println(obj2); } }
4.泛型的基础练习
java package com.*; public class SimpleGen1<T> { // 成员变量,构造的时候接受传进来的值,不确定什么类型 private T obj; // 定义构造方法 public SimpleGen1(T obj){ this.obj=obj; } // set和get方法 public void setObj(T obj){ this.obj=obj; } public T getObj(){ return this.obj; } // 定义普通方法 // this.obj.getClass().getName()是反射 public void shoeType(){ System.out.println("obj的类型:"+this.obj.getClass().getName()); } public static void main(String []args){ // 创建对象 SimpleGen1<Integer> s = new SimpleGen1<Integer>(99); s.shoeType(); // 强制转换 // String obj1 = (String) s.getObj(); Integer obj1 = (Integer) s.getObj(); System.out.println(obj1); SimpleGen1<String> s2 = new SimpleGen1("张三"); s2.shoeType(); String obj2 = (String)s2.getObj(); System.out.println(obj2); } }
5.泛型类
5.1 泛型类例子
java package com.*; //定义泛型类型<>内可以用任何字母或单词 public class Generic<A> { // 使用定义的泛型定义A类型,A类型由使用者new的时候制定 private A key; // 定义另一个成员变量 private String str; // 构造方法 public Generic(A key) { this.key = key; } public A getKey() { return key; } public void setKey(A key) { this.key = key; } public String getStr() { return str; } public void setStr(String str) { this.str = str; } public static void main(String []args){ Generic<Integer> g1 = new Generic<>(100); Integer key = g1.getKey(); System.out.println(key); Generic<String> g2 = new Generic("张三"); String key1 = g2.getKey(); System.out.println(key1); } }
5.2 运行时出现错误
5.2.1 版本不兼容
这是由于jdk版本的问题
解决办法
1.file菜单下的Project Structure的:
2.file菜单下的Project Structure的:
3.file下的settings里面的Java Compiler下的:
根据以上三种解决办法可以了解到引起上述问题的原因是因为jdk版本的原因。需要将其更改为8即可。
5.2.2 类型引用错误
解决办法
使用引用类型String Interger Long,不能使用基础类型int long short byte boolean double float。
6.泛型方法
6.1 注意事项
(1)public 与返回值中间的<T,E…>可以理解为声明此方法为泛型方法;
(2)与泛型类的定义一样,此处T可以随便写为任意标识,常见的如T,E,K,V等形式的参数常于表示泛 型
(3)在泛型类中使用泛型的方法无需再声明泛型
(4)是否拥有泛型方法,与其所在的类是否泛型类没有关系。要定义泛型方法,只需将泛型参数列表置于返回值前。
6.2 泛型方法例子基础练习
java package com.*; //定义普通类 public class MyGenericMethod { // 定义泛型方法 // mvp 参数 // <MVP> 定义的泛型 public <MVP> void show(MVP mvp){ System.out.println(mvp.getClass().getName()); } public <MVP> MVP show2(MVP mvp){ System.out.println(mvp.getClass().getName()); return mvp; } public <MVP,ABC> MVP show3(MVP mvp,ABC abc){ System.out.println(mvp.getClass().getName()+" "+abc.getClass().getName()); return mvp; } public static void main(String[] args) { // 创建MyGenericMethod对象 MyGenericMethod m = new MyGenericMethod(); // mvp传字符串参数 m.show2("daasan"); // 返回值的类型取决于传进来的第一个参数 Integer mvp = m.show3(90,"张三"); System.out.println(mvp); } }
7.泛型接口
7.1 泛型接口例子的基础练习
首先定义接口
//定义泛型接口
public interface MyGenericInterface<E> {
void add(E e);
E getE();
}
第一种实现方法,确定泛型类型:
//第一种方式实现泛型接口,在实现的时候就把泛型确定下来 public class MyImpl implements MyGenericInterface<String>{ @Override public void add(String s) { System.out.println(s+"调用了myimpl的add()方法......"); } @Override public String getE() { return "调用了getE()方法......"; } public static void main(String[] args) { MyGenericInterface my = new MyImpl(); my.add("张三"); System.out.println(my.getE()); } }
第二种实现方法,并未确定泛型类型,在创建对象时再确定泛型类型:
//第二种实现泛型接口方式定义了实现类,仍然不确定类型,new的时候确定类型 public class MyInpl2<T> implements MyGenericInterface<T>{ @Override public void add(T t) { System.out.println(t+"调用了不确定类型的add()方法......"); } @Override public T getE() { System.out.println("调用了不确定类型的getE()方法......"); return null; } public static void main(String[] args) { // 创建对象的时候确定了泛型类型 MyGenericInterface<String> my = new MyInpl2<>(); my.add("张三"); my.getE(); } }
8.泛型不支持协变
8.1 泛型不支持协变例子的基础练习
java import java.util.ArrayList; public class ArrayTest { public static void main(String[] args) { // textArray(); testGeneric(); } private static void testGeneric(){ // 泛型不支持协变,编译报错 ArrayList<Fruit> fruits = new ArrayList<Fruit>(); } private static void textArray() { // 创建数组,new的时候,Apple是Fruit的子类 Fruit[] fruits = new Apple[10]; // 第一个元素是Apple fruits[0] = new Apple(); // 第二个元素是HongFuShi fruits[1] = new HongFuShi(); // 第三个元素是Fruit // Fruit真正的类型是Apple,所以存放Fruit对象是可以编译但不能运行 // fruits[2] = newFruit(); // Fruit真正的类型是Apple,所以存放Orange对象是可以编译但不能运行 fruits[3] = new Orange(); } } //定义父类 class Fruit{} //Apple是Fruit的子类 class Apple extends Fruit{ } //HongFuShi是Apple的子类 class HongFuShi extends Apple{} class Orange extends Fruit{}
结论:数组可以支持协变,但是泛型不支持协变。