面向对象的实现:

  1.     发现类
  2.     发现类的属性
  3.     发现类的方法

封装:

    将类的某些信息隐藏,需要特定方法访问
    优点: 避免非法赋值,隐藏类的实现

public String getHealth(){
		    return this.health;
		}

		public void setName(int health){
		    if(health>0 && health< 100){	  
		    	this.health = health;
		    }else{            //使用set方法控制不合法的值
			this.health = 60;
		    }
		}

继承:

  继承就是子类继承父类 使得子类可以使用父类的属性  

public String getHealth(){
		    return this.health;
		}
		public void setName(int health){
		    if(health>0 && health< 100){	  
		    	this.health = health;
		    }else{              //使用set方法控制不合法的值
			this.health = 60;
		    }
		}

  Pet pet = new Dog();//创建父类对象,实例化子类
        ↑
  子类构造函数第一行 → 父类构造函数 → 子类构造函数内部 ----- 重点!!!

super
        不能访问父类的private成员
        调用构造方法,只能是第一句 this() super()


    final
        给类加上,不能被继承
        给方法加上,不能被子类重写
        只能初始化进行赋值,不能更改

abstract

        不能和static同时修饰一个方法
        不能和private同时修饰一个方法
        不能和final同时修饰一个方法或类
        抽象方法没有方法体,必须在抽象类或接口中
        抽象方法必须由子类重写,除非子类也具有抽象性
        不能修饰属性和构造方法(属性不被重写,构造方法不被继承)

    方法重写

        方法名和参数列表相同
        返回值类型相同或可以是其子类
        访问权限不能严于父类

    在类方法(静态方法)中,不允许出现this或super关键字
    如果子类的构造方法中没有通过this或super显示调用构造方法,系统会默认先调用父类的无参构造方法------(子类构造函数第一行 → 父类构造函数 → 子类构造函数内部)

 

多态

    要素:

      1.有继承关系

      2.子类重写父类方法

      3.父类的引用指向子类对象(创建父类对象,实例化子类)

    实现
      1.使用父类作为返回值类型
      2.使用父类作为方法形参,子类作为实参

      Java 对象名 instanceof 类名或接口

接口

    接口是一种能力,也是一种约定。

[修饰符] interface 接口名 extends 父接口1,父接口2{
//常量、方法
}

class 类名 extends 父类名 implements 接口1,接口2{
//类成员
}

Java中接口所有属性都是静态常量,必须要有初始值(自动有public static final)
public static final int a = 1; int b = 1; //在接口中,只有静态常量

Java中接口所有方法都是抽象方法(自动有public abstract)
public abstract show(); show(); //在接口中,只有抽象方法

Java中接口的实现类必须实现接口的全部方法,除非实现类具有抽象性

Java中接口和抽象类一样,不能实例化,不能有构造方法(实际上抽象类中可以有构造方法)
Java中接口之间可以通过extends实现继承关系,一个接口可以继承多个接口,但接口不能继承类

接口特性
    实现类可以实现多个接口
    所有的方法都是抽象方法
    所有的变量都是静态常量
    不能有构造函数,不能被实例化
    实现类必须实现接口的所有方法

异常:

九大异常

  1. Exception 异常层次结构父类
  2. ArithmeticException 算数错误,如以零作除数
  3. ArrayIndexOutOfBoundException 数组下标越界
  4. NullPointerException 尝试访问null对象成员
  5. ClassNotFoundException 不能加载所需要的类
  6. lllegalArgumentException 方法接收到非法参数
  7. ClassCastException 强制类型转换出错
  8. NumberFormatException 数字格式转换异常,如把"a"转换成数字
  9. InputMismatchException 输入与接受类型不匹配

try catch finally throws(声明) throw(抛出)
		public void ShowInfo() throws Exception{
		    //可能出现异常的代码
		}		try{
		      ShowInfo();
		}
		catch(ArithmeticException e){
		      //显示异常信息
		}
		catch(Exception e){
		      //显示异常信息
		}
		finally{
		      //最后执行的代码
		}

getMessage() 返回异常信息的字符串
printStachTrace() 用来输出异常的堆栈信息
异常处理时,子类异常必须放在父类异常的上面(不然不会执行子类异常)
如果catch块中有return,执行顺序是 try(出现异常) → catch(return上面的代码) → finally → return

log4j步骤

1.在项目中加入log4j所使用的JAR文件
2.创建log4j.properties文件
3.编写log4j.properties文件,配置日志信息
4.使用log4j记录信息

## 设置Logger输出级别和输出的目的地
		log4j.rootLogger = debug,con,file

		## 把日志信息输出到控制台
		log4j.appender.con = org.apache.log4j.ConsoleAppender
		log4j.appender.con.Target = System.err
		log4j.appender.con.layout = org.apache.log4j.SimpleLayout		## 把日志信息输出到文件
		log4j.appender.file = org.apache.log4h.FileAppender
		log4j.appender.file.File = jbit.log
		log4j.appender.file.layout = org.apache.log4j.PatternLayout
		log4j.appender.logfile.layout.ConversionPattern = %d %i %F %p %m %n

布局类型Layout

HTMLLayout 输出HTML表格
SimpleLayout 输出普通形式
PatternLayout 制定输出类型(没有配置,则用默认的)

转换模式ConversionPattern

%d:输出日期和时间 %d{yyy-MM-dd HH:mm:ss}
%m:输出制定消息 %i:输出日至事件发生位置
%n:输出换行符 %p:输出优先级
%F:输出文件名 %m:输出方法名

debug: fatal > error > warn > info > debug
日记记录器(Logger)将只输出那些级别高于或等于它的信息

集合框架

Java集合框架共有三大接口:List、Set、Map

Collection 丨    Map
  ↑   丨   ↑
List(唯一有序)   Set(唯一、无序) 丨 (键值对)
  ↑          ↑   丨   ↑
ArrayList LinkedList HashSet TreeSet 丨 HashMap TreeMap


ArrayList 遍历元素和随机访问元素的效率比较高
LinkedList 链表式储存,插入、删除元素效率比较高

List
    int size() 返回元素个数
    remove(Object o) 移除某个元素
    remove(int index) 根据下标删除
    Object get(int index) 返回指定索引的元素(Object)
    boolean add(Object o) 添加元素
    boolean contains(Object o) 是否包含该元素
    void add(int index,Object o) 在指定下标添加元素

Map
    int size() 返回元素个数
    void clear() 清空所有数据
    Set keySet() 返回键的集合
    Collection value 返回值的集合
    boolean isEmpty() 集合中是否有数据
    Object get(Object key) 根据key获取value
    boolean containKey(Object key) 是否包含该键
    Object put(Object key,Object value) 键必须唯一,重复会被替换(修改)

遍历集合

for(Pet p : hm){
      System.out.println(p.getName());
  }

HashMap<String,Pet> hm = new HashMap<String,Pet>();
Set set = hm.keySet();
Iterator i = set.iterator();
while(i.hasNext()){
  System.out.println(i.next().getName());
}

多线程

进程:程序的一次动态执行过程
线程:进程中执行运算的最小单位,可完成一个独立的顺序控制流程
多线程优点:充分利用CPU的资源,简化变成的模型,带来靓号的用户体验

线程状态: 创建、就绪、运行、阻塞、死亡

创建线程有两种方式:1.继承Thread类 2.实现Runnable接口

Thread() 分配新Thread对象
Thread(Runnable run) 分配新的Thread对象,run为run()方法被调用的对象
Thread(Runnable run,String name)分配新的Thread对象,run为run()方法被调用的对象,name为新线程的名称

void run() 执行任务操作的方法
void start() 使该线程开始执行,Java虚拟机调用该线程的run()方法
void sleep(long m) 在让当前正在执行的线程休眠指定的毫秒(暂停执行)

String getName() 返回线程的名称
int getPriority() 返回线程的优先级
void setPrority(int new) 更改线程的优先级
static Thread currentThread() 返回当前正在执行的线程对象
boolean is Alive() 测试线程是否处于活跃状态

void join() 加入新线程,直到该线程结束,在执行原来的
void yield() 礼让,不一定真的让别的线程执行
void interrupt() 中断线程

抢票问题

1.synchronized 代码块
2.synchronized 方法
解决成员变量问题
循环要包括(synchronized)代码块,每次只能有一个线程进入该方法

抢票实例代码

//创建一个Runnable实现类,多个线程
//使用的是Runnable对象中的数据,所以之创建一个,创建多个就不是同一个对象中的字段了

MyRunnable run = new MyRunnable();

Thread t1 = new Thread(run,"逃跑跑");
Thread t2 = new Thread(run,"黄牛");
Thread t3 = new Thread(run,"抢票代理");

t1.start();
t2.start();
t3.start();

File

    字节输入流InputStream基类
字节流
    字节输出流OutputStream基类

按数据单元分

    字符输入流Reader基类
字符流
    字符输出流Writer基类

输出和输入是相对于控制台程序而言
流是指一连串流动的字符,以先进先出的方式发送和接受
使用步骤:1.导包 2.创建相关对象 3.执行相关操作 4.关闭流对象
String s = new String(byte[]b);

File类常用方法

  1. long length() 文件的大小
  2. String getName() 文件或目录名称
  3. String getPath() 相对路径
  4. String getAbsolutePath() 绝对路径
  5. boolean exists() 判断文件或目录是否存在
  6. boolean isFile() 判断是否是文件
  7. boolean isDirectory() 判断是否是目录
  8. boolean createNewFile() 创建名称的空文件,不创建文件夹
  9. boolean delete() 删除对象指定的文件或者空目录

基类InputStream类

基类方法
  int read()
  int read(byte[] b)
  int read(byte[] b,int off,int len) 从输入流中读取长度为len的字节,从off的下标开始保存到数组中
  int close()
  int available() 返回输入流读取的估计字节数

子类FileInputStream类
  FileInputStream(File file)
  FileInputStream(String path)

基类OutputStream类

基类方法
    void write(int c)
    void write(byte[] b)
    void write(byte[] b,int off,int len) 将数组中从off下标开始输出长度为len的字节
    void close()

子类FileInputStream类
    FileOutStream(File file)
    FileOutStream(String path)
    FileOutStream(String path,boolean append) 是追加文件,还是覆盖文件(前两种构造函数,只能覆盖)

基类Reader类

基类方法
    int read()
    int read(char[] b)
    int read(char[] b,int off,int len) 从输入流中读取len的长度,从off下标开始保存到字符数组中,返回实际读取长度
    void close()

子类BufferedReader类
    BufferedReader(Reader r)
    String readLine() 读取一行数据,返回字符串

基类Writer类

基类方法
    write(String str) 将str字符串里包含的字符输出到指定的输出流中
    write(String str,int off,int len) 将字符串中从off下标开始输出长度为len的字符
    void close()
    void flush() 刷新流,避免缓冲区残留数据

子类BufferedWriter类
    BufferedWriter(Writer w)
    void newLine() 插入换行符

示例代码

InputStream fis = null;
		OutputStream fos = null;

		fis = new FileInputStream("D:/我的青春我做主.txt");
		fos = new FileOutputStream("C:/myFile/jbit.txt");

		byte[] words = new byte[fis.available()];

		if(fis.read(words,0,words.length)!=-1){//向控制台数组中输入
			fos.write(words);//从控制台输出
			System.out.println("复制成功!");
		}else{
			System.out.println("复制失败!");
		} 
		Reader fr = null;
		BufferedReader brr =null;

		Writer fw = null;
		BufferedWriter bwr = null;


		fr = new FileReader("D://test.txt");
		brr = new BufferedReader(fr);
		StringBuffer sb = new StringBuffer();//创建StringBuffer对象追加数据
		Object o = brr.readLine();
		while(o!=null){//判断读取的当前行是否为空
			sb.append(o);
			o = brr.readLine();
		}
		System.out.println("替换前:"+sb.toString());

		String newString = sb.toString();
		newString = newString.replace("{name}", "鸥欧");
		newString = newString.replace("{type}", "狗狗");
		newString = newString.replace("{master}","李伟");
		System.out.println("替换后:"+newString);		fw = new FileWriter("D:/myDoc/pet.txt");
		bwr = new BufferedWriter(fw);
		bwr.write(newString);