前言

之前基本确定之后的求职方向,但一直学习没有方向没有系统的路线,放假期间捋了一下自己的思路,感觉确确实实知识得系统的学,尤其基础的应用最多的技术知识。
Java是本科选修过,但是当时只是单纯考试考完基本上就是平常有项目的时候会用到,没有很系统的知识体系。既然以后大几率是往后端开发去靠近,那完全是有必要把基础夯实,构建完整的知识体系,所以也就利用时间过了一遍JavaSE基础,在此进行简单的记录总结。

Java基础(不定时更新)

  1. Java定义
    Java语言是Sun公司在1995年推出的高级编程语言,可使用编程语言对计算机下达命令让计算机完成人们需要的功能
    Java平台 由Java虚拟机(JVM)和Java应用编程接口构成
  2. Java特点
    1. 面向对象,只支持类间的单继承,可通过接口实现多继承
    2. 平台无关性,“一次编写,到处运行”,Java程序经过解释后生成.class字节码文件,字节码文件在JVM中运行(不同操作系统适配不同的JVM),只要系统中有JVM即可运行Java程序
    3. 简单性,Java语言中无指针,并且有垃圾回收机制解决程序员需管理内存的问
    4. 解释执行,Java编译器将Java程序编译成字节码文件,通过解释器对字节码文件解释执行
    5. 多线程,Java支持多个线程通过执行,执行的方法写在线程的run方法体中
    6. . 分布式,Java支持Internet应用的开发,提供网络应用编程的类库,包括URL、URLConnection、Socket等
    7. 安全性、健壮性、高性能等
  3. JavaSE、JavaEE、JavaME
    JavaSE:Java Standard Edition,Java标准版,可视为JavaEE的子类,允许开发和部署在桌面、服务器、嵌入式环境和实施环境中使用的Java应用程序
    JavaEE:Java Enterprise Edtion,Java企业版,多用于企业级开发,包括Web开发等
    JavaME:Java Platform Micro Edition,Java平台微型版,为在移动设备和嵌入式设备(例如手机、电视机顶盒、打印机)上运行的应用程序提供一个健壮灵活的环境
  4. JVM
    Java可可跨平台是由于JVM运行环境的支持,不同操作系统中提供不同的JVM对Java程序起翻译作用(Java虚拟机JVM本身不具备跨平台功能,每个操作系统下都有不同版本的虚拟机促使Java具有跨平台特性
  5. Java内存
    Java内存分为栈、堆、方法区、本地方法栈、寄存器五部分。

    1. Stack栈:存放方法中的局部变量,方法的运行需要在栈中进行
    2. Heap堆:new的实例化对象在堆中,堆中存储的是对象的地址值,数据均由默认值(整数0、浮点数0.0、字符\u0000、布尔false、引用类型null)
    3. Method Area方法区:存储.class相关信息(包括方法信息)
    4. Native Method Stack本地方法栈:与操作系统有关
    5. PC Register寄存器:与CPU有关
  6. JRE、JDK
    JRE:Java Runtime Environment:Java程序的运行时环境,包含JVM和运行时所需要的核心类库
    JDK:Java Development Kit,Java程序开发工具包,包含JRE和开发人员使用的工具
    如果单纯运行一个已有的Java程序则只需安装JRE即可;如果需要开发一个新Java程序,必须安装JDK
  7. Java编程规范
  8. 关键字

    关键字不可作为一般的标识符来使用。
  9. 标识符
    标识符为程序员自定义的内容,如类名称、方法名字、变量名字等。
    标识符可包含英文字母(区分大小写)、0-9数字、$(美元符号,最好不使用,Java中内部类.class中包含此符号)和_(下划线),但是不能以数字开头
    类名规范:大驼峰,所有的单词首字母均大写
    变量名/方法名规范:小驼峰,首字母小写,后面每个单词首字母大写
  10. 常量
    程序运行期间,固定不变的量。

    1. 字符串常量:“abc”
    2. 整数常量:3
    3. 浮点数常量:2.5
    4. 字符常量:‘A’
    5. 布尔常量:true、false
    6. 空常量:null,代表没有任何数据
  11. 变量
    变量即程序运行期间内容可发生改变的量。
//1. 变量创建方式1:
//数据类型 变量名称;
//变量名称= 数据值;
int a;
a = 2;
//2. 变量创建方式2:
//数据类型 变量名称 = 数据值,将=右边的数据值赋给=左边的变量
int b = 2;
变量必须赋值后才能使用,否则编译时会报错。作用域在定义变量始,至直接所属大括号结束为止
  1. 数据类型
    数据类型分为基本数据类型和引用数据类型。
基本数据类型
整数型 byte(1个字节) short(2个字节) int(4个字节) long(8个字节,使用long需要加上后缀L)
浮点型 float(4个字节) double(8个字节浮点型中默认为double,使用float需要加上后缀F)
字符型 char(2个字节)
布尔型 boolean(1个字节)
引用数据类型
字符串
数组
接口
Lambda


13. 数据类型转换
当数据类型不一样时会发生类型转换。数据类型转换分为显式转换和隐式转换。
1. 显式数据类型转换/强制类型转换:一般是大转小(可能存在数据丢失)

int num = (int)100L;//将8字节的long类型强制类型转换为4字节的int类型
2. 隐式数据类型转换/自动类型转换:一般是小转大,不需特殊处理系统自动完成。
double f= 2.15F;//float类型隐式类型转换为doubel(4字节转为8字节)
  1. 运算符
运算符 具体描述
算术运算符 + - * / %(取余)【一旦运算中有不同类型的数据,结果同数据类型范围大的类型;char:先转int再运算;String:+字符串拼接】
赋值运算符 += -= *= /= %=
比较运算符 == < > <= >= !=(结果为boolean值)
逻辑运算符 && ! 或
三元运算符 数据类型 变量名称 = 条件判断 ? 表达式A : 表达式B
  1. 语句
    顺序语句:按照程序编写顺序依次执行
    选择语句:if if-else if-elseif-else swtich(小括号里可为byte short char int String enum) break continue
    循环语句:fori(正序) forr(倒序) do-while while
  2. 方法
    方法即将某个功能抽取出来的一个封装,需要使用此功能的时候调用方法即可,实现代码的复用性且解决代码冗余现象。
修饰符 返回值类型 方法名 (参数列表){......//方法体return 返回值
}//方法定义无先后顺序
  1. 方法重载与方法重写
    方法重载:overwrite,参数列表不同(个数、类型、顺序不同),其他方法返回值类型、方法名称相同(只需记住一个方法名称通过传入不同的参数调用不同的方法实现类似的多个功能)
    方法重写:override,子类继承重写父类的方法,实现类重写接口的方法(返回值可不同,需要小于等于父类方法的返回值,修饰符的作用域需要大于等于父类方法的修饰符)
  2. 数组
    1. 数组是一个容器可同时存放多个数据值
    2. 引用数据类型
    3. 存放的数据类型必须统一
    4. 数组长度在程序运行期间不可改变。
      数组的初始化分为静态初始化(指定内容)和动态初始化(指定长度)
//1.1 数组的静态初始化
int[] arr1 = new int[]{1,2,3};
//1.2 数组的静态初始化(省略new实例化部分)
int[] arr2 = {1,2,3};
//2. 数组的动态初始化
String[] str1 = new String[2];//可存放2个String字符串的数组str1

常见的数组问题:数组索引越界(ArrayIndexOutOfBoundsException);空指针异常(NullPointerException)
19. 类与对象
Java是面向对象的程序编程语言。
面向过程:当需要实现一个功能时需要考虑到每一个具体的步骤,详细处理每一个细节
面向对象:当需要实现一个功能时,不关心具体步骤,找一个已有该功能的方法来调用即可
类:一组相关属性(成员变量)和行为(成员方法)的集合,用来描述一类事物,属性即事物的状态信息,行为即事物可以做的事

20. 封装
面向对象语言的特征之一。封装就是将一些细节信息隐藏起来对于外界不可见。
方法是一种封装,private是一种封装。
21. 继承
子类 extends 父类

22. super和this


构造方法中super和this不可同时使用
23. 多态
多态是针对于一个对象而言的,表示这个对象有多个形态(extends继承/implements实现是多态的前提)

//对象的向下转型(隐式转型)
父类 父类对象名 = new 子类();
//使用instanceof进行类型判断
if(对象名 instanceof 子类名){子类 子类对象名 = (子类名)对象名;//对象的向上转型(强制转型)
}
  1. 接口
public interface 接口名称{......//抽象方法public abstract 返回值类型 方法名称(参数列表);//public abstract可省略
}


25. 异常
异常是指程序在执行过程中出现的非正常情况,最终会导致JVM的非正常停止。
Java中异常本身就是一个类,产生异常就是创建异常对象并抛出一个异常对象,在Java中处理异常的方式是中断处理。
异常分为error、exception。
error是不可恢复不可处理的(例如内存溢出等),应该尽量避免
exception分为编译期异常和运行时异常,对于编译期异常需要自定义捕获异常处理异常,对于运行时异常(空指针、数组边界溢出)程序会自动抛出异常,无需处理。
异常处理:throw new XXXException/方法外加throws XXXException/try-catch(try中创建异常捕获异常,catch中异常处理)
if进行异常捕获,throw进行异常抛出;如果throw抛出的是RuntimeException,那么直接交予JVM处理,可throw new XXXException创建异常对象的时候传入自定义打印的message参数,JVM打印异常信息(内容message、原因XXXException、位置);如果throw抛出的是编译期异常对象,那么一般要么在方法名throws XXXException捕获异常声明性输出异常(终止程序),要么加try-catch捕获异常处理异常(catch异常处理后程序继续执行);如果使用进行try-catch异常捕获和处理直接将可能出现异常的语句或者throw new XXXException创建异常对象语句放入到try中,然后catch进行异常分类定义处理即可(try捕获到异常后创建异常对象并抛出直接挨个遍历catch找到匹配的处理方法,catch接收到try抛出的异常通过其中的方法处理异常即可);如果方法中有异常处理,那么需要注意调用有异常方法的方法也需要进行异常处理,throws或者try-catch

  1. 集合
    集合是Java提供的一种容器用来存储多个数据。与数组相比长度可变,且数据类型为包装类

  2. 并发




  3. Lambda表达式




  4. Properties类
//store将Properties属性集内容读取到文件中//1. 定义Properties对象Properties properties = new Properties();properties.setProperty("key1","value1");properties.setProperty("key2","value2");properties.setProperty("key3","value3");//2. 定义输出流对象,可字节流可字符流FileWriter fileWriter = new FileWriter("C:\\Users\\cici\\test.txt",false);//3. 调用Properties对象的store方法将属性集key-value写入文件中 第二个参数为注释,可为""空字符串properties.store(fileWriter,"");//4. 关闭输出流fileWriter.close();
//load将文件中的内容加载到Properties属性集中//1. 定义Properties对象Properties properties = new Properties();//2. 定义输入流对象,可字节流可字符流(如果有中文最好是字符流)FileReader fileReader = new FileReader("C:\\Users\\cici\\test.txt");//3. 调用Properties对象的load方法将文件中的数据读取到Properties属性集中properties.load(fileReader);//文件中的注释内容不会被读入//4. 遍历读取属性集的内容for(String key : properties.stringPropertyNames()){System.out.println(key + " = " + properties.getProperty(key));//key3 = value3//key2 = value2//key1 = value1}//4. 关闭输入流资源fileReader.close();
  1. IO流
//字节输入流//1. 使用FileInputStream的构造方法,参数为File路径名(绝对路径/相对路径都可)FileInputStream fileInputStream = new FileInputStream("C:\\Users\\cici\\test.txt");int len =0;byte[] bytes = new byte[2];//2 加while循环读取Filewhile((len = fileInputStream.read(bytes))!=-1){System.out.println(new String(bytes));}//3. 使用结束关闭FileInputStream,释放资源fileInputStream.close();//字节输出流//1. FileOutputStream构造方法,参数为String类型的文件名/File类型的文件//将FileOutputStream对象绑定到File文件对象上(File若不存在则创建)//FileOutputStream的构造方法加参数append=true,表示追加;false表示创建一个新文件覆盖原文件FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\cici\\test.txt",false);//2 数据换行byte[] bytes = "你好\r\ncici\r\n".getBytes();fileOutputStream.write(bytes);//3. close方法关闭输出流,释放资源fileOutputStream.close();//替代flush方法//字符输入流//1. 定义FileReader对象,并指定文件路径FileReader fileReader = new FileReader("C:\\Users\\cici\\test.txt");//2. 调用FileReader的read方法读取//2.1 读取依次一个字节int len =0;
//        while((len = fileReader.read())!=-1){//            System.out.println(len);//返回字节
//            //65 66  20013  22269  20154
//        }//2.2 读取字符char[] chars = new char[1024];while((len = fileReader.read(chars))!=-1){System.out.println(new String(chars));//AB中国人}//3. 关闭资源fileReader.close();//字符输出流//1. 定义FileWriter对象,定义FiLe文件,并将FielWriter对象指向File文件,选择追加模式(append=true)FileWriter fileWriter = new FileWriter("C:\\Users\\cici\\test.txt",true);//2. 定义要写入的char[]数组/String字符串,将字符写入内存缓冲区进行字符-字节的转换//2.1 char[]字符数组
//        char[] chars = new char[]{'中','德','关','系','友','好'};
//        fileWriter.write(chars);//2.2 string字符串fileWriter.write("吧啦啦啦啦啦啦啦啦啦\r\n东方季道啥底料",2,12);//3. 将内存缓冲区中的字节刷写到硬盘文件中
//        fileWriter.flush();//4. 关闭资源(同样可刷写)fileWriter.close();
  1. 缓冲流
//字节缓冲输入流//1. 定义文件字节输入流FileInputStream fileInputStream = new FileInputStream("C:\\Users\\cici\\test.txt");//2. 定义输入字节缓冲流 构造方法中参数可加size去规定缓冲区大小BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);//3. 执行read方法读取文件int len=0;while((len=bufferedInputStream.read())!=-1){System.out.println(len);}//4. 关闭资源,关闭缓冲区即可bufferedInputStream.close();//字节缓冲输出流//1. 定义文件字节输出流FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\cici\\test.txt",true);//2. 定义缓冲字节输出流BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);//3. 将字节数据写入缓冲区,参数可byte[]/intbufferedOutputStream.write("fsfefdfd".getBytes());//4. 可调用flush方法刷写
//        bufferedOutputStream.flush();//4. 关闭缓冲区资源(自带flush)bufferedOutputStream.close();  //字符缓冲输入流//1. 定义字符输入流FileReader fileReader = new FileReader("C:\\Users\\cici\\test.txt");//2. 定义字符缓冲输入流BufferedReader bufferedReader = new BufferedReader(fileReader);//3. 读取数据String rrl = null;//read方法一次读取一个字符/char[]个字符,读完返回-1//readLine方法可换行一次读取文件中的一行数据,文件读完返回nullwhile((rrl = bufferedReader.readLine())!=null){System.out.println(rrl);//#//#Tue Mar 24 21:30:59 CST 2020//key3=value3//key2=value2}//4. 释放资源bufferedReader.close();//字符缓冲输出流//1. 定义字符输出流FileWriter fileWriter = new FileWriter("C:\\Users\\cici\\test.txt");//2. 定义缓冲字符输出流BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);//3. 写入字符至缓冲区for(int i=0;i<3;i++){bufferedWriter.write("fsfsefsg" + i);//自动换行,相当于不同版本操作系统中的换行符,如Windows下的\r\nbufferedWriter.newLine();}//4. 关闭资源bufferedWriter.close();//顺带先flush再close(多个写先在缓冲区中后写入内存缓冲区,最后flush到硬盘上)
  1. 转换流
    使用IO流的时候规定字符集的编码格式,用来解码和编码。常用UTF-8,中文用GBK,英文用ASCII,拉丁文用ISO-8859-1,基本上统一使用UTF-8
//1. 定义转换输出流,编码规则为utf-8OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream("C:\\Users\\cici\\test.txt",true),"utf-8");//2. 定义转换输入流,编码规则为gbkInputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("C:\\Users\\cici\\test1.txt"),"gbk");//3. 读取文件字符int len = 0;char[] chars = new char[2];while((len = inputStreamReader.read(chars))!=-1){//4. 写入文件outputStreamWriter.write(chars);}//4. 关闭资源outputStreamWriter.close();inputStreamReader.close();
  1. 序列化流
//1. 定义Person类型的集合ArrayList<Person> arrayList = new ArrayList<>();//2. 增加集合元素Collections.addAll(arrayList, new Person("wangmeimei",19),new Person("leilei",20),new Person("liming",18));//3. 定义序列化流对象ObjectOutputStreamObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("C:\\Users\\cici\\test.txt",false));//4. 序列化objectOutputStream.writeObject(arrayList);//5. 定义反序列化对象ObjectInputStreamObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("C:\\Users\\cici\\test.txt"));//6. 反序列化ArrayList<Person> arrayList1 = (ArrayList<Person>)objectInputStream.readObject();//7. 遍历集合for(Person person : arrayList1){System.out.println(person);//Person{name='wangmeimei', age=19} Person{name='leilei', age=20}  Person{name='liming', age=18}}//8. 释放资源objectOutputStream.close();objectInputStream.close();
  1. Socket编程
//client客户端代码
public class Demo01Client {public static void main(String[] args) throws IOException {//1. 定义Socket,参数为ip,portSocket socket = new Socket("localhost",80);//2. 获取客户端字节输出流OutputStream out = socket.getOutputStream();//3. 写数据到输出流out.write("testtesttest".getBytes());//停止客户端输出,如果没有这一句,服务端inputstream永远不能退出while(len!=-1),也就无法outputstream回复给客户端socket.shutdownOutput();//4. 获取服务端字节输入流InputStream in = socket.getInputStream();//5. 读取输入流中的数据byte[] bytes = new byte[1024];int len = 0;while((len = in.read(bytes))!=-1){System.out.println(new String(bytes));}//6. 关闭资源(只用释放socket即可)
//        in.close();
//        out.close();socket.close();}
}
//server服务端代码
public class Demo01Server {public static void main(String[] args) throws IOException {//1. 定义服务端,参数为port(同客户端socket定义的portServerSocket serverSocket = new ServerSocket(80);//2. 使用服务端对象的accept方法绑定客户端对象,生成一个socket对象与客户端的socket进行交互Socket socket = serverSocket.accept();//3. 定义输入流使用getInputStream方法接收客户端的输出流InputStream in = socket.getInputStream();//4. 输出客户端发来的数据byte[] bytes = new byte[1024];int len=0;while((len = in.read(bytes))!=-1){System.out.println(new String(bytes));}//5. 定义输出流发送回复OutputStream out = socket.getOutputStream();out.write("reply".getBytes());//6. 关闭资源socket.close();serverSocket.close();}
}
  1. Stream流

 String[] strings = {"abc","efd","egty"};String[] strings1 = {"egd","ethh","wgfd"};Stream stream = Stream.of(strings);Stream stream1 = Stream.of(strings1);long num = stream.skip(1).filter(new Predicate() {@Overridepublic boolean test(Object o) {if(o.equals("efd")){return true;}return false;}}).count();System.out.println(num);stream1.forEach(new Consumer() {@Overridepublic void accept(Object o) {System.out.println(o);}});
  1. 方法引用

总结

不管怎么说,学到就是赚到。多学点东西多夯实理论体系基础多多实践总结经验总归是不会出错的,既然确定了目标和方向,干就完事了。

Java基础学习总结记录相关推荐

  1. java基础学习整理(一)

    java基础学习整理(一) lesson1: D0s命令: 1.回到根目录,>cd \ 2.复制命令行下的内容,右击标记所要复制的内容,这样就已经复制好了,右击粘贴就可以了. 3.查看,设置环境 ...

  2. Java基础学习:尚硅谷项目三 开发团队调度软件

    Java基础学习:尚硅谷项目三 开发团队调度软件 一.软件功能与结构设计 1. 软件功能 该软件实现以下功能: 软件启动时,根据给定的数据创建公司部分成员列表(数组) 根据菜单提示,基于现有的公司成员 ...

  3. Java基础学习(9)

    Java基础学习 一.常用方法(API) 1.1 Math 1.2 System 1.3 Runtime 1. 4 .object 1.5 Objects 1.6 BigInteger BigInte ...

  4. Java 基础学习-Java语言概述

    Java 基础学习 第一章 Java语言概述 回顾java基础知识,进行整理记录. 文章目录 Java 基础学习 前言 一. Java语言发展史(了解) 二.Java语言跨平台原理(理解) 三.JRE ...

  5. java基础学习总结(二)——开篇(转载于孤傲苍狼博主的心得体会)

    由于孤傲苍狼博主16年后,就没有更新博客了.其中有些文章看不了,挺可惜的.为了避免后续文章也会有类似情况,因此,他的博文基本都会转载过来,也会标注转载,做一个备份.不过文章太多,不会每篇文章都有转载于 ...

  6. java体系学习总结记录——超长篇

    Java体系学习 一.主流语言介绍 1.c语言:底层编程,比如嵌入式.病毒开发等应用,可以替代汇编语言来开发系统程序:高层应用可以开发从操作系统到各种应用软件.是一种面向过程的语言. 2.java:广 ...

  7. java基础学习-4

    Java基础学习-4 static 注意事项 重新认识main方法 继承 小练习 子类到底能继承父类中的哪些内容(第126集)*** 继承过程中成员变量和成员方法的访问特点 小练习 小总结 构造方法的 ...

  8. java基础学习-6

    Java基础学习-6 双列集合 Map的常见API Map的遍历方式 HashMap 小练习 LinkedHashMap TreeMap TreeMap--小练习1 TreeMap--小练习2 Tre ...

  9. Java基础学习——第十六章 Java8新特性

    Java基础学习--第十六章 Java8 新特性 Java8(JDK8.0)较 JDK7.0 有很多变化或者说是优化,比如 interface 里可以有静态方法和默认方法,并且可以有方法体,这一点就颠 ...

最新文章

  1. Car-eye-http-flv-module 实现nginx-rtmp-mudule HTTP方式的FLV直播功能
  2. Elasticsearch聚合初探——metric篇
  3. 今天,我们来详细的聊一聊SpringBoot自动配置原理,学了这么久,你学废了吗?
  4. delphi 如何判断编码格式,解决乱码问题
  5. c语言 输入若干字符串 用指针和一位数组 冒泡排序,C 语言作业 - 1 - 指针使用与冒泡排序...
  6. C 流插入和流提取运算符的重载
  7. java对象占用内存大小?
  8. 浅谈对机器学习方法(决策树,SVM,knn最近邻,随机森林,朴素贝叶斯、逻辑回归)的理解以及用sklearn工具实现文本分类和回归方法...
  9. 慢慢看Spring源码
  10. Linux 小知识翻译 - 目录 (完结)
  11. 微信小程序实现文件上传
  12. 微信聊天记录如何才能永久删除?这些彻底删除的方法你知道多少
  13. 速卖通html自定义属性,速卖通自定义属性怎么填?有哪些需要注意的地方?
  14. 876计算机大纲,2018华中科技大学876 物理化学二考试大纲
  15. so动态库生成、链接方法
  16. 常见的文件系统格式(带你快速了解)
  17. 回顾一波春招找实习的艰苦岁月
  18. Charle和Fiddler抓包 unknown 和证书无效的解决方案
  19. Linux C 面试题总结
  20. 2021-2027全球与中国台式X射线衍射仪市场现状及未来发展趋势

热门文章

  1. nm: xxx: no symbols
  2. 图像滤镜艺术---Oilpaint油画滤镜
  3. Java开发人员的微服务:Monoglot还是Polyglot?
  4. 查询zookeeper端口号报错 stat is not executed because it is not in the whitelist
  5. 做自媒体视频剪辑到哪里找免费素材?
  6. 过曲线y=x^2(x=0)上某点处作切线,使该曲线、切线与x轴所围成的面积为1/12,求切点坐标,切线方程,并求此图形绕x轴旋转一周所围成的立体的体积
  7. 一个编程小白的Java SE学习日志 Ⅵ——继承【极客BOY-米奇】
  8. OpenScenario调研报告
  9. 视觉中国签约插画图库上传失败 图片显示“缺少分辨率信息”
  10. 百度集团资深副总裁李震宇:Apollo开放平台打造全球最强自动驾驶量产引擎 助力车企造好车