自学JAVA总结

时间:2021-08-03 01:20:04

2.在定义常量的时候C语言中定义为const而JAVA中为final
3.在JAVA声明成员变量的时候,使用static来定义。
4.在JAVA中的boolean类型只包括true和false,但是在C中非0为true,0为false
5.在JAVA中byte、short、int、long其存储空间分别为1、2、4、8个字节,而在C中其char、short、int、long其存储空间分别为1、2、4、4个字节。其中这里的long为int long。C语言中有unsign类型,而Java中没有。
6.long类型在Java中必须在赋值后面使用L表示,否则会出错。或者会成为int类型,但是int类型的长度会比long少。C语言中没有此规则。
7.JAVA中数据类型按容量大小(表示的数的大小)排序,不是按所占内存大小排序。
8.int类型数据可以直接赋值给byte类型变量。byte类型变量是直接将int类型数据直接砍掉到他所需要的长度,而将double类型的数据不可以直接赋值给float类型数据,因为小数点的限制。
9.逻辑与& 逻辑或| (都必须计算两端的值) 短路与&& 短路或||可以不计算第二个值
10.switch后面的判断值应该为int类型,在Java中可以是char,byte,short类型,因为其可以自动转动为int类型数据。

第二章题
1.输出1-10的阶乘之和
2.输出100以内奇数这和
3使用while和do-while循环输出1-9
4.输出1-100以内5个可以被3整除的数
5输出101-200 内的质数

第三章 面向对象
注:面向对象思维:1那些个类那些个对象2这些类和对象有什么属性和方法3类和类之间具备什么样的关系。合适的方法应该出现在合适的类里面。
对象和类的关系:类可以看成一类对象的模板,对象可以看成该类的一个具体实例。
类(对象)之间的关系
关联关系:一个类的方法的参数是另一个类的对象。 关系不是很紧密(最弱)
继承关系:XX是一种XX,可以考虑用继承关系封装。(在做设计的时候很有可能会生成一种生成树,但是也有可能从多个不同的类继承。C++存在多重继承(如果父类里面存在重名的成员变量,处理起来会非常麻烦),但是JAVA存在继承多个接口)。强
聚合关系:整体和部分的关系(XX是XX的一部分呢)。细分之下还可以分为聚集(身兼数职)和组合(密不可分)的关系。强
实现关系:当子类继承父类的方法时,并由子类来实现其具体方法,这叫实现。
多态关系:

static关键字:
static方法是不可以直接访问非静态变量和方法 。
对象可以看成属性(成员变量)和方法的封装体。
Java和C的区别:
C是面向过程的编程,它的属性和方法是分开的,不是聚合在一起的,而Java是面向对象的,对象将属性和方法封装到一起,然后复用,即Java复用性(方法和属性)更强,而面向过程复用的是方法。除了可复用性,还有可扩展性和维护和替换比面向过程更加方便。

JAVA语法
引用:除了基本类型(4类8种)之外的变量类型都称之为引用类型,初始值为null。
重载:方法名一样,参数类型或者参数个数不一样,但是返回值类型不一样不构成重载。
static方法里面不可访问非static成员,且static和其他引用应该放在data segment区

打包:在dos环境下将class文件进行打包时,输入jar -cvf test.jar *.*即可完成。此时将其拷贝给其他人后,其他人可使用,打包记得在需要打包文件的父目录进行。

访问修饰符:private default(只可以被同一个包内部的类访问) protected public(在C ++中是friend)
修饰符 类内部 同一个包 子类 任何地方
private YES
default YES YES
protected YES YES YES
public YES YES YES YES

继承:
一个孩子只能有一个爸爸(extends),但是他可以有继承(implement)多个接口(interface)。总起来说孩子比父亲的范围大。
super继承父类的方法。
继承中的构造方法:
子类构造过程中必须调用其基类的构造方法。super.父类构造方法,this.子类其他构造方法。如果调用super,必须写在子类构造方法的第一行。
如果子类没有显示调用父类的构造方法,则程序会自动调用其父类的无参数的构造方法,然后再执行子方法。如果子类没有显示调用父类的构造方法,而父类没有无参数的构造方法则编译会出错。

重写:就是与继承的方法的方法名称、参数列表、返回类型必须一致,且其访问权限应该大于或者等于 其继承的方法。

哈希编码:独一无二的代表了一个对象,并且可以通过哈希编码找到那个对象所在的位置。map<键,值>。

equals:object对象的equals方法定义是当两个变量指的是同一个对象的时候和==是一样的使用。当比较两个不同对象但是在其他方面一样时,可以重写equals方法来实现。

对象转型(可以向上转型也可以向下转型和数值类型相似):
例如上转型:Animal a=new Cat();a.enjoy(); 下转型:Animal a = new Cat(); Cat c = (Cat)a; c.enjoy();
instanceof后面加类名,从而来判断该引用变量所指向的对象是不是属于该类或者该类的子类。

注:父类引用指向子类对象,其看到的只是子类继承父类的方法和变量,不可以访问其子类对象新增加的内容。可以在代码中产生可扩展性。

多态(扩展性达到极致)
使用多态的三个条件:1.要有继承 2要有重写3父类引用指向子类对象

动态绑定:实际中new的谁就调用谁。是指执行期间而非编译期间判断所引用对象的实际类型,根据其实际中调用的谁就调用其相应的方法。new的是谁就调用谁的方法。

final:final的变量的值不能改变,final的方法不能被重写,final的类不能被继承

抽象类:要由子类来实现抽象方法。接口也是一种特殊的抽象类(里面的方法都是抽象方法,成员变量都是static final类型)

第四章 异常处理
打印异常出现信息位置:e.printStackTrace()跟踪异常事件发生时执行堆栈的内容。getMessage()只是打印异常信息。
throwable包括Error、Exception。Error是系统错误,Exception是可以处理的异常。Exception下又有RuntimeException是可以逮也可以不逮,剩余的错误必须逮。但是程序中如果throws出的错误需要逮。

在方法名后使用throws+异常,方法内部是throw+异常

finally 无论捕到或者没捕到异常均执行其里面的语句,从而一般进行资源的清除工作。

第五章 数组
在C中必须指定数组的范围,即大小,且其值放在栈空间上,而Java是不能指定数组大小的,其值放在堆
空间上。
每个数组都有一个属性length表长度,用.length。
System.exit(0|-1);-1为非正常退出,0是正常退出。

在这里涉及到Java排序的算法问题。快速排序、冒泡排序、希尔排序、堆排序、选择排序。
排序:
选择排序:将数组里的值按选择排序方法:将数组里的值从小到大排序,将第一个数值与后面的数值做比较,当找到最小的值后进行位置交换,然后进行下一轮的循环,直到结束。
修改使选择排序的效率更高:每次循环都找到未排好序列的最小值,然后进行交换。(重新做一遍)

冒泡排法:从后往前,从下往上
作业:整形的冒泡排序,date的选择排序 数三退一500人,最后的那个人是原来的第几个位置
双向回环链表
搜索:往往是建立在已经排好序的基础之上。
二分法查找

二维数组:在JAVA中不能在静态初始化的时候定义几维美维几个数组,由JAVA自动分配,自动定义。
在数组arrayCopy中,如果更改拷贝过后的数组中的值,则被拷贝的数组的值也将改变。

常用类:
String、StringBuffer区别:可以在StringBuffer后面直接添加字符串。
String类表示不可变的字符序列。
StringBuffer代表可变的字符序列。
例:
String s1="Hello";
String s2="World";
//s1+=s2;//HelloWorld内存分析:在data seg区一块内存是Hello,还有一块内存是World在执行第三句话的时候是将上面两个变量的值拷贝到另一块内存区间,然后再将s1指向这块内存区。

StringBuffer的append方法。添加。reverse逆序

Math类的round四舍五入是long类型

File类.io.
路径分隔符separator 在windows反斜杠,Linux正斜杠,或者都是用/正斜杠。long类型来存储上次修改时间。

递归:关键是找到方法,找参数和返回值。

枚举:某些类型必须取某些值之一。enum

第7章容器(重点)集合
容器:装其他各种各样的对象。

一个图一个类,三个知识点六个接口
图:容器之图。util
<interface>
Collection(集合。对外提供方法)
<interface> <interface> <interface>
Set(没有顺序
并且不可以重复) List (有顺序且可以重复equals) Map

HashSet LinkedList ArrayList HashMap

容器类对象在调用remove、contains等方法时需要比较对象是否相等,这回涉及到对象类型的equals方法和hashCode方法以实现自定义的对象相等规则。
注:相等的对象应该具有相等的hash codes。hash code非常适合做索引。

类:java.util.Collections提供了一些静态方法实现了基于List容器的一些常用算法(比如排序,二分查找等算法)。

知识点:增强的for循环,泛型,自动打包/解包
接口:Collection 、Iterator、 Set、 List、 Comparable、 Map

Iterator做遍历使用,每一个实现Collection接口的容器类都有一个iterator方法用以返回一个实现Iterator接口的对象。Iterator对象成为迭代器,用以方便的实现对容器内元素的遍历操作。统一地遍历了collection

iterator对象的remove方法是在迭代过程中删除元素的唯一的安全方法。也就是说iterator的remove方法只能由它自己看到,其他的都不可以。

增强的for循环for(int i:array)
缺点:数组(不能方便的访问下标值),集合(与使用Iterator相比,不能方便的删除集合中的内容)。

Set无顺序,不重复。
retain交集

List 有顺序可重复
容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素。

List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可根据序号存取容器中的元素,和array差不多,但是List可以更改其大小。
Array读快改慢 Linked该快读慢 Hash两者之间

arrayList使用数组作为底层的存储空间,对外提供List的接口。
LinkedList以链表作为底层存储空间,对外提供List的接口

Object set (int index,object element)将旧值返回。

Map用来存储键值对(红黑树)
当比较多个元素时可用hashcode来比较,效率比较高。也就是重写equals方法必须重写hashcode方法
put方法将原来的value返回

自动打包(自动将基础类型转换为对象)与解包(自动将对象转换为基础类型)

泛型其实就是你要在里面装的东西和<>中的类型一样即可,在打印使用时不需要使用强制转换。
只要类后面跟着<>的则可以使用泛型,否则不可以使用。
在定义集合的时候同时定义集合中对象的类型,可以在Collection时指定同时也在Iterator指定时,从而增加程序的可读性和稳定性。

第八章IO流(一个字符两个字节)
按数据方向:输入流(字节流:InputStream;字符流:Reader),输出流(字节流:OutputStream,字符流:Writer)。

按处理数据单位:字节流 ,字符流
按功能:节点流(直接将管道查到数据源处,可以从一个特定的数据源(节点)读写数据(如:文件,内存)),处理流(套层的管道,也就是说通过对数据的处理为程序提供更为强大的读写功能)。

在读入数据的时候记得关闭,在写数据的时候记得flush经缓冲区的数据全部写出到目的地,然后再关闭
经实验验证必须在外面定义一个整形变量,并将读出的数据存放到那个变量中,然后再写入,此时写入的文件将与读出的文件中是一样的顺序。

处理流:
1.缓冲流:带缓冲区的。套接在相应的节点流之上,对读写的数据提供了缓冲的功能,提高了读写的效率,同时增加了一些新的方法。Buffer

2.转换流:就是将字节流直接转换成字符流进行输入或者输出,其中有一个readline方法可以读或者写一行,从而增加其速度。InputStreamReader

3.数据流
DataInputStream套接在InputStream类型的节点流上。它提供了可以存取与机器无关的JAVA原始类型数据(如:int,double等)的方法。其构造方法DataInputStream(InputStream in)
先写的先读,先进先出,队列。
4.print流(只有输出流,没有输入流,打印)
PrintWriter和PrintReader都属于输出流,分别针对字符和字节,不会抛出异常。其用于多种数据类型的输出,且有自动flush功能。
5.Object流
serializable接口,指序列化,标记性接口,不需要实现其方法。
ObjectOutputStream
transient透明的修饰的成员变量,在序列化的时候不考虑,也就是在硬盘上写的时候是其默认值。
externalizable接口是serializable的子接口。可以使用其方法自己控制读或者写。

第9章线程
线程:一个程序里的不同执行路径。
进程:静态的概念。class文件,.exe文件就是一个进程。进程的执行指的是进程里面的主方法开始运行
可以通过创建Thread对象来创建线程,使用run方法来完成去操作,使用start()方法来启动一个线程。

线程启动必须调用Thread类的start()方法

创建新线程的两种方法:
1.实现Runnable接口。
2.定义一个Thread的子类并重写其run方法

开启线程的时候尽量从接口处继承。

线程的状态转换
阻塞状态
| | (向上)
阻塞解除 导致阻塞的事件
|(向下) |
创建——>start()——>就绪状态<——>调度<——>运行状态——>终止

sleep:Thread的静态方法(抛异常)。使用标志来结束子线程的调用。
jion:合并线程,将子线程执行完了再继续原来的线程。
yield()让出CPU,当前线程进入就绪队列等待调度。

线程优先级的范围是从1-10,默认值是5

线程同步
synchronized(this){}或者public synchronized void add(String name){}是执行这个方法过程中锁住当前对象

解决死锁的方法之一:降低同步的粒度,即锁住当前整个对象,而不用锁定里面的子对象。

注:一个线程访问一个带有锁的方法,锁定了当前对象,另一个线程不可以执行这个对象中该加有锁的方法;但是可以访问这个对象中没有加锁的方法。

程序中访问数据库中的某一个资源时,一般在“改的方法”上加锁;而在读的方法上不加锁

第十章 网络编程 技术+管理+沟通
网络编程的一本好书《TCP/IP详解》
TCP:专门设计用于在不可靠的因特网上提供可靠的、端到端的字节流通信的协议,是一种面向连接的协议。TCP连接是字节流而非报文流。(TCP三次握手)

UDP:向应用程序提供了一种发送封装的原始IP数据报的方法,并且发送时无需建立连接,是一种不可靠的连接。

Socket 用来实现client----server连接 java.net
两个JAVA应用程序通过一个双向的网络通信连接实现数据交换,这个双向链路的一端称为一个Socket.
java.net包中定义的两个类Socket和ServerSocket(TCP服务端的连接),分别用来实现双向连接的client和server端。其是实现TCP的,只有TCP有C-S之分,UDP没有。

建立连接时所需的寻址信息为远程计算机的IP地址和端口号(65536个端口号,也就是65536个应用程序,用来区分同一个机器上的不同应用程序,自己用1024以上)

端口号可分UDP和TCP

使用eclipse测试时,需要使用两个eclipse来测试,如果是用dos那就需要开两个窗口,先开服务端再开客户端。

UDP传递信息快,但是不可靠,TCP传递信息慢,但是可靠
UDP byteArrayOutputStream

十一章 GUI编程(数据库、HTML 、CSS、java script、JSP、servelet、J2EE、spring、structs、hibernet、EJB)
AWT(Abstract Window Toolkit)用于JAVA application 的GUI(Graphics User Interface图形用户界面)编程
Java图形比较旧的开发包,Javax.swing这个是比较新的窗口开发包(重要图片的AWT组)