1、java面向对象三大特征:封装、继承和多态。(继承之后又方法的重载、和重写)
构造方法是在实例化对象时用的对其主要作用是初始化对象的成员变量,一个类可以
有多 个构造方法,根据在实例化对象时所给 的参数个数不同来,区分使用了哪个构
造方 法
this java虚拟机给每个对象分配一个this,这个this是属于当前对象的
this只能在类定义方法中使用,不能在类外面试用
Static修饰的变量时类变量(静态变量)在类创建时产生,这个类实例化的任何一个对象
都可以使用 可以通过 类名.变量名 或 对象名.变量名 来访问
Java中的规则:类方法不允许去访问成员变量,非静态的方法既可以访问静态变量也可以访问成员变量
封装:访问权限 public protected 没有修饰符 private
访问级别 | 访问控制修饰符 | 同类 | 同包 | 子类 | 不同包 |
公开 | public | 可以 | 可以 | 可以 | 可以 |
受保护 | protected | 可以 | 可以 | 可以 |
|
默认 | 没有 | 可以 | 可以 |
|
|
私有 | private | 可以 |
|
|
|
多态:通过指向父类的指针,来调用在不同子类中实现的方法。
用父类声明一个引用,然后用不同的子类去实例化这个引用,就可以用这个引用去
一个类继承了抽象类,就必须实现这个抽象类中的所有方法
一个类实现了一个接口,就必须实现这个接口中的所有方法,接口中的变量都自己默认为是public的静态的且final的。通过接口名可以直接取出变量
类不想被继承用final修饰
方法不想被覆盖(重写)有final修饰
变量不希望被修改用final修饰 这个变量必须赋初值
Java总结:类 成员变量 类变量(static静态变量)成员方法 类方法 (类变量、类方法 不需要实例化可以直接同过该类使用)
this可以出现在实例方法和构造方法中(不能出现在类方法中)
A.当this关键字出现在构造方法中时,代表用该构造方法所创建的对象
B.当this出现在类的实例方法中,代表正在调用该方法的对象
类的继承方法的覆盖(重写)类中方法的重载 接口的实现 多态 抽象类 final属性
方法重载的意思就是:一个类中可以有多个方法具有相同的名字,但这些方法的参数必须不同(个数不同或类型不同)也就是功能多态性的体现
super 子类不能继承父类的构造方法子类若要使用父类的构造方法就必须在子类的构造方法中使用且前面必须加上关键字super
在子类中想使用被子类隐藏了的父类的成员变量或方法就必须使用super。
抽象类:抽象方法必须在抽象类中 子类继承了抽象类就必须实现父类的抽象方法。
2、数组定义一个对象数组之后在使用这个对象数组之前一定要再次为数组分配内存空间new一次。
Dog为一对象
Dog dogs[] = new Dog[4];//定义对象数组
dogs[i] = new Dog(); //使用对象数组之前要new下
数组和对象数据类型通过主函数调用外面过类的方法进行操作发生的改变可以改变数组和对象的值,但是若是简单数据类型的数据在通过主函数调用外面类的方法操作之后变量的值不该变。
// 打印系统当前时间
Calendar calendar = Calendar.getInstance();
Nowtime=calendar.getTime();
System.out.println(Nowtime);
若还有使用时间就必须
calendar = Calendar.getInstance();
之后才可得到有一个当前时间
比较两个时间的先后时可用Calendar 类中的beafor()和after()方法。
产生随机数 Math.random()这个函数产生一个[0,1)的数
乘以相应的倍数可得相应的随机数
switch()的条件可以是 char/int/byte/short/枚举四种类型
3、二进制在java中全部是有符号的表示
A,二进制的最高位是符号位:0表示正数,1表示负数
B,正数的原码,反码,补码都一样
C,负数的反码=他的原码符号位不变其他位取反
D,负数的补码=反码+1
E,0的反码,补码都是0
F,java没有无符号数,换言之,java中的数都是有符号的
G,在计算机运算的时候,都是以补码的方式运算的
Java中有4个位运算
按位与&:两位全为1,结果为1
按位或|:两位有一个为1,结果为1
按位异或:两位一个为0一个为1,结果为1
按位取反:0-->1,1-->0;
Java 中3个移位运算符
算数右移>>低位溢出,符号位不变,并用符号位补溢出的高位
算数左移<<符号位不变,低位补0
逻辑右移>>>低位溢出,高位补0
4、java中常用的集合类(增加、删除、修改、显示)<从中取出值时都要强转成相对应的类型>
Vector Stack ArrayList HashMap LinkedList Hashtable
Java中的集合类主要有以下几种
A
List结构的集合类ArrayList类、LinkedList类、Vector类、Stack类
(1)ArrayList 数组链表
(2)LinkedList队列链表
ll.addFirst()/.addLast()/.getFirst()/.getLast()提供了
更多的方法满足我们对链表的操作如:在链表最前面添加数据或取出链
表最后面的数据
(3)Vector
(4)Stack 栈 .add()从前面添加
以上大同小异,都属于list结构都没有键值。
B
Map结构的集合类HashMap类、Hashtable类
HashMap添加记录
hashMap.put("sn001", emp1)//添加的是键值对两个对象类型
HashMap取出值
Emp emp = (Emp) hashMap.get("sn001");//根据键取出对应的值
HashMap的遍历相对麻烦
在遍历之前要定义一个迭代器
Iterator it = hashMap.keySet().iterator();
while (it.hasNext()) // 返回一个boolean值判断是否还有下一个
{
// 取出key
String key = it.next().toString();
// 通过Key取出value值
Emp emp = (Emp) hashMap.get(key);
System.out.println("名字" + emp.getName());
System.out.println("薪水" + emp.getSal());
}
注意:从HashMap中取出的数据都为Object值要强转类型
Hashtable是同步的(线程同步),这个类的同步使得存放在Hashtable中
的对象是线程安全的。HashMap是异步的,因此HashMap中的对象并不是安全的。同步的要求会影响到执行速率,因此在不必要要求线程安全时用HashMap
会大大提高执行速率(类似区别的还有Vector【同步】与ArrayList【异步】)。还有就是HashMap可以存放空值,Hashtable不能存放空值
C
Set结构的集合类HashSet类、TreeSet类
D
Queue结构的集合 Queue接口
Vector与ArrayList的区别出了同步异步以外还有就是在数据增长上的差别
在添加数据时若初始化的容量不够时就会自动增长数据空间Vector增长是100%,Arraylist增长是50%,所以在存放大量数据时你可以通过设置集合的初始化大小Vector具有一定的优势可以避免不必要的资源开销
小结:1.如果要求线程安全,使用Vector和Hashtable
2 如果不要求线程安全,应使用ArrayList、LinkedList、HashMap
3如果要求键值对,则使用HashMap、Hashtable
4如果数据量很大有要求安全考虑Vector
5、类型转换
String转换成float型
floatsal = Float.parseFloat(bReader.readLine());
爆炸效果
1.在Panel中定义三个图片并在构造函数中初始化
2.创建一个爆炸的类并在panel中定义一个存放爆炸对象的向量集合
3.在击中时创建一次爆炸并放入到集合中
4.在paint函数中把爆炸从集合中取出并绘制爆炸
Java中数据库的操作(netstat -an)查看端口(netstat -anb)查看端口号和使用该端口的应用程序信息。
executeUpdate()可以执行数据的添加、删除、修改并可以返回一个int型的数表示执行的SQL语句所影响的行数。
rs=ps.executeQuery();可以执行数据的查询操作并返回一个结果集
6、4)线程问题
创建线程的方法有两种,继承Thread和实现Runnable接口
1.对于继承Thread的线程只要在主函数中实例化以后就可以使用
对象名.start 及开始执行对象里面的run()函数。
2.<!--[endif]-->对于实现Runnable接口的线程,要先实例化目标对象 A a=new A()
在创建目标对象为a的线程 ThreadA = new Thread(a),当然这些也
可以在目标对象的构造方法中进行及当实例化目标对象时就创建了线程。
3.可以在主函数中启动线程也可以在线程中启动其他线程。
调用线程名.interrupt()函数可以使线程中断并发生
InterruptedException异常并使其结束休眠进入等待CPU资源队列。
4.线程同步
要保证需要同步执行的代码的原子性,可以用语句synchronized (this) {需要同步执行的代码}同步代码块this可以是任意个对象每个对象都有一个对象锁当一号线程在运行时就会自动把对象标志位置0再来线程就不能执行而被放在了等待池里面等一号线程执行完后标志位置1二号线程就会开始运行
当有多个线程都要执行一个方法时,为了保证线程同步执行要用synchronized修饰该方法直到一个线程执行完该方法后才允许另一个线程去执行该方法。
在同步方法中使用wait()、notify()和notifyAll()方法;
当一个线程使用的同步方法中用到某个变量,而这个变量又需要另个线程修改后才可满足当前线程的需要,那么可在同步方法中使用wait()方法终端当前线程使其等待另一线程执行完之后调用notify()或notifyAll()通知等待中的线程结束等待从中断处继续执行(遵循先中断先继续的原则)。
线程的挂起、恢复和终止:需要挂起的线程调用wait()方法挂起该线程,使其主动让出CPU资源。为了恢复该线程可使挂起的线程的目标对象或挂起的线程本身执行notifyAll()方法恢复线程继续执行。
线程联合:当线程A正在执行,执行了B.join()则线程A与B进行了联合,那么线程A立即中断等待B执行完毕之后线程A才开始重新排队等待CPU资源。若A结束则B.join()不会产生任何效果。
线程守护:一个线程默认是非守护线程。thread.setDaemon(true);则线程thread是守护线程当程序中的非守护线程(user)运行结束时守护线程将立即结束运行。
获得线程的名字Thread.currentThread().getName();