Java基础知识学习01
0 项目,包,文件,类
Mytest是自己建的java工程,包含src和JRE System Libery。其中src是存放自己的代码的地方,JRE包含程序运行时所需要的各种文件;在src下包含Test包,一个包就是许多.java文件的合集,src下可以有很多的包,在写程序时Import 包名表明用这个包;一个包下可以有很多的.java文件,在该文件下写代码,一个文件下只能有一个public类。
1 定义学生类并调用及static的事项
package Test;//在Test包下 public class Main{ //快速生成main方法,写main然后alt+/便可快速生成 public static void main(String[] args) { //直接通过类调用,静态所修饰的成员优先于对象随着类的加载而加载 Student.graduatefrom="abcd"; //在创建时直接初始化 Student s=,"M"); //也可以调用get和set方法 Student s2=new Student(); s2.setAge(); s2.setGednder("W"); s2.setName("小李"); //显示出来 s.show(); s2.show(); //这样显示的是s和s2的地址 System.out.println(s); System.out.println(s2); } } //在一个文件下只能有一个public类 class Student{ //类中使用私有的成员变量做到封装思想 private String name; private int age; private String gednder; //当这两个人都毕业于同一院校时,每次构建对象便要重新赋值比较麻烦,可以考虑赋值一次便能让这个类的所有对象都共享。 static String graduatefrom; //无参构造,只要人为定义一个构造方法后java便不会再自动生成默认构造方法 public Student(){} //有参构造可以用来初始化成员变量,右键--source可以自动生成构造方法,get set方法 public Student(String name, int age, String gednder) { super(); //方法内部的变量名和类中成员变量名字相同,用this,this其实是Student对象的地址 this.name = name; this.age = age; this.gednder = gednder; } //生成get和set方法因为成员变量使用private修饰无法在其他类中访问,,同过get set方法便可以读写这就是封装的思想 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getGednder() { return gednder; } public void setGednder(String gednder) { this.gednder = gednder; } public void show(){ //输出syso快捷键alt+/ System.out.println(name+" "+age+" "+" "+gednder+" "+graduatefrom); } } /*关于静态方法的几点注意 * 1:静态方法只能调用静态方法 * 2:非静态方法可以都调用 * 3:静态方法随着类加载而加载优先于对象加载因此没有this指针 * */
2 模拟发牌
了解ArrayList,Collections的使用
package Test; import java.util.ArrayList; import java.util.Collections; /* *模拟发牌 * 建牌 * 洗牌 * 发牌 */ public class Main { public static void main(String[] args) { //牌由花色和数字组成 String[] color = {"梅花","黑桃","方片","红桃"}; //数字 String[] num = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"}; //装牌 ArrayList<String> box = new ArrayList<String>(); for (int i = 0; i < color.length; i++) { for (int j = 0; j < num.length; j++) { box.add(color[i] + num[j]); } } box.add("大王"); box.add("小王"); //shuffle随机置换元素顺序 Collections.shuffle(box); //发牌实质就是创建三个数组然后存入,可以用汉语作为对象名 ArrayList<String> 李大狗= new ArrayList<String>(); ArrayList<String> 李二狗 = new ArrayList<String>(); ArrayList<String> 李三狗 = new ArrayList<String>(); for (int i = 0; i < box.size() - 3; i++) { if(i % 3 == 0) { 李大狗.add(box.get(i)); } else if(i % 3 == 1) { 李二狗.add(box.get(i)); } else if(i % 3 == 2) { 李三狗.add(box.get(i)); } } System.out.println("李大狗:" + 李大狗); System.out.println("李二狗:" + 李二狗); System.out.println("李三狗:" + 李三狗); System.out.println("底牌"); for(int x = box.size() - 3;x < box.size();x++) { System.out.println(box.get(x)); } } }
3 多线程火车票
Main.class
package Test; /*模拟火车票售票 * 使用多线程模拟多个窗口售票 * 当售票完后火车站同样欢迎,因此无需关闭 */ public class Main{ public static void main(String[] args) { //创建Runnable实现对象 TicketThread tt =new TicketThread(); //创建线程对象,有多个线程,因为ticket是一定,所以创建线程时都要使用tt Thread t=new Thread(tt); t.setName("窗口1"); Thread t2=new Thread(tt); t2.setName("窗口2"); Thread t3=new Thread(tt); t3.setName("窗口3"); t.start(); t2.start(); t3.start(); } }
TicketThread.class----会出现多线程问题
package Test; //实现Runnable接口启动线程 public class TicketThread implements Runnable{ int tickets=100; @Override public void run() { // TODO Auto-generated method stub while(true){ if(tickets>0){ /*当有进程睡眠时会出现错误 * 当t来的时候有票进入if在里面睡眠,此时t2进来,t1还在睡眠因此仍有票,t2进入,同理t3也可进入 * 当t t2 t3出来后,票就开始自减就会出现问题。 */ try { //如果线程处于wait,sleep,join三个方法时候,则会抛出InterruptedException Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } //Thread是类名,类名+方法名直接调用方法,该方法必须是静态(static)方法 System.out.println(Thread.currentThread().getName()+":"+tickets--); } } } }
解决问题代码:
package Test; //实现Runnable接口启动线程 public class TicketThread implements Runnable{ int tickets=100; Object obj=new Object(); @Override public void run() { // TODO Auto-generated method stub while(true){ if(tickets>0){ //同步代码块 obj为要锁的对象 synchronized (obj) { try { //如果线程处于wait,sleep,join三个方法时候,则会抛出InterruptedException Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } //Thread是类名,类名+方法名直接调用方法,该方法必须是静态(static)方法 System.out.println(Thread.currentThread().getName()+":"+tickets--); } } } } }
对上面是代码的改善
package Test; //实现Runnable接口启动线程 public class TicketThread implements Runnable{ int tickets=100; Object obj=new Object(); @Override public void run() { // TODO Auto-generated method stub while(true){ method(); } } //用synchronized修饰后该方法就会安全的方法,该方法是非静态方法因此默认同步锁对象为this //若为静态方法时同步锁对象为当前类的字节码对象 private synchronized void method(){ if(tickets>0){ //同步代码块 obj为要锁的对象,但会造成运行效率低 try { //如果线程处于wait,sleep,join三个方法时候,则会抛出InterruptedException Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } //Thread是类名,类名+方法名直接调用方法,该方法必须是静态(static)方法 System.out.println(Thread.currentThread().getName()+":"+tickets--); } } }
Java基础知识学习01的更多相关文章
- Java基础知识学习(九)
GUI开发 先前用Java编写GUI程序,是使用抽象窗口工具包AWT(Abstract Window Toolkit).现在多用Swing.Swing可以看作是AWT的改良版,而不是代替AWT,是对A ...
- java基础知识学习笔记
本文知识点以js为参照.对比分析得出笔记.JavaScript之所以叫JavaScript是打算借助java推广自己.虽然都是开发语言,但JavaScript一开始主要运行在 客户端,而java主要运 ...
- Java基础知识学习(三)
面向对象部分 首先要了解面向对象的思想,与C#一致,都是面向对象的语言 访问修饰符 public 共有的,对所有类可见. protected 受保护的,对同一包内的类和所有子类可见. private ...
- Java基础知识学习(一)
部门接了新项目,后台使用Java框架play framework,前端是html,前后台通过rest交互,能够支持多端的互联网架构. 因为之前没有Java基础,前端使用的也很少,决定深入学习一下Jav ...
- java 基础语法学习01
Java基础语法 注释 初次使用idea时相关配置 new project ->Empty project->进入页面 再选择file->project structure-> ...
- Java基础知识学习(二)
Java语法基础 数据类型.类型转换.运算符.逻辑运算符.参考C#,基本一致 输入输出 输出 System.out.print("abc"); System.out.printf( ...
- java基础知识学习 内存相关
Java 内存分配策略 静态存储区(方法区):主要存放静态数据.全局 static 数据和常量.这块内存在程序编译时就已经分配好,并且在程序整个运行期间都存在. 栈区 :当方法被执行时,方法体内的局部 ...
- Java基础知识学习(八)
IO操作 5个重要的类分别是:InputStream.OutStream.Reader.Writer和File类 面向字符的输入输出流 输入流都是Reader的子类, CharArrayReader ...
- Java基础知识学习(七)
线程(续) 线程同步 当两个或两个以上的线程需要共享资源,它们需要某种方法来确定资源在某一刻仅被一个线程占用.达到此目的的过程叫做同步(synchronization) 可以用两种方法同步化代码.两者 ...
随机推荐
- 使用dockerfile 搭建django系统(nginx+redis+mongodb+celery)
背景 有需求需要对django系统进行docker化,以达到灵活部署和容灾.该系统基于django 2.2版本开发,数据库采用mongodb,服务器使用nginx,因系统有部分异步任务,异步任务则采用 ...
- Python Excel文件的读写操作(xlwt xlrd xlsxwriter)
转:https://www.cnblogs.com/ultimateWorld/p/8309197.html Python语法简洁清晰,作为工作中常用的开发语言还是很强大的(废话). python关于 ...
- MyBatis配置文件中的标签mappers的子标签mapper的url属性
在浏览器中输入file:/可以打开访达根目录,file:后面至少跟一个杠 MyBatis配置文件中的标签mappers的子标签mapper的url属性中file:后面至少要跟两个杠
- Centos安装elasticsearch,php连接使用
一.下载安装JAVA 下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html ...
- java web开发环境设置
Mapped Statements collection does not contain value for后面是什么类什么方法之类的问题: 除了"https://changbl.itey ...
- Zookeeper快速开始
具体部署流程: #下载 wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/current/apache-zookeeper-3.5. ...
- LeetCode 答案(python)1-17
1.给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums = [2, 7, 11, 15], targe ...
- DataTime.Now.Ticks
getTime public long getTime() 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数. 返回: 自 1970 年 1 月 1 ...
- beego从入门到弃坑(一)
最近由于要写课程设计的原因,我便开始一边学习beego,一边开始用它写一个小型的管理系统.但是只有你真正的去用的时候,才会发现这个框架巨坑,他是第一个让我写出了心里阴影的框架,也是第一个让我写着写 ...
- 手写走通HTTP server 第三版本
后台 后端 服务端 功能:逻辑处理 算法处理 磁盘交互(数据库 静态文件处理) 要求:健壮性,安全性 并发性能和处理速度 架构合理便于维护扩展 网站后端 httpserver + WebFr ...