//如果方法没被重写,则调用父亲的,重写过,则调用子类的
//多态:
对多个同类对象下达同样指令,而有不同执行结果
teachers[i].giveLesson();
}
2.抽象类抽象方法重写
a.抽象基类不能够实例化
b.抽象方法必须在抽象类中
c.实现抽象类继承,必须重写基类抽象方法
d.抽象方法只声明不实现(无方法体)
通过抽象基类new子类,调用父类.抽象方法()实现多态
抽象类抽象方法和直接重写的异同点?
接口
3.接口重写
a.接口是一套规范,接口中只声明方法(抽象方法public,abstract)
b.实现接口,就具有了接口的功能(实现接口,扩展了类功能)
c.接口可以实现多个,间接弥补了Java单继承的缺陷
Java常用接口
Collection,List,Iterable,Set
Connection,Statement,PreparedStatement
Comparable,Comparator,Runnable
Arrays.sort(ary);//排序数组是对象数组,需要对象类实现Comparable接口
Arrays.sort(ary,Comparator());//需要写一个类实现Comparator接口,可以用于同时排序多种
4.抽象类和接口的异同点
相同点:
都是多态的实现方式,都实现了重写
抽象类和具体实现类之间是一种继承关系,也就是说如果采用抽象类的方式,则父类和子类在概念上应该是相同的。
接口和实现类在概念上不要求相同,接口只是抽取相互之间没有关系的类的共同特征,而不去关注类之间的关系,它可以使没有层次关系的类具有相同的行为
抽象类是对一组具有相同属性和方法的逻辑上有关系的事物的一种抽象,而接口则是对一组具有相同属性和方法的逻辑上不相关的事物的一种抽象。
对于接口和抽象类的选择,反映出设计人员看待问题的不同角度。
抽象类用于一组相关的事物,表示的是“isa”的关系;而接口用于一组不相关的事物,表示的是“likea”的关系
抽象类和具体实现类之间是一种继承关系,也就是说如果采用抽象类的方式,则父类和子类在概念上应该是相同的。
接口和实现类在概念上不要求相同,接口只是抽取相互之间没有关系的类的共同特征,而不去关注类之间的关系,它可以使没有层次关系的类具有相同的行为
抽象类是对一组具有相同属性和方法的逻辑上有关系的事物的一种抽象,而接口则是对一组具有相同属性和方法的逻辑上不相关的事物的一种抽象。
对于接口和抽象类的选择,反映出设计人员看待问题的不同角度。
抽象类用于一组相关的事物,表示的是“isa”的关系;而接口用于一组不相关的事物,表示的是“likea”的关系
多态总结:
1.父类可以new一个子类;抽象类可以new一个继承类;接口可以new一个实现类;
2.当方法的参数是一个抽象类,实参可以填一个抽象类的继承类实例
3.当方法的参数是一个接口,实参可以填一个接口的实现类实例
四、Java类高级特性
1.内部类
外部类又叫Topclass顶级类,通常必须是public的
包含在外部类中的不带static的内部类,叫成员内部类
包含在外部类中static修饰的内部类,叫静态内部类
重点:
怎样在成员内部类(实例)方法中访问外部类(实例)对象?
Outter.this.属性(方法)
怎样在测试类中创建内部成员类对象?
Innerinner=outer.newInner();//需要导包,内部类在外部不可见
匿名内部类:
当某个方法的参数是抽象类或者接口时,在调用处直接new这个抽象类或接口,使用局部重写方法实现的方式,称为匿名内部类,这类语法在Java/Android中极其常见!
2.装箱和拆箱
引用类型和基本数据类型之间的转换,称为装箱拆箱
常用包装类:
Integer,Double,Character,Boolean,Float
装箱操作:
int->Interger
拆箱操作:
Integer->int
总结:
字符串转基本数据类型:
包装类.parseXXX(Stringstr)方法
基本数据类型转字符串:
String.valueOf(基本数据类型)方法
如:
”123”->123调用inti=Integer.parseInt(“123”)
3.枚举
早期代码,简单了解即可不需掌握。
枚举类中可以有普通属性和方法,枚举类的构造方法必须私有,枚举变量定义语法:
Colorcolor=Color.BLUE;//枚举类型变量名=枚举类型.枚举值
4.常用包,常用类
String,StringBuilder,StringBuffer异同点
String–不可变字符串,常用方法为索引,查找,比较等不改变字符串内容的方法
StringBuilder,StringBuffer都是可变字符串对象,需要new,常用方法基本一样,如追加,插入,替换,截取子字符串等等
CharSequence接口为String,StringBuilder,StringBuffer的统一接口
五、异常
程序中可能出现的错误,使用异常处理机制处理后,能够保证代码的健壮性,使程序可以正常运行。
异常的两种主要处理机制:
捕获:
try-catch-finally
抛出:
throw,throws
规则:
把可能发生异常的代码段,放置在try块中,预计可能引发的异常,使用多重catch(由子到父,通常最后一个是异常基类Exception)捕获和处理。
finally是无论异常触发与否都会执行的代码段。
如果异常不能主动被捕获,可以用条件判断,并主动抛出异常再做处理–throw关键字,捕获的异常类必须大于等于抛出的异常类
常见异常类:
受查:
Exception的子类,但不是RuntimeException的子类,必须强制捕获
IOException
SQLException
ClassNotFoundException
非受查异常:
RuntimeException包括它的所有子类
NullPointExcetion
InputMismatchException
NumberFormatException
ArrayIndexOutOfBoundsException
ArithmeticException
IllegalArgumentException
六、集合
集合框架图(重中之重!
!
!
)--记住每个接口的意思和常用方法
Iterable–迭代器,实现此接口,对象可以foreach,方法iterator()
Collection–集合,常用方法add,clear,remove,size,toArray
List–有序集合,方法除Collection的以外,get,set,indexOf等与索引有关的
重要实现类:
ArrayList:
内部是数组,顺序添加,遍历,索引效率较高
LinkedList:
内部是链表,中间插入,中间删除效率较高
Set–一个不包含重复元素的collection,最多包含一个null元素
Set本身为无序集合,如果需要排序,使用TreeSet
Map–键值对映射,键不能重复,根据唯一的键来查找值,键和值的类型需要指定。
常用方法put,containsKey,get,size,clear,keySet,values,entrySet…
Collections.sort方法:
自然排序(默认排序):
在要排序对象模板类中实现Comparable接口,调用时使用Collections.sort(List),一个参数的方法;
指定排序:
在同一段代码或同一个界面需要实现2种以上排序的,调用时使用Collections.sort(List,newComparator(){
@Override
publicintcompare(Studento1,Studento2){
returno2.getName().compareTo(o1.getName());
}
}),实现局部匿名内部类重写compare方法
七、IO
IO基本概念
Stream–动态从一头将数据传输到另一头的过程(多数流不会自动刷新,需要在流关闭时,或使用刷新方法才能传输到另一头)
字节流–不定长的流,与之相关的文件叫二进制文件或数据文件
字符流–定长的流,每个单元都是字符,字符流相关的文件叫字符文件,或文本文件
参考系–所有IO中读或者写,输入或者输出的参考系都是内存
二进制:
InputStream/OutputStream
文本:
Reader/Writer
举例:
程序->文本文件:
Writer
文本文件->程序:
Reader
程序->网络(二进制):
OutputStream
二进制文件->程序:
InputStream
File类常用方法
字符流常用类和方法(名字中有Reader/Writer的类)
FileReader/FileWriter
BufferedReader/BufferedWriter
字符流常规操作:
把需要写入的信息变为字符串String,通过类的方法write写入一行或多行,中间用自定义格式分割,读取时按照分割规律解析和还原,注意,所有信息都是以字符格式写出和读入。
当使用文件作为持久存储时,建议多次保存(增删改时),一次加载(UI初始化时)。
字节流常用类和方法(名字中有InputStream/OutputStream的类)
FileInputStream/FileOutputStream
ObjectInputStream/ObjectOutputSteam
转换类
InputSteamReader/OutputSteamWriter
八、XML解析
1.原理和概念:
XML(扩展标记语言);
以特殊的文本格式记录数据的一种方式,多数使用是手动编写,程序动态读取
也可以用来作为持久化信息存储的一种方式,或网络传输少量数据,学习重点是解析
2.DOM解析
核心代码:
DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();
DocumentBuilderbuild=factory.newDocumentBuilder();
Documentdocument=build.parse("stu.xml");
//获取文档解析根节点
Elementelement=document.getDocumentElement();
Noderoot=(Node)element;
//获取节点名称
System.out.println(root.getNodeName());
最重要的类Node(org.w3c.dom.Node)
重要方法:
getNodeName,getChildNodes,getAttributes,getTextContent...
3.SAX解析
核心代码:
编写内部类,或新建一个类,重写几个默认处理方法
startDocument
endDocument
startElement:
重要参数:
qName
endElement:
重要参数:
qName
characters:
newString(char[],intstart,intlen)
核心代码:
SAXParserFactoryfactory=SAXParserFactory.newInstance();
SAXParserparser=factory.newSAXParser();
//MyHandler为自定义类,继承自DefaultHandler,重写至少三个主要方法
parser.parse("stu.xml",newMyHandler());
九、线程
进程:
一个运行中的应用程序
线程:
一个进程中的多条执行路径,每个进程默认会创建一个主线程
使用线程的场合:
1.阻塞操作;2.延时操作;3.IO操作等…
线程状态:
1.新生态;2.就绪态;3.运行态;4.阻塞态;5.死亡态;
线程的常规写法:
1.基本都会有循环;
2.基本都有延时操作sleep;
3.线程一旦启动不能使用方法去终止,通常使用改变循环条件结束线程
线程类主要方法:
构造方法,Thread.sleep,Thread.currentThread,th.start();
一十、网络编程
Tcp/IP传输控制协议/网际协议
UDP用户数据报协议
1.Tcp服务器,客户端通讯过程
a.服务器ServerSocketserver=newServerSocket(intport);
Socketsocket=server.accept();//阻塞,客户端连接上后结束阻塞,需要线程单独处理
b.客户端Socket