首页 > 代码库 > 黑马程序员——Java基础总结01
黑马程序员——Java基础总结01
前言:自学视频有一段时间了,但是自认为效果一直不佳,觉得学得越多忘记越多。而且博客学得也不够好。今后三天专门翻看以前的内容。只注重最基础的知识,并用自己的语言表述,并附带一些题例。
一、面向对象
如何理解面向对象。
面向对象是相对于面向过程而言的,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 }
黑马程序员——Java基础总结01