中软国际Java EE全栈应用开发实训记录-Day1

一、软件安装

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{} 

结论:数组可以支持协变,但是泛型不支持协变。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值