您的位置:首页 > 博客中心 > 编程语言 >

黑马程序员——Java基础总结01

时间:2022-03-24 18:43

 

封装:

  封装就是将具体对象一些属性和方法通过封装打包到一起,对外提供一种访问形式。

 

继承:

  当多个类拥有相同的功能时,那么这些类不需要每个都写这些相同的功能,只需要把相同功能抽到

一个单独的类中,继承这个类就能获得这些相同的功能;

 

(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 }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

            

 

热门排行

今日推荐

热门手游