Java总结



一、java基础

1、类与对象

     类:是指生活中一类事物的集合

     类的分类:a、普通类  public class 类名(){}

                       普通类:可以存在变量和常量

                                      可以创建对象

                                      可以有普通方法和构造方法,一定不能有抽象方法

                       b、抽象类 public abstruct class 类名(){}

                        抽象类:可以存在变量和常量

                                      不可以创建对象

                                      三种方法都可以有

                       c、接口类:public interface 类名(){}

                       接口类:只能存在常量

                                      不可以创建对象

                                      只能存在抽象方法

仅仅限于一个类中的分类:内部类、方法内部类、匿名内部类(隐藏子类)

    对象:是指生活中所有的实体

2、属性与方法

      属性的定义格式:public 类名 属性名

      方法(函数)的分类

      普通方法:public 返回值 方法名(参数列表){方法体}

      构造方法:public 类名(参数列表){方法体}

      抽象方法:public abstract 返回类型 方法名(参数列表){方法体}

      a、方法重写:子类继承父类,重写父类方法,方法名、参数列表、返回类型必须相同,覆盖父类的方法

      b:方法重载:同一个类中,多个方法的方法名相同,参数列表和返回类型不同,则互为方法重载

3、java编程:

     面向对象编程的三大特征:封装、继承和多态

     面向对象:关注事情的结果

     面向过程:关注事情的执行流程

     oop面向对象编程

package Test;

public class Teacher {
	public String name1="张三";
	public String name2="李四";
	public static void main(String[] args) {
		Teacher th = new Teacher();
		th.teach();
	}
	public void teach(){
		System.out.println(name1+"正在给"+name2+"同学上课");
	}
}

打印的是:张三正在给李四同学上课

   引用传递:

package Test;

public class Test {
	public int a=1;
	public int b=2;
	public static void main(String[] args) {
		Test t = new Test();
		t.test();
	}
	public void test(){
		int c = a;
		a = b;
		b = c;
		System.out.println(a+"\r\n"+b);
	}
}


打印1

       2

继承的关键字:extends、implements(接口继承)

多态体现在继承上:多个同一个类型调用同一个方法,执行流程不一样

package Test;

public class People {
	public static void main(String[] args) {
		MiddleStudents ms = new MiddleStudents();
		Students s = new Students();
		ms.test();
		s.test();
	}
	public void test(){
		System.out.println("吃饭");
	}
}
package Test;

public class MiddleStudents extends People{
	public void test(){
		System.out.println("睡觉");
	}
}

package Test;

public class Students extends People{
	public void test(){
		System.out.println("做饭");
	}
}

打印输出的是:睡觉做饭

二、java线程同步

1、程序、进程、线程

     程序:一组指令的集合

     进程:正在运行的程序

     线程:是程序的特殊段,可以在程序里独立执行

2、区别与联系


     进程与程序:程序是静态的,进程是动态的,一个程序对应多个进程,一个进程对应一个程序

     进程与线程:进程有自己的独立的空间,线程只能共享进程中的空间,进程中至少有一个线程

3、java多线程

     java多线程可以提高CPU利用率

     java多线程可以同时执行多个任务,提高效率

    java支持多线程

4、线程的几种状态:线程创建——就绪(start)——运行(run方法执行)——睡眠(sleep)——等待/通知(wait/notify)——阻塞(synchronized)——死亡(run方法执行完毕)

package Test;

public class Test {
	public static void main(String[] args){
		Students s1 = new Students("iPhone");
		Students s2 = new Students("Meizu");
		new Thread(s1).start();
		new Thread(s2).start();
	}
}
package Test;

public class Students implements Runnable{
	private String name;
	private int count = 5;
	public Students(String name){
		this.name = name;
	}
	public void run() {
		for (int i = 0; i < 5; i++) {
			System.out.println(name+count--);
		}
	}
}

java多线程,如上,两个线程抢占CPU资源,先抢占的先执行,打印输出的是(每次打印输出的顺序都会不同):

iPhone5
iPhone4
iPhone3
iPhone2
iPhone1
Meizu5
Meizu4
Meizu3
Meizu2
Meizu1


4、线程同步
1)线程通信分类;

“监视线程”通讯模型:一个线程控制多个线程运行程序

生产/消费模型:notify/wait来操作,例如生活中的需求分析,当供不应求时,就会通知生产商生产--notify,当供过于求时,则会暂时停止--wait

2)多个线程同时运行时,可能操作的是同一个对象,则需要通过synchronize关键字来锁定,只允许一个线程通过

synchronize只能有一个线程执行,任何一个对象有一个标识位,有0,1两种状态,synchronize在执行代码块是会检验对象的标识位,如果是1,则执行程序,同时也将

该对象的标识位设为0,处于阻塞状态,一直等到标识位为1时,再执行下面程序;

package Test;

public class Dumpling {
	public String name;
	public Dumpling(String name){
		this.name = name;
	}
}

package Test;

import java.util.ArrayList;

public class Mother implements Runnable{
	private ArrayList<Dumpling> list = new ArrayList<Dumpling>();
	public Mother(ArrayList<Dumpling> list) {
		this.list = list;
	}
	public void run() {
//		记录生产量
		int count = 0;
		while(true){
			synchronized (list) {
				if(list.size()>0){
					try {
						list.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				Dumpling dumpling = new Dumpling("做的饺子个数是:"+count);
				count++;
				list.add(dumpling);
				list.notify();
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

package Test;

import java.util.ArrayList;

public class Son implements Runnable{
	private ArrayList<Dumpling> list = new ArrayList<Dumpling>();
	public Son(ArrayList<Dumpling> list) {
		this.list = list;
	}
	public void run() {
		while(true){
			synchronized (list) {
				if(list.size()==0){
					try {
						list.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				Dumpling dumpling = list.remove(0);
				System.out.println("吃的个数是"+dumpling.name);
				list.notify();
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

package Test;

import java.util.ArrayList;

public class Test {
	public static void main(String[] args){
		ArrayList<Dumpling> list = new ArrayList<Dumpling>();
		new Thread(new Mother(list)).start();
		new Thread(new Son(list)).start();
	}
}


如上述,用生活中的饺子做测试,生产者、消费者交替执行,打印输出的是:

吃的个数是做的饺子个数是:0
吃的个数是做的饺子个数是:1
吃的个数是做的饺子个数是:2
吃的个数是做的饺子个数是:3
吃的个数是做的饺子个数是:4
吃的个数是做的饺子个数是:5、、、、、、、、、

package UseSynchronize;

public class Acount {
	private int count;
	public Acount(int count){
		this.count = count;
	}
	public int getCash(int cash){
		synchronized (this) {
			if(count<cash){
				return 0;
			}
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			count = count-cash;
		}
		return count;
	}
}




package UseSynchronize;

public class OperationThread implements Runnable{
	private Acount acount;
	private int cash;
	private String operation;
	public OperationThread(Acount acount,int cash,String operation){
		this.acount = acount;
		this.cash = cash;
		this.operation = operation;
	}
	public void run() {
		int count = acount.getCash(cash);
		if(count==0){
			System.out.println("本人在"+operation+"取现失败,余额为:"+count);
		}else{
			System.out.println("本人在"+operation+"取现成功,余额为:"+count);
		}
	}
}




package UseSynchronize;

public class TestInfunction {
	public static void main(String[] args) {
		Acount count = new Acount(5000);
		new Thread(new OperationThread(count,3000,"ATM")).start();
		new Thread(new OperationThread(count,3000,"柜台")).start();
	}
}



打印输出的是:本人在ATM取现成功,余额为:2000
本人在柜台取现失败,余额为:0,如果没synchronized关键字,则打印输出余额为负数,这不符合实际;

5、ArrayList、LinkedList的作用:

ArrayList:方便查询元素

LinkedList:方便添加和删除元素

HashMap:有key和value两个值,是一组有序的集合,可以重复

HashSet:无序的(第一次排序,下次就不会变了),不可以重复

HashTable:和HashMap一样都有键值存储,是线程同步

三、java关键字

1、 关键字定义:是电脑语言里事先定义的,被赋予了指定含义的单词,有特别意义的标识符,有时又叫保留字

1)跟类相关:public、protected、default、private、class、implements、extends、final、abstract、import、package

2)跟方法相关:void、return、static

3)循环判断:for、switch、case、do、while、break、continue、if、else

4)异常、try、catch、finally、throw、throws

5)其他:this、super

2、关键字命名

switch(表达式){in/short/String(JDK1.7以前不能用)枚举类型case(表达式):、、、、、、break;}

1)访问修饰符

public:公有的,整个java工程都可以访问

protected:同一个包下的类可以访问,不同包不能访问,但可以通过继承,访问到受保护的属性或者方法

default:同一个包下的类可以随意访问,跨包不行

private:仅限于当前类可以访问,其他类拥有该类的对象,也无法访问其属性和方法

2)this/super

this:当前类的对象

super:父类的对象

普通方法和属性的调用:this.方法名,this.属性名,super.方法名,super.属性名

this();——调构造方法示例:
<pre class="java" name="code">package Test;

public class TestOne {
	private String name;
	public TestOne(String name){
		this.name = name;
	}
	public TestOne(){
		this("高普");
	}
}

 

注意:1、this()和super()必须出现在第一行

           2、方法重写,如果要对父类方法进行补充,则需要调用super.父类方法名()方法名定义

3、final(最终的)

可以用来修饰:类、方法、属性、参数、局部变量

修饰类:当前类不能被继承

修饰方法:当前方法不能被重写

修饰属性:当前属性只能被赋值一次,而且必须是常量

4、static(静态的)

可以用来修饰:属性、方法、静态块

注意:静态方法中一定不能直接使用非静态的属性和方法

package Test;

public class Son {
	protected static String name;
//	当前类运行时执行
	static{
		System.out.println("吃饭");
	}
//	创建对象时执行
	{
		System.out.println("睡觉");
	}
}




package Test;

public class Father {
	public static void main(String[] args) {
		Son son = new Son();
		Son son1 = new Son();
		son.name = "张三";
		son1.name = "李四";
		Son.name = "王五";
		System.out.println(son.name);
		System.out.println(son1.name);
		System.out.println(Son.name);
	}
}


打印输出的是:吃饭
睡觉
睡觉
王五
王五
王五

因为静态属性只能由类名定义,所以是三个王五,前面的代码块是创建对象是执行,创建了两次,所以出现两次"睡觉"

四、java异常分类

java中所有异常的父类是Exception,分为受检异常和非受检异常,所有的非受检异常都是RuntimeException的子类,也是Exception的子类,RuntimeException作为非受检异常

,它的子类有:NullPointException、ArithmeticException、EvenException、、、、、例如以下:

1、非受检异常(运行异常)

package ExceptionClass;

public class TestException {
	public static void main(String []args){
		TestException te = new TestException();
		te.test(2, 0);
	}
	private int test(int a,int b){
		int value = a/b;
		return value;
	}
}


出现的异常则是:ArithmeticException出现的异常

package ExceptionClass;

import javax.swing.JFrame;

public class TestJFrame{
	private static JFrame jf;
	public static void main(String[] args) {
		jf.setVisible(true);
	}
}

这个则是:NullpointException出现的异常,由于没有给相应的地址

2、受检异常(非运行异常)

但凡继承了Exception,没有继承RuntimeException,都是受检异常

java异常处理机制

1)捕获异常

在Java中,非运行异常一般通过try——catch语句进行捕捉,一半语句形式为:
try{
//可能发生异常的代码程序
}catch{
//执行异常操作
}
catch{
//执行异常操作
}.......
finally{
处理完try与catch操作完后收尾操作,异常统一出口
}

注意:try语句不可以省略,finally语句可以省略,可以有多重catch

Java中简单的测试:

package ExceptionClass;

public class TestExcept {
	public static void main(String[] args) {
		TestExcept te = new TestExcept();
		te.excpt(2, 0);
	}
	private int excpt(int a,int b){
		int value = 0;
		try{
			value = a/b;
		}catch(ArithmeticException e){
			e.printStackTrace();
		}finally{
			System.out.println("程序正常结束");
		}
		return value;
	}
}


控制台打印的是:程序正常结束
java.lang.ArithmeticException: / by zero
 at ExceptionClass.TestExcept.excpt(TestExcept.java:11)
 at ExceptionClass.TestExcept.main(TestExcept.java:6),

由此可见,尽管程序出现异常,finally最终还得执行

2 ) 抛出异常

package ExceptionClass;

public class TestThrows {
	public static void main(String[] args) throws ArithmeticException{
		int i = 2;
		int j = 0;
		try{
			System.out.println(i/j+"的只是:"+i/j);
		}catch(ArithmeticException e){
			throw new ArithmeticException();
		}finally{
			System.out.println("执行了finally语句");
		}
	}
}


打印输出的是:Exception in thread "main"

java.lang.ArithmeticException
 at ExceptionClass.TestThrows.main(TestThrows.java:10)
执行了finally语句,上述则是介绍了异常抛出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值