首页 > 代码库 > 黑马程序员——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