2018.02.04学习记录
1、java的内容介绍:
+ java编程可以分为三个方向:
1) java se(j2se)桌面开发
2) java ee (j2ee) web开发
3) java me(j2me) 手机开发
2、java中的类与对象
类:类是抽象的、概念的,代表一类事物比如人、电脑
对象:是具体的实际的,代表一个事物
类是对象的模板,对象是类的一个个实例、个体.
3、如何定义一个类:
一个全面的类定义比较复杂包含
package包名
class类名 extends 父类 implements
接口名{
成员变量:它是类的一个组成部分一般是基本数据类型,也可是引用类型(即使用了其他类)
构造方法
成员方法
}
4、类的成员方法
public 返回数据类型 方法名(参数列表){
语句
}
1.参数列表:表示成员函数输入
2.数据类型(返回类型):表示成员函数输出
3.函数主体:表示为了实现某一功能代码块
5、java面向对象---this代词
java虚拟机给每个对象分配一个this,代表当前对象。
注意事项:this不能在类定义外部使用,只能在类定义的方法中使用。
6、类变量、类方法
1)类变量:类变量是该类所有对象共享的变量,任何一个该类的对象去访问它时,取到的都是相同的值,同样任何一个该类的对象去修改它时,修改的也是同一个变量。
2)如何定义类变量
定义语法:访问修饰符static 数据类型
3)如何访问类变量
类名.类变量名或者对象名.类变量名
static int i = 1;
static{
i++
system.out.println(i);
该静态区域块只能被执行一次
}
4)什么是类方法,为什么有类方法?
类方法是属于对象实例的,其形式如下:
访问修饰符 static 数据返回类型 方法名(){}
注意:类方法中不能访问非静态变量
使用:类名 .类方法名或者对象名.类方法名
类方法属于与类相关的,公共的方法
实例方法属于每个对象个体的方法
类方法可以通过类名.类方法直接访问
5)java对象的三大特征
封装、继承、多态。(抽象这一个特性可参考)
a、封装:就是把抽象出来的数据和对数据的操作封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作(成员方法)才能对数据进行操作。
b、封装--访问控制修饰符
java 提供四种访问控制修饰符号控制方法和变量的访问权限:
. 公开级别:用public 修饰,对外公开
.受保护级别:用protected修饰,对子类和同一个包中的类公开。
.默认级别:没有修饰符号,向同一个包的类公开。
.私有级别: 用private修饰,只有类本身可以访问,不对公开。
c、java 包有三大作用
.区分相同名字类
.当类很多时,可以很好的管理类
.控制访问范围
d、打包命令
package com.river
f、包的命名规范
小写字母 比如:com.sina.river
g、常用的包
一个包下,包含很多类,java中常用的包有:java.lang.包自动引入; java.util.工具包; java.net.网络开发包;java.awt.窗口工具包。
6)继承的注意事项
a、子类最多只能继承一个父类(指直接继承)
b、java所有类都是Object类的子类。
7)方法的重载注意事项
a、方法名相同
b、方法的参数类型,个数,顺序至少有一项不同
c、方法返回类型可以不同
d、方法的修饰符可以不同
###如果只是返回类型不同不能构成重载#####
###如果只是方法的修饰符不同不能构成重载#####
8)多态
多态就是指在一个引用(类型)在不同情况下的多种状态即多态是指通过指向父类指针来调用在不同子类中实现的方法。
9)抽象类
抽象类解决之道:当父类的一些方法不确定可以用abstract关键字来修饰方法【抽象方法】,用abstract来修饰的类是抽象类。
抽象类的注意事项
1、抽象类不能被实例化
2、抽象类不一定要包含abstract方法
3、抽象类一旦包含abstract方法则这个类必须声明为abstract
4、抽象方法不能有主体
10)接口
a、接口:就是给出一些没有内容方法封装到一起,到某个类要使用时候根据具体情况把这些方法写出来,语法:
//定义接口
interface Usb{
//声明两个方法
public void start();
public void stop();
}
class 类名 implements 接口{
方法;
变量
}
小结:接口是更加抽象的抽象类,抽象类里的方法可以有有方法体,接口里的所有方法都没有方法体。接口体现了程序设计的多态和高内聚低耦合的设计思想
当一个类实现接口时候要求该类把接口所有方法都是实现
问题:请举例说明接口怎样体现多态?
interface Usb{
//声明两个方法
public void start();
public void stop();
}
//定义类实现了USB接口
//
class Camera implements Usb{
public void start() {
System.out.println("Camera start 开始");
}
public void stop() {
System.out.println("Camera stop 开始");
}
}
class Phone implements Usb{
public void start() {
System.out.println(" Usbstart 开始");
}
public void stop() {
System.out.println("Usb stop 开始");
}
}
class Computer {
public void useUseb(Usb usb) {
usb.start();
usb.stop();
}
}
public class jiekou {
public static void main(String[] args) {
// TODO Auto-generated method stub
Computer computer = new Computer();
//只要改类实现了接口就可以这样用了
Camera camera = new Camera();
computer.useUseb(camera);
Phone phone = new Phone();
computer.useUseb(phone);
}
}
b、接口注意事项
1、接口不能被实例化
2、接口中所有的方法不能有主体
3、一个类可以实现多个接口
4、接口中可以有变量【但变量不能用private 和 protected修饰】:
a、接口中变量,本质上都是static的而且是final类型的(不管是否加static修饰)
b、在java开发中,我们经常把常用的变量定义在接口中,作为全局变量使用。访问形式:接口名.变量名。
5、一个接口不能继承其他类,但是可以继承别的接口.
11)绑定
绑定:将一个方法调用同这个方法所属的主体(也就是对象或类)关联起来叫做绑定 可以分为前期绑定和后期绑定
1、前端绑定:在程序运行之前进行绑定,由编译器和连接程序实现,又称静态绑定比如static方法和final方法,注意这里也包括private方法因为它是隐式final的
2、后期绑定:在运行时根据对象的类型进行绑定,由方法调用机制实现又称动态绑定
12)final
final 可以修饰变量或者方法
在某些情况下,程序员可能有以下需求:
1、当不希望父类的某个方法被子类覆盖(voerride),可以用final修饰。
2、当不希望类的某个变量的值被修改可以用final修饰;如果一个变量用final来修饰,该变量必须赋初始值
3、当不希望类被继承时候可以用final修饰。
13)InputStreamReader输入控制
14)数组排序:
a、插入式排序:
插入式排序的基本思想是:
把n个等待排序的元素看成一个有序表和一个无序表。
开始时有序表中只包含一个元素。
无序表中包含有n-1个元素;
排序过程中每次从无序表中取出第一个元素;
把它的排序码依次与有序表元素的排序进行比较;
将它插入到有序表中的适当位置,使之成为新的有序表。
b、快速排序法
通过一趟排序将要排序的数据分割成独立的两部分
其中一部分的所有数据都比另外一部分的所有数据都要小,
然后在按此方法对这两部分数据分别进行快速排序;
整个排序过程中可以递归进行,以此到达整个数据变成有序序列
15)、集合类主要分为
List结构的集合类:ArraryList类,LinkedList类,Vector类,Stack类;
Map结构的集合类:HashMap类,Hashtable类;
Set结构的集合类:HashSet类,TreeSet类;
Queue结构的集合:Queue接口。
16)java中 字符串比较 “==”是比较是内存中地址所以判断字符串内容相等是str1.equals(str2)
17)ArrayList 和Vector 的区别
ArrayList 与Vector 都是java的集合类,都可以用来存放java对象,它们也有区别:
1、同步性:
Vector 是同步的,这个类中一些方法保证Vector中的对象是线程安全的;
ArrayList 是异步的因此ArrayList中的对象并不是线程安全的。
故此同步的要求会影响执行的效率,若不需要线程安全的集合可选ArrayList
2、数据增长:
从内部实现机制来说ArrayList和Vector都是使用数组(Array)来控制集合中的对象。当向这两种类型中增加元素时候,如果元素数目超出内部数组目前的长度它们都需要扩展内部数组的长度。
Vector缺省情况下自动增长原来一倍数组长度;
ArrayList是原来的50%,所以最后获得的这个集合所占的空间总是比实际所需要的大,故在集合中保存大量数据使用Vector有优势。
18)HashMap与Hashtable的区别
1、历史原因:
Hashtable是基于陈旧的Dictionary类的,HashMap是java1.2引进Map接口的一个实现。
2、同步性:
HashTable是同步的,这个类中一些方法保证了HashTable中对象的线程安全;HashMap则是异步的。
3、值:HashMap可以让你将控制座位一个表的条目的key和value,但HashTable是不能放入空值null的
19)java异常分类
1、检查性异常:java.lang.Exception
2、运行期异常:java.lang.RuntimeException
3、错误:java.lang.Error
顶层是java.lang.Throwable类,检查性异常、运行期异常、错误都是这个类的子孙类。java.lang.Exception和java.lang.Error都继承自java.lang.Throwable。而java.lang.RuntimeException继承自java.lang.Exception。
20)java中IO流对象结合一些对象实现数据储存
1、Properties 表示一个持久的属性集。它可以保存在流中或者从流中加载。属性列表中每个键及其对应值都是一个字符串。
特点:
a、它是hashtable的子类,map集合中的方法都可以用。
b、该集合没有泛类型。键值都是字符串。
c、它是一个可以持久化的属性。键值可以存储到集合中也可以存储到持久化设备(硬盘、U盘、光盘)上。键值的来源也可以是持久化的设备
注意:对象序列化时候它的静态变量不能被序列化。
对象的成员变量被 关键字 transient 修饰时,该成员变量不能被序列化.
21)java多线程
开启多线程有两种方式:
1、继承Thread类,重写run方法
public class subThread extends Thread {
public void run() {
for(int i = 0; i < 1000; i++){
System.out.println("subThread..... "+ i);
}
}
}
调用
subThread subThread = new subThread();
subThread.start();
2、实现Runable接口 重写run方法
public class subRunable implements Runnable {
@Override
public void run(){
for(int i = 0 ; i < 1000; i++){
System.out.println("sunRunable...."+i);
}
}
}
调用
subRunable subRunable = new subRunable();
new Thread(subRunable).start();
21)java多线程的线程安全
多线程同时操作一个共享数据时候,往往会出现安全问题。
解决线程安全问题:线程同步技术
22)线程通信
多个线程在处理痛一个资源,但是处理的动作(线程任务)却不相同,通过一定的手段使各个线程能有效的利用资源,而这种手段即--等待唤醒机制。
等待唤醒机制所涉及方法有以下几种:
1、wait():等待,将正在执行的线程释放其执行资格和执行权,并存储到线程池中。
2、notify():唤醒线程池中被wait()的线程,一次唤醒一个而且是任意的。
3、notifyAll():唤醒全部即-----可以将线程池中所有wait() 的线程都唤醒
23)java之数据库
1、mysql 使用6.0之前的版本是免费的
mac 电脑安装好mysql后需要修改密码
若出现Mac上解决Mysql ERROR 1045 (28000): Access denied for user 'root'@'localhost'这样情况解决如下:
解决步骤:
1、首先在设置中关闭mysql服务;
2、然后打开终端,输入:sudo mysqld_safe --user=mysql --skip-grant-tables --skip-networking &
再输入:sudo mysql -u root mysql
进入mysql>
执行以下命令:update user set password_expired = "Y" where user="root";
再输入:flush privileges;这一步很重要
然后:quit
3、进行登陆
输入:mysql -uroot -p
会提示你输入密码,这个密码就是安装mysql时出现的。
4、登陆成功之后可以修改密码:
set password for root@localhost = password('123456');
之后登陆就用123456这个密码了。
#####################################################
在Mac OS X启动和停止MySQL服务的命令
启动MySQL服务
sudo /usr/local/mysql/support-files/mysql.server start
停止MySQL服务
sudo /usr/local/mysql/support-files/mysql.server stop
重启MySQL服务
sudo /usr/local/mysql/support-files/mysql.server restart
2、JDBC 链接数据库
JDBC(Java Data Base Connectivity)是一种用于执行SQL语句的Java API可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成,是Java访问数据库的标准规范。
JDBC 需要连接驱动,驱动是两个设备要进行通信,满足一定通信数据格式,数据格式由设备提供商规定,设备提供商呗设备提供驱动软件,通过软件可以与该设备进行通信。
3、JDBC开发步骤
1、注册驱动(告诉JVM虚拟机使用的是哪个一个数据库)
----------------------------------------
try {
Driver driver = new Driver();
DriverManager.registerDriver(driver);
} catch (SQLException e) {
e.printStackTrace();
}//看源码造成了注册了两次驱动
所以注册驱动最好的方式就是使用反射机制将驱动类加入到内存中。
推荐使用:
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}去注册驱动。
----------------------------------------
2、获得链接(使用JDBC类,完成对MySql数据库链接)
获得数据库链接DriverMannager类中静态方法:static Connection getConnection(String url,String user,String password)
返回值是Connection接口的实现类,在mysql驱动程序中的实现类。注意:url的链接方式:jdbc:mysql://连接主机Ip: 端口号//数据库的名字。例如:String url = "jdbc:mysql//localhost:3306//mydatabase"
3、活动语句执行平台(通过连接对象获取对Sql语句的执行对象)
4、执行sql语句(使用执行对象,向数据库执行Sql语句;获取到数据库的执行后的结果)
5、处理结果
6、释放资源
4、JDBC 使用配置文件properties 配置文件来实现数据库的链接
通常情况下以下要求:
1、文件位置:任意,建议src下;
2、文件名称:任意,扩展名为properties;
3、文件内容:一行一组数据,格式是“key=value”
a)key命名自定义,如果是多个单车习惯使用点分割。例如jdbc.driver;
b) value值不支持中文,如果需要使用非英文字符,将进行unicode转换
5、使用一个工具DButils
这个类中使用QueryRunner实现查询操作
1、query(Connection conn,String sql,ResultSetHander
ResultSetHander 结果集的处理类
1、ArrayHandler 将结果集中的第一条记录封装到一个 Objcet[]数组中,数组中的每一个元素就是这条记录中的每一条字段值。
2、ArrayListHandler 将结果集中的每一条记录都封装到一个Object[]数组中,将这些数组在封装到List集合中。
3、BeanHandler 将结果集中第一条记录封装到一个指定javaBean中。
4、BeanListHandler 将结果集中每一条记录封装到指定JavaBean中,将这些javaBean再封装到LIst集合中。
5、ColumnListHandler 将结果集中指定的列的字段,封装到一个LIst集合中。
6、ScalarHandler 它是用于单数据,例如 select count(*)from 表操作
24)网络编程
1、UDP协议
a、Java实现UDP协议的发送端
实现封装数据的类:java.net.DatagramPacker 将数据包装起来
实现数据传输的类:java.net.DatagramSocket 将数据发送出去
实现步骤:
1. 创建DatagramPacker对象,封装数据,接收端的地址和端口
2.创建DatagramSocket
3. 调用DatagramSocket 类方法send,发送数据包
4.关闭资源
b、java实现UDP协议的接收端
实现封装数据包java.net.DatagramPacker 将数据接收
实现输出传输 java.net.DatagramSocker 接收数据包
实现步骤:
1、创建DatagramSocker对象,绑定端口号,端口号要跟发送端设置的端口号一致。
2、创建字节数组,接收发来的数据。
3、创建数据包对象DatagramPacker
4、调用DatagramSocket对象方法 receive(DatagramPacker dp)接收数据,数据放在数据包中
5、拆包:
发送的IP地址
接收到的字节个数
发送端的端口号
6、关闭资源
2、TCP协议
TCP通信是严格区分客服端和服务器端的,在通信时,必须先由客服端去链接服务器才能实现通信。服务器端不可以主动连接客户端,并且服务器程序需要事先启动,等待客服端连接。
在java的SDK中提供两个类用于实现TCP程序,一个是SeverSocket类用于服务器端,一个Socket类用于客户端。
通信时,首先创建代表服务器端的ServerSocket对象,该对象相当于启动一个服务,并等待客户端连接。然后客户端的Scoket对象向服务器端发出连接请求,服务器端响应请求,两者建立连接开始通信。
25)java反射机制
1、类加载
当程序要使用某一个类时候,如果该类还没被加载到内存中,则系统会通过加载、连接、初始化三步来实现对这个类初始化。
1、加载:就是指将class文件读入到内存并为之创建一个Class对象。任何类被使用时系统都会简历一个Class对象。
2、连接:验证是否正确的内部结构,并和其他类协调一致准备负责为类的静态成员分配内存,并设置默认初始化值解析将类的二进制数据中符号引用替换为直接引用
3、初始化:初始化步骤。