本文共 11638 字,大约阅读时间需要 38 分钟。
大家好,我叫xx,西工大电子与通信工程专业,2021年6月份毕业,研究方向xx。我想从三个方面介绍自己:
1)学习方面: 大三时保送研究生,之后进入实验室开展项目研究。在x年时间里,先后参与了x个项目,其中x个纵向项目,x个横向项目,纵向项目主要是关于xx,横向项目主要是关于xx。这些分别对应我简历里的项目经历(1,2,3)。我本科绩点3.8,研究生绩点3.4。我XX年一次性通过大学英语四、六级考试,XX年通过托业英语考试,考试成绩XX分(满分XX分),XX年通过软件工程师/网络工程师/系统分析师考试。 2)实践方面: 曾在软件公司实习xx年时间,曾在xx当过计算机讲师,主讲xx,另外,本科时曾参加过xx比赛,并获得了xx奖。实习期间,我的最大收获是:学校学习与工作知识的衔接,深切感悟将理论应用于实践的重要性和快乐。 3)社会工作方面: 本科和研究生都担任所在班级班长/**部长,同时也在校学生会工作过。在担任班干部的日子里我具备了一定的组织、协调能力,并深深体会团队协作的重要性。我的性格特点
是, 1.性格沉稳,2.考虑问题全面、仔细,3.做事有自己明确的想法和计划。
我的优势
是1.自己全面的综合素质;2.做事分清轻重缓急;3.喜欢总结,避免犯同样的错误。
我的座右铭
是:人因为梦想而伟大,机遇永远属于那些有准备、立即行动并能坚持到底的人!
我的 职业生涯目标是,将来有一天能带领一个团队,做出亿万网民喜爱和尊敬的软件!做一个既懂技术,又懂业务的复合型人才(非IT企业用)。 |
我的未来5年的规划是:因为我本人是学计算机的,所以希望沿着以技术为主线的路走下去。5年以后,我希望自己能够对某一个领域有比较深入的理解,成为某一领域的专家,在某一方面能独挡一面,同时也能够了解其他领域的发展动态 |
(1)抽象:抽象包括两个方面,一是过程抽象,二是数据抽象。
在平面坐标系中包括矩形、圆形、三角形、椭圆形、五边形等等不同的图形,对所有平面图像进行抽象可以形成平面图像类,所有的图形能求面积、周长。平面图像类有求面积/求周周长的操作,但是不同种类的图形,他们求面积/周长的操作是不一样的。 平面图像类有求面积/周长的操作,没法具体实现。这个操作就可以定义抽象方法。 抽象类和具体类是相对的概念,“抽象”是一种存在思想逻辑中的概念,而“具体”是一种可见、可触摸的现实对象。简单说,“人”比“男人”更抽象,“动物”有比“人”更抽象,而“生物”有比“动物”更抽象。 普通类可以去实例化调用,抽象类不能被实例化。因为它是存在于一种概念而非具体。 声明情况下需要定义为抽象方法? 当一个类的某种操作无法具体实现时,这个操作可以定义为抽象方法 如:宠物嗷嗷叫的操作 如何定义抽象方法? [修饰符] abstract 返回值类型 方法名 [参数列表] 即是使用abstract 修饰方法,只有方法声明部分,没有方法体 含有抽象方法的类必须定义为抽象类 (2)继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。 对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类、超类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。在java种所有类的根都是从Object继承过来的
注意
- 子类继承父类,不能继承父类的构造方法
- 父类(超类或基类)
- 子类(派生类)
- 满足继承条件:is…a
- 继承特性:在java中一个类只能直接继承一个直接的父类,也就是说类是单根性 优点:减少代码的冗余性
(3)封装:隐藏类的内部信息,不允许外部程序直接访问,而是通过方法进行操作,即现实世界可以被描绘成一 系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。
封装的操作步骤:
第一步:将属性设置为私有的private,也就是只能在本类中进行访问, 第二部:编写对应属性的方法( 赋值set )
(4) 多态性: 多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享 、代码共享的优势,很好的解决了应用程序函数同名问题
多态语法格式
1).多态的语法格式: 父类类名 引用名称 = new 子类类名(); 2).当是多态时,此时引用名时只能访问父类中的属性和方法,但是优先访问子类重写后的方法 3).多态:多种形态 多个对象调用同一个方法,得到不同的结果 4).多态的满足条件: ------子类继承父类 -------子类必须重写父类的方法 -------子类类名 引用名称 = new 子类类名(); 5).多态的好处 减少代码冗余度
方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性
,而后者实现的是运行时的多态性
。
- 在同一个类中,方法名字相同,参数列表必须不同,称为方法的重载。
特点
:两同一不同,同类同一方法名,不同的参数列表。- 重写也叫做方法覆盖: 在子类中重写父类的方法,与父类中的方法名称一致、参数列表一致、返回类型一致、修饰符一致,只有方法体不一样。不能比父类被重写方法声明更多的异常(里氏代换原则)。
当是多态时,此时引用名时只能访问父类中的属性和方法,但是优先访问子类重写后的方法。
方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常。
方法的重载和重写都是实现多态的方式,函数的返回值只是作为函数运行之后的一个“状态”,重载对返回类型没有特殊的要求。
为啥为什么不能用返回值类型来判断方法是否重载呢? 就比如int f(){ } void f(){ }
在main方法中调用f方法时f();
你能判断用哪个方法吗?你都不清楚的话,那系统就更不清楚了。因此,不能使用返回值来判断方法是否重载了。
重写方法一定不能抛出新的编译异常或者比父类的异常更加宽泛的异常。
1.子类在重写父类的具有异常声明的方法时,要么不抛异常,要么就抛出跟父类方法相同的异常或该异常的子类。
2. 子类在重写父类的具有异常声明的方法的同时,又去实现了具有相同方法名称的接口且该接口中的方法也具有异常声明,则子类中的重写的方法,要么不抛出异常,要么抛出父类中方法声明异常与接口中方法声明的异常的交集。static修饰的方法不能被重写可以被继承
static修饰的方法为静态方法,可以直接使用类名.方法名进行调用,即该方法不属于某个对象属于该类。与类同生死
。 static修饰的方法可以被继承。 如果父类中有一个静态的方法,子类也有一个与其方法名,参数类型,参数个数都一样的方法,并且也有static关键字修饰,那么该子类的方法会把原来继承过来的父类的方法隐藏,而不是重写。父类引用指向子类对象,只会调用父类的方法。 (1).public :最大访问控制权限,对所有的类都可见。
(2).protect :修饰的,在类内部、同一个包、子类中能访问 (3).default :包访问权限,即同一个包中的类可以可见。默认不显式指定访问控制权限时就是 default 包访问控制权限。 (4).private :最严格的访问控制权限,仅该类本身可见。 (注:访问控制修饰符可以修饰类,成员变量,方法,但是修饰类只用public和default)1、保存一个数据,可以定义一个变量,如果保存100个数据呢?可以使用数组,
数组就是用来储存同种类型若干数据的容器 数组的定义:1)数据类型 [] 数组名 = new 数据类型[] . 2)数据类型 数组名 [] = new 数据类型[] . eg: int [] date = new int[10];说明:1)int数据类型表示数组中存储元素的类型
2)[]表示data是一个数组 3)data是数组名,其实就是一个变量名,数组是一种引用数据类型,data变量的类型:int [] 4)new 运算符会在堆区分配一块连续的存储空间,这块连续的存储空间可以存储10个int类型的数据,把这块存储空间的引用(起始地址)保存道data数组中 5)数组本质上就是内存中一块连续的存储空间 定义数组时,[]有时也可以放在数组名的后面,如, double data 22[] = new double[]; 数组元素的访问: 通过数组索引值(下标)访问数组的每个元素 定义了数组后,数组为每个元素指定一个索引值(下标),这个索引值是从0开始的。如data数组的长度是10,它的每个元素的索引值是0–9; 在定义数组时,可以给各元素赋值,这叫数组的静态初始化注意
:在静态初始化数组时,不需要指定数组的长度 //数组静态初始化,可简化为:int [] data6 = {1,2,3,4,5}; 遍历数组时,还可以使用增强的for循环,也称foreach循环 二维数组的元素实际上存储的是一维数组的引用
2、二维数据其实就是数组中的元素是一维数组的数组。
定义二维数组的格式: 数据类型[][] 变量名 = new 数据类型[x][y]; x: 二维数组的长度 y: 二维数组中一维数组的长度1.二分查找算法
package com.bjpowernode.demo01.p4;import java.util.Arrays;public class Test12 { public static void main(String[] args) { int[] data = { 3, 8, 12, 23, 89, 98, 546 }; Arrays.sort(data); System.out.println(Arrays.toString(data)); int index = binarySerach(data, 23); System.out.println(index); System.out.println(binarySerach(data, 3)); System.out.println(binarySerach(data, 546)); System.out.println(binarySerach(data, 30)); } // 在数组data中查找元素key的索引值,如果不存在,返回-1 private static int binarySerach(int[] data, int key) { int form = 0; int to = data.length - 1; int mid = (form + to) / 2; while (form <= to) { if (data[mid] == key) { return mid; } else if (data[mid] > key) { // 查找的数比中间的数小,说明在左一半,需要缩小查找范围 to = mid - 1; mid = (form + to) / 2; } else { // 在有一半 form = mid + 1; mid = (form + to) / 2; } } return -1; }}
2.使用List
3.使用Set 4.使用循环判断①启动线程有如下三种方式:
一、继承 Thread 类创建线程类 1)定义 Thread 类的子类,并重写该类的 run 方法,该 run 方法的体就代表了线程要完成的任务。因此把 run()方法称为执行体。 2)创建 Thread 子类的实例,即创建了线程对象。 3)调用线程对象的 start()方法来启动该线程。 二、通过 Runnable 接口创建线程类 (1)定义 runnable 接口的实现类,并重写该接口的 run()方法,该 run()方法的方法体是该线程的线程执行体。 (2)创建 Runnable 实现类的实例,并依此实例作为 Thread 的 target 来创建 Thread 对象, 该 Thread 对象才是真正的线程对象。 (3)调用线程对象的 start()方法来启动该线程。 三、通过 Callable 和 Future 创建线程 (1)创建 Callable 接口的实现类,并实现 call()方法,该 call()方法将作为线程执行体, 并且有返回值。 (2)创建 Callable 实现类的实例,使用 FutureTask 类来包装 Callable 对象,该 FutureTask 对象封装了该 Callable 对象的 call()方法的返回值。 (3)使用 FutureTask 对象作为 Thread 对象的 target 创建并启动新线程。1、corePoolSize —new ThreadPoolExecutor的时候创建的的线程,
如果ThreadPoolExecutor.execute的任务数>corePoolSize 则会把任务放到BlockingQueue 、如果BlockingQueue满了会继续创建新线程、一直到线程个数大于第二个参数maximumPoolSize 2、maximumPoolSize 允许创建的最大线程数、如果BlockingQueue已经满了、线程数==maximumPoolSize 则会执行ThreadPoolExecutor的拒绝策略 3、keepAliveTime 如果BlockingQueue从满了到未满、则大于corePoolSize, 小于maximumPoolSize的线程, 会在keepAliveTime的时间内存活、否则会被回收参数含义如下:
coreSize:核心线程数
maxSize :线程最大数
time,timeUnit:空闲线程超时时间,超时后线程销毁
taskQueue:存放任务的队列
threadFactory:创建线程的线程工厂
1.当线程池中的线程数没有达到coreSize时,提交一个任务,不论此时有没有线程处于空闲状态,则会创建一个新的线程!
2.当线程数达到coseSize时,此时在提交任务,如果有线程空闲,则执行任务,如果没有空闲,则放入taskQueue中等待被执行。
3.当taskQueue队列中放满任务时,如果此时所有的线程都处于执行任务期间,再次提交任务,则会创建一个新线程,用于执行队列中的任务,当线程数达到maxSize的时候,如果再次提交任务,如果任务队列已满,并且所有的线程处于活动期间,则提交任务失败,抛出RejectExecutionException.
应该是核心线程池的数量的大小。
Executors在于java.util.comcurrent.包下,Executors.newFixedThreadPool(n)创建容器大小为n的线程池,表示正在执行中的线程只有n个。
newFixedThreadPool:需指定核心线程数,核心线程数和最大线程数相同,使用LinkedBlockingQueue 作为阻塞队列,队列无界,线程空闲时间0秒。这种类型的线程池可以适用CPU密集的工作,在这种工作中CPU忙于计算而很少空闲,由于CPU能真正并发的执行的线程数是一定的(比如四核八线程),所以对于那些需要CPU进行大量计算的线程,创建的线程数超过CPU能够真正并发执行的线程数就没有太大的意义。 newSingleThreadExecutor:池中只有一个线程工作,阻塞队列无界,它能保证按照任务提交的顺序来执行任务。ArrayBlockingQueue数组队列的实现原理:
1、对一个数组进行添加和取出数据操作。 2、其中的put和get用同一把lock锁进行互斥操作,控制多线程并发情况。 3、当put方法中,数组满时,通过lock下的conditionA 调用await方法阻塞当前线程(LockSupport.park方法)并释放了lock锁,并将阻塞线程存入到队列中。 4、由于3步骤已经释放了lock锁,所以新线程调用put方法时,同样会卡在数组满的这一步,与步骤3操作一样。 5、由于步骤4已经释放了lock锁,所以如有新线程调用take方法时,只要数据不是空的,就会在返回数据前执行conditionA.signal,(这里为啥不是调用signalAll,因为唤醒多个线程都去执行insert操作,数据会混乱),这样就会从aqs队列中找出conditionA操作阻塞的线程,并唤醒一个。卡在3,4步骤的其中一个线程被唤醒,则执行后续插入数据的步骤。最后执行conditionB.signal,唤醒conditionB阻塞的线程队列(若有) 6、当get方法时,数组是空的,通过lock下的conditionB,调用await方法阻塞当前线程(LockSupport.park方法)并释放了lock锁,并将阻塞线程存入到队列中。此时就只有等待put方法中执行conditionB.signal来唤醒。1、Error
2、Runtime Exception 运行时异常 3、Exception 4、throw 用户自定义异常 异常类分两大类型:Error
类代表了编译和系统的错误,不允许捕获; Exception
类代表了标准Java库方法所激发的异常。Exception类还包含运行异常类(Runtime_Exception)和受检异常(非运行异常类Non_RuntimeException)这两个直接的子类。 运行异常类对应于编译错误,它是指Java程序在运行时产生的由解释器引发的各种异常。运行异常可能出现在任何地方,且出现频率很高,因此为了避免巨大的系统资源开销,编译器不对异常进行检查。所以Java语言中的运行异常不一定被捕获。出现运行错误往往表示代码有错误,如:算数异常(如被0除)、下标异常(如数组越界)等。
非运行异常时Non_RuntimeException类及其子类的实例,又称为可检测异常。Java编译器利用分析方法或构造方法中可能产生的结果来检测Java程序中是否含有检测异常的处理程序,对于每个可能的可检测异常,方法或构造方法的throws子句必须列出该异常对应的类。在Java的标准包java.lang java.util 和 java.net 中定义的异常都是非运行异常。
算术异常类:ArithmeticExecption
空指针异常类:NullPointerException
类型强制转换异常:ClassCastException
数组负下标异常:NegativeArrayException
数组下标越界异常:ArrayIndexOutOfBoundsException
违背安全原则异常:SecturityException
文件已结束异常:EOFException
文件未找到异常:FileNotFoundException
字符串转换为数字异常:NumberFormatException
操作数据库异常:SQLException
输入输出异常:IOException
空指针属于运行异常
java.lang.NullPionterException
IOE异常属于受检异常
1.首先要确定的一点是,不管有木有出现异常,finally块中代码都会执行
2、当try和catch中有return时,finally仍然会执行; 3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,仍然是之前保存的值),所以函数返回值是在finally执行前确定的; 4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。 return语句的执行过程: return语句的格式如下: return [expression]; 其中expression(表达式)是可选的,因为有些方法没有返回值,所以return后面也就没有表达式,或者可以看做是空的表达式。 我们知道return语句的作用可以结束方法并返回一个值,那么他返回的是哪里的值呢?返回的是return指令执行的时刻,操作数栈顶的值,不管expression是一个怎样的表达式,究竟做了些什么工作,对于return指令来说都不重要,他只负责把操作数栈顶的值返回。 而return expression是分成两部分执行的: 执行:expression; 执行:return指令; 例如:return x+y; 这句代码先执行x+y,再执行return;首先执行将x以及y从局部变量区复制到操作数栈顶的指令,然后执行加法指令,这个时候结果x+y的值会保存在操作数栈的栈顶,最后执行return指令,返回操作数栈顶的值。 对于return x;先执行x,x也是一个表达式,这个表达式只有一个操作数,会执行将变量x从局部变量区复制到操作数栈顶的指令,然后执行return,返回操作数栈顶的值。因此return x实际返回的是return指令执行时,x在操作数栈顶的一个快照或者叫副本,而不是x这个值。 如果try和finally语句里面都有return,会执行哪一个呢? 首先,在程序没有异常的情况下,首先执行到try里面的语句,但是只执行到了return里面的expression,expression首先存放在操作数栈顶,然后复制到局部变量区,并没有执行返回语句return(执行返回语句通常意味着程序执行结束)。然后执行finally,当执行到finally里面的return时候,会将return语句执行完整,此时程序已经有了返回值,因为,执行结束。总结
:执行try块,执行到return语句时,先执行return的语句,但是不返回到main 方法,接下来执行finally块,遇到finally块中的return语句,执行并将值返回到main方法,这里就不会再回去返回try块中计算得到的值
public class Test { public static void main(String[] args) { int num = m1(10); System.out.println(num);//返回值10 } public static int m1(int x){ try { return x; }finally{ x++; } return 0;}//当程序执行return x;这条语句时,并没有执行return语句,而是把x的变量的值保存起来了}
那么,大家猜猜这个代码返回的会是什么呢?
该方法的返回值永远都是10.而不会是11,那为什么不会执行到finally后面的“return 0”呢,因为在finally执行完毕之后该方法就已经有返回值了,后续代码就不会再执行了(大家也可以用Debug调试试一下),然后后面的修改值无效是因为前面return的时候,已经确定了return出去的是int类型,那么由于基本类型都是值的拷贝,所以finally后面再修改a的值已经没有意义了,所以返回的永远都是10。
创建
create database studentgo
学生表
create table student(stu_name varchar(30) not null,stu_id char primary key (stu_id),stu_specialty varchar(30) not null,stu_sex char(2) check( stu_sex in (‘男’,’女’)),stu_age int check (stu_age>16))
课程表
create table studentclass(stu_classid varchar(30) not null,stu_id char not null primary key (stu_id),stu_classname varchar(30) not null,stu_age int check (stu_age>16),stu_time datetime not null)
成绩表
create table studentscore(stu_id char primary key (stu_id),stu_classid varchar(30) not null,stu_score int not null)select *from student插入学生表数据insert into student values (‘张三’,’01’,’计算机专业’,’男’,’10’)insert into student values (‘张四’,’02’,’计算机专业’,’男’,’11’)insert into student values (‘王五’,’03’,’计算机专业’,’男’,’12’)插入课程表数据insert into studentclass values(‘001’,’java’,’2’,’40’)insert into studentclass values(‘001’,’c’,’2’,’41’)insert into studentclass values(‘001’,c++’,’2’,’42’)插入成绩表数据insert into studentscore values(‘01’,’001’,’60’)insert into studentscore values(‘01’,’002’,’70’)insert into studentscore values(‘01’,’003’,’80’)select stu_id,stu_classid,stu_scorefrom student,studentclass,studentscorewhere (student .stu_id=studentscore. stu_id and studentclass.stu_classid.studentscore.stu_classid)order by stu_score descselect avg(stu_score) 平均分,max(stu_score) 最高分,min(stu_score) 最低分from studentscorewhere stu_id=’01’
转载地址:http://bmsmf.baihongyu.com/