JavaDay04总结
1、实现接口VS继承类:
- 实现接口是继承的补充
- 实现接口可以在不打破继承关系的前提下,对某个功能扩展
2、绑定:
- 前期绑定:在程序运行前进行绑定,由编译器和连接程序实现,又叫静态绑定
- 后期绑定:在运行时根据对象的类型进行绑定,由方法调用机制实现,又叫动态绑定
3、final:修饰变量或者方法
- 当不希望父类的某个方法被子类覆盖时
- 当不希望类的某个变量值被修改时
- 当不希望被继承时
注意:final修饰的变量又叫常量,用xx_xx_xx命名,并且变量在定义时必须赋初值且不能修改
使用final:1.因安全考虑,类的方法不能被修改 2.类不会被其他类继承 3.某些变量值固定不变
4、数组:
1.定义:数据类型 数组名[]=new 数据类型[大小];
eg.int a[]=new int [5];
int a[]=int []a
2.引用:数组名[下标] a.length
计算数组大小
3.初始化数组:int a[]={1,2,3,4,5}; 相当于 int a[]=new int[5];a[0]=1;a[1]=2;...
数组小结:(1)数组可以存放同一类型数据 (2)简单数据类型数组可直接复制 (3)对象数组在定义后,赋值时需要再次为每个对象分配空间 (4)数组大小必须提前指定 (5)数组名为数组首地址的使用 (6)数组的下标从0开始
5、对象数组:
/*
作者:mys
功能:对象数组的使用
日期:2018/7/13
*/
package cn.mys;
import java.io.*;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Demo16 {
public static void main(String []args) throws Exception
{
//定义一个可以存放四只狗的对象数组
Dog dogs[]=new Dog[4];
//从控制台输入各个狗的信息
InputStreamReader isr=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(isr);
for(int i=0;i<4;i++)
{
dogs[i]=new Dog();//创建一个空间存放狗的具体信息
System.out.println("请输入第"+(i+1)+"只狗的名字:");
//从控制台读取狗名
String name=br.readLine();//异常
//将狗名赋给对象
dogs[i].setName(name);
System.out.println("请输入狗的体重:");
//从控制台读取狗的体重
String s_weight=br.readLine();
//String->float
float weight=Float.parseFloat(s_weight);
//将狗体重赋给对象
dogs[i].setWeight(weight);
}
//计算总体重
float allWeight=0;
for(int i=0;i<4;i++)
{
allWeight+=dogs[i].getWeight();
}
//计算平均体重
float avrWeight=allWeight/dogs.length;
System.out.println("总体重:"+allWeight+" 平均体重:"+avrWeight);
}
}
class Dog
{
private String name;
private float weight;
public void setName(String name)
{
this.name=name;
}
public String getName()
{
return name;
}
public void setWeight(float weight)
{
this.weight=weight;
}
public float getWeight()
{
return weight;
}
}
6、二进制数操作
- 二进制的最高位是符号位:0正数,1负数
- 正数的原码、反码、补码一样
- 负数的反码=原码符号位不变,其余位取反
- 负数的补码=反码+1
- 0的反码、补码=0
- java的数都是有符号的
- 计算机在运算时,都是以补码的方式
位运算符:& | ^ ~
移位运算符:
- 算术左移<< :符号位不变,低位补0(相当于*2)
- 算术右移>> :符号位不变,低位溢出,并用符号位补溢出高位
- 逻辑右移>>>:低位溢出,高位补0
7、集合类:
分类
- List集合类:ArrayList类、LinkedList类、Vector类、Stack类
- Map集合类:HashMap类、Hashtable类
- Set集合类:HashSet类、TreeSet类
- Queue集合类:Queue接口
ArrayList和Vector区别:
- 同步性:Vector同步,保证线程的安全性;ArrayList异步,线程并不安全但是效率高。
- 数据增长:都使用数组来控制集合中的对象,当增加元素时,如果超出内部数组的目前长度,需要扩展,Vector在缺省的情况下自动增长为原来的一倍,ArrayList增长为原来的50%,若要在集合中保存大量数据,用Vector。
//ArrayList使用
//定义ArrayList对象
ArrayList a1=new ArrayList();
//显示大小
System.out.println("加入前a1大小:"+a1.size());
//向a1中加入数据(类型是Object)
//创建一个职员
Clerk clerk1=new Clerk("mys",19,1000);
Clerk clerk2=new Clerk("sky",20,1200);
Clerk clerk3=new Clerk("lucy",20,900);
//将clerk1加入到a1中
a1.add(clerk1);
a1.add(clerk2);
a1.add(clerk3);
a1.add(clerk1);//可以放入同样的对象
//显示大小
System.out.println("加入后a1大小:"+a1.size());
//访问a1中对象(数据)
//Clerk temp=(Clerk)a1.get(0);//注意类型要匹配
//System.out.println("第一个名字是:"+temp.getName());
//遍历a1所有对象
for(int i=0;i<a1.size();i++)
{
Clerk temp=(Clerk)a1.get(i);
System.out.println("第"+(i+1)+"个名字是:"+temp.getName());
}
//从a1中删除一个对象
a1.remove(2);
System.out.println("=====删除后====");
for(int i=0;i<a1.size();i++)
{
Clerk temp=(Clerk)a1.get(i);
System.out.println("第"+(i+1)+"个名字是:"+temp.getName());
}
}
HashMap和Hashtable区别:
- 历史:Hashtable基于陈旧的Dictionary类,HashMap是java1.2引进的Map接口的实现
- 同步性:Hashtable同步,HashMap异步
- 值:HashMap可将空值作为一个表的条目的key或者value,Hashtable不能空放入值null
小结:如果要求数据量很大,又要线程安全考虑时用Vector;要求键值时用Hashtable或HashMap
//HashMap、Hashtable使用
//创建一个HashMap对象
HashMap hm=new HashMap();
Clerk clerk1=new Clerk("mys","m20172213",1000);
//将clerk1放入hm
hm.put("mys",clerk1);
//如果要查找名为 mys
if(hm.containsKey("mys")) {
System.out.println("有该员工");
//取出键值
Clerk clerk=(Clerk)hm.get("mys");
System.out.println("编号:"+clerk.getNum());
}
else {
System.out.println("没有该员工");
}
//遍历HashMap中所有的key和value
//Iterator迭代
Iterator it=hm.keySet().iterator();
//hasNext返回一个Boolean
while(it.hasNext()) {
//取出key
String key=it.next().toString();
//通过key取出value
Clerk clerk=(Clerk)hm.get(key);
System.out.println("名字:"+clerk.getName());
System.out.println("编号:"+clerk.getNum());
System.out.println("薪水:"+clerk.getSal());
}
//Hashtable不能放入空值,HashMap可以
/*Hashtable ht=new Hashtable();
ht.put(null,null);*/
hm.put(null,null);
System.out.println("测试:"+hm.get(null));
8、泛型:本质:参数化类型,即所有的参数类型被指定为一个参数,可在类、接口和方法中创建,称为泛型类、泛型接口、泛型方法。安全简单,在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用性。
优点:1.类型安全 2.向后兼容 3.层次清晰 4.性能较高,用GL编写的代码可以为java编译器和虚拟机带来更多的类型信息,这些信息为java程序的进一步优化提供条件
/*
作者:mys
功能:泛型的使用
日期:2018/7/14
*/
package cn.mys;
import java.lang.reflect.Method;
import java.util.*;
import java.util.ArrayList;
public class Demo22 {
public static void main(String []args) {
//泛型
ArrayList<Dog> a1=new ArrayList<Dog>();
//创建一只狗
Dog dog=new Dog();
//放入集合
a1.add(dog);
//取出
//Dog temp=(Dog)a1.get(0); 强制转换
//Cat temp=(Cat)a1.get(0);//报错:ClassCastException,没有Cat对象
//使用泛型后不用强制转换
Dog temp=a1.get(0);
// Gen<Integer> gen1=new Gen<Integer>(1);
// gen1.showTypeName();
Gen<Dog> gen2=new Gen<Dog>(new Dog());
gen2.showTypeName();
}
}
class Cat {
}
class Dog {
String name;
int age;
public void count() {
}
}
//定义一个类
class Gen<T> {
private T o;
public Gen(T a) {
o=a;
}
//得到T的类型名
public void showTypeName() {
System.out.println("类型是:"+o.getClass().getName());
//通过反射机制,可以得到类型的很多信息,如成员函数名称
Method []m=o.getClass().getDeclaredMethods();
//打印
for(int i=0;i<m.length;i++){
System.out.println("成员函数名称:"+m[i].getName());
}
}
}
9、异常:当出现程序无法控制的外部环境问题(用户提供的文件不存在、文件内容损坏、网络不可用...),java就会用异常对象来描述。
异常分类:
1.检查性异常:java.lang.Exception 程序正确,因外在环境条件不满足而引发
eg.用户错误及I/O问题----程序试图打开一个并不存在的远程Socket端口,或者打开不存在的文件时
2.运行期异常:java.lang.RuntimeException 程序存在bug eg.数组越界
3.错误:java.lang.Error 可能源于程序的bug或环境问题(一般),eg.内存耗尽,错误在程序中无需处理,有运行环境处理
顶层是java.lang.Throwable类,以上三种异常都是这个类的子类
异常处理:程序运行产生异常发生时,将从异常发生中断程序并向外抛出异常信息。在出现异常的地方,就终止执行代码,然后进入catch,如果有多个catch语句,则进入匹配异常的那个catch
异常处理方法:
1.在发生异常的地方直接处理
2.将异常抛给调用者,让调用者处理
finally:将finally块置于try...catch后,finally块一般会得到执行,相当于一个万能保险,即使前面的try块发生异常而又没有对应异常的catch块,finally块将被执行
多个异常的处理:子类异常的处理块必须在父类异常处理块的前面,否则会发生编译错误,因此越特殊的异常越在前面处理,越普遍的异常越在后面处理
/*
作者:mys
功能:异常及其处理、finally
日期:2018/7/14
*/
package cn.mys;
import java.io.*;
import java.net.*;
import java.io.FileReader;
public class Demo23 {
public static void main(String []args){
/*异常
//检查异常
//1.打开文件
FileReader fr=new FileReader("d:\aaa.text");
//2.连接一个192.168.1.1 IP端口号123
Socket s=new Socket("192.168.1.1",123);
//运行异常
int a=4/0;//除数为0
int b[]={1,2,3};
System.out.println(b[10]);//数组越界
*/
FileReader fr=null;
try{
//在出现异常的地方,就终止执行代码,然后进入catch
//如果有多个catch语句,则进入匹配异常的那个catch
Socket s=new Socket("192.1688.1.1",123);
//FileReader fr=new FileReader("d:\aaa.text");
fr=new FileReader("d:\aaa.text");
}catch (Exception e){
//把异常的信息输出,利于排除bug
e.printStackTrace();
}finally {
//这个语句块,不管有没有异常都会执行
//一般说,关闭需要的资源[文件,连接,内存]
System.out.println("进入finally");
if(fr!=null){
try{
fr.close();
System.out.println("文件已关闭");
}catch (Exception e){
e.printStackTrace();
}
}
}
}
}
/*将异常抛给调用者
class Father {
private Son son=null;
public Father() {
son=new Son();
}
public void test1(){
//son.test();//调用时出现异常
}
}
class Son {
//将异常处理抛出,给调用者
public void test()throws Exception{
FileReader fr=new FileReader("d:\aaa.text");
}
}
*/