---恢复内容开始---
-----------android培训、java培训、java学习型技术博客、期待与您交流!-----------
前言:自学视频有一段时间了,但是自认为效果一直不佳,觉得学得越多忘记越多。而且博客学得也不够好。今后三天专门翻看以前的内容。只注重最基础的知识,并用自己的语言表述,并附带一些题例。
一、面向对象
如何理解面向对象。
面向对象是相对于面向过程而言的,C语言是面向过程,如果以面向过程的思想吃饭的话,就需要从种子——栽培——施肥——收割——做法等等过程全部都要参与进入,事情变得很复杂,没有复用性。而以面向对象的思想吃饭的话,就只需要我吩咐说我要吃饭,然后其他各种农民啊、成功老板啊等等帮助我完成这件事。
所以面向对象的特点:符合人们思考习惯、问题简单化、从执行者变指挥者:在完成需要时,找到合适的对象执行就可以了,没有这个对象就自己
创建,提高复用性。
面向对象三大特征:封装、继承、多态
封装:
封装就是将具体对象一些属性和方法通过封装打包到一起,对外提供一种访问形式。
继承:
当多个类拥有相同的功能时,那么这些类不需要每个都写这些相同的功能,只需要把相同功能抽到
一个单独的类中,继承这个类就能获得这些相同的功能;
(1)继承的体系结构:就是对要描述的事物进行不断的向上抽取,就出现了体系结构。
- 要了解这个体系结构中最共性的内容,就看最顶层的类。
- 要使用这个体系的功能,就用最底层的类创建对象
多态:
多态可以理解为事物存在的多种体系形式。比如猫,是猫也是动物
重写(override)和重载(overload)的区别:
重载的特点:
重载在同一类中。
重载方法名相同,参数列表不同。
重写的特点:
重写要有继承关系。在子父类中
重写方法的声明相同。(方法名和参数列表都相同)
子类覆盖时,子类方法权限一定要大于等于父类方法权限
父类的权限不能是私有的
父类静态只能覆盖静态。
接口:
当一个类中所有的方法都是抽象的时候,你没必要定义为抽象类,定义为接口就可以了。
(2)成员特点:所以不能被创建,只能被继承
- A:只有成员变量和成员方法。
- B:成员变量 默认修饰符 public static final
- int X = 20;
- 其实是这样的 public static final int X = 20;
- C:成员方法 默认修饰符 public abstract
- void show();
- 其实是这样的 public abstract void show();
- 建议:为了便于阅读,自己手动加上修饰符
(3)解决了java中只能单继承的问题。(对多继承进行了优化)
-
- A:类与类:只能是单继承。 extends
- B:接口与接口:可以是单继承,也可以是多继承。 extends
- C:类与接口:可以是单实现,也可以是多实现。 implements
.StringBuilder和StringBuffer
- 1.StringBuilder和StringBuffer与String的区别
- StringBuilder和StringBuffeer是可变字符序列
- String是不变得,一但被初始化,就不能改变
- 2.StringBuilder和StringBuffer的区别
- StringBuilder是线程不安全的,所以效率比较高,1.5版本出现
- StringBuffer是线程安全的,效率相对较低,1.0版本出现的
多线程
线程就是控制进程的控制单元,一个进程由多个线程控制时,可以起到同时运行的作用;
两种创建线程的方法:implements Runnable和Extends Thread
然后两种都要复写run()方法。和使用start()启动
不同的是:继承的直接创建类复写run,启动时新建类的对象后star()启动
而实现的方法在启动时创建线程并把刚刚的新建的对象作为参数,最后启动start();
使用方法不同,同时实现法可以避免单继承的局限性;
线程的几种状态:
线程的几种状态
在Java当中,线程通常都有五种状态,创建、就绪、运行、阻塞和死亡。
第一是创建状态。在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态。
第二是就绪状态。当调用了线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。
第三是运行状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码。
第四是阻塞状态。线程正在运行的时候,被暂停,通常是为了等待某个时间的发生(比如说某项资源就绪)之后再继续运行。sleep,suspend,wait等方法都可以导致线程阻塞。
第五是死亡状态。如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪。
集合体系:
集合是一种容器, 长度可变, 可以存储任意类型的对象
与数组不同
数组也是存储对象的容器,但长度固定,而且只能是基本数据类型;集合长度可变,可以存储对象;
ArrayList和LinkedList的区别?
Collection
List:
|--ArrayList:底层的数据结构使用的是数组结构;查询快,增删慢,不同步
|-LinkedList:底层的数据结构使用的是链式结构;查询慢,增删快
|-Vector:底层数组结构:同步
Set:
|——HashSet:底层数据结构式哈希表。不同步,判断依据是hashCode值,然后是equals
|——TreeSet:底层数据位2查数,判断依据是compareTo和hashCode
Map
|-HashMap:哈希表,hashCode,equals
|-TreeMap:二叉树,compareTO,hashCode
基本数据类型:
在上图中没有Stirng,实际上String首字母大写代表他是一个类,所以是引用数据类型。
练习:
复制图片:
1 package TEST; 2 /*复制图片到另一个地方 3 * 思路:1、复制字节流的图片FileInputStream和FileOutputStream,IO流 4 */ 5 import java.io.*; 6 public class test_2Copy { 7 public static void main(String[] args)throws IOException{ 8 // 定义方法 9 byteCopy(); 10 } 11 private static void byteCopy()throws IOException { 12 FileInputStream fis=new FileInputStream("D:\\123.jpg"); 13 FileOutputStream fos=new FileOutputStream("D:\\321.jpg"); 14 byte[] buf=new byte[1024]; 15 int len=0; 16 while((len=fis.read(buf))!=-1){ 17 18 fos.write(buf,0,len); 19 } 20 fis.close(); 21 fos.close(); 22 } 23 }
键盘接受数据并放入文本中:
1 package TEST; 2 /*控制台输入中文并写入文本中 3 * IO流,需要缓冲流和转换流 4 * 输入over时结束 5 */ 6 import java.io.*; 7 public class test_3System_in { 8 public static void main(String[] args)throws IOException{ 9 BufferedReader bufi= 10 new BufferedReader(new InputStreamReader(System.in)); 11 File file=new File("D:\\pp.txt"); 12 BufferedWriter bufr= 13 new BufferedWriter(new FileWriter(file)); 14 String line=null; 15 while((line=bufi.readLine())!=null){
if(line.equals(over)){
break;
} 16 bufr.write(line); 17 bufr.newLine(); 18 bufr.flush(); 19 } 20 bufi.close(); 21 bufr.close(); 22 23 } 24 }
1 mport java.io.*; 2 public class PrintStreamDemo { 3 public static void main(String[] args)throws IOException{ 4 // 键盘录入 5 BufferedReader br= 6 new BufferedReader(new InputStreamReader(System.in)); 7 // 使用打印流并关联文件 8 File file=new File("D:\\a.txt"); 9 PrintWriter pw=new PrintWriter(new FileWriter(file),true);//true的刷新只针对流而已的 10 // 所以true前面的参数需要new一个FileWriter对象 11 12 String line=null; 13 while((line=br.readLine())!=null){ 14 if(line.equals("over")){ 15 System.out.println("程序结束"); 16 break; 17 } 18 pw.println(line.toUpperCase());//大写输出 19 // pw.flush;由于前面prinyWriter(,true)所以不需要刷新 20 } 21 br.close(); 22 pw.close(); 23 } 24 }
窗口售票问题:
1 package TEST; 2 /*编写三各类Ticket、SealWindow、TicketSealCenter分别代表票信息、售票窗口、售票中心。 3 * 售票中心分配一定数量的票,由若干个售票窗口进行出售,利用你所学的线程知识来模拟此售票过程。 4 */ 5 6 public class test_1Ticket { 7 8 public static void main(String[] args) { 9 10 Ticket tk = new Ticket();//建立票信息对象 11 TicketSealCenter tsc = new TicketSealCenter(tk);// 创建售票中心。 12 tsc.set(200);//售票中心分配一定数量的票 13 14 new Thread(new SealWindow(tk,"一号窗口")).start();// 创建、启动线程,开始卖票。 15 new Thread(new SealWindow(tk,"二号窗口")).start(); 16 new Thread(new SealWindow(tk,"三号窗口")).start(); 17 new Thread(new SealWindow(tk,"四号窗口")).start(); 18 19 } 20 } 21 class Ticket{ 22 private static int ticket; 23 public static int getTicket() { 24 return ticket; 25 } 26 public static void setTicket(int ticket) { 27 Ticket.ticket = ticket; 28 } 29 } 30 31 32 class TicketSealCenter{ 33 Ticket tk=null; 34 TicketSealCenter(Ticket tk){ 35 this.tk=tk; 36 } 37 38 public void set(int t){//它可以设置票数 39 Ticket.setTicket(t); 40 } 41 } 42 43 class SealWindow implements Runnable{ 44 private String name=null; 45 private Ticket ticket; 46 SealWindow(Ticket ticket,String name){ 47 this.name=name; 48 this.ticket=ticket; 49 } 50 public void run(){ 51 while(true){ 52 synchronized (ticket) { 53 int t=ticket.getTicket(); 54 if(t>0){ 55 System.out.println(name+": 第"+(t--)+"张票已卖出"); 56 ticket.setTicket(t);// 设置余票信息。 57 }else{ 58 System.out.println(name+": 票已售完");//票数为0. 59 break;// 退出循环。 60 } 61 } 62 } 63 } 64 }