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) 可以用两种方法同步化代码.两者 ...
随机推荐
- 【Jmeter源码解读】001——目录结构
1.顶层目录 bin - 包含.bat 和 . sh 这些文件用于启动JMeter.同时也包含了ApacheJmeter.jar 和 相关的配置文件 build - build 脚本创建的目录,存放一 ...
- 【LOJ】#3051. 「十二省联考 2019」皮配
LOJ#3051. 「十二省联考 2019」皮配 当时我在考场上觉得这题很不可做... 当然,出了考场后再做,我还是没发现学校和城市是可以分开的,导致我还是不会 事实上,若一个城市投靠了某个阵营,学校 ...
- Photon Server初识(四) --- 部署自己的服务Photon Server
准备工作: 1.一台 window 虚拟机(本机是window也行) 2.下载SDK : https://www.photonengine.com/zh-CN/sdks#server 一:SDK介绍 ...
- composer在windows下安装并且设置全局变量
Composer是 PHP 用来管理依赖(dependency)关系的工具.你可以在自己的项目中声明所依赖的外部工具库(libraries),Composer 会帮你安装这些依赖的库文件. 1丶使用安 ...
- nginx核心模块常用指令
默认启动Nginx时,使用的配置文件是: 安装路径/conf/nginx.conf 文件,可以在启动nginx的时候,通过-c来指定要读取的配置文件 常见的配置文件有如下几个: nginx.conf: ...
- instanceof关键字 与 getClass()
在equals()中使用getClass进行类型判断 我们在覆写equals()方法时,一般都是推荐使用getClass来进行类型判断,不是使用instanceof.我们都清楚instanceof的作 ...
- 在开源UOJ的导航栏中添加新页面链接
前言 刚用开源UOJ搭建OJ成功时就想在导航栏那里添加一个站内页面链接,无奈当时乱搞水平低,网上也没有教程,不晓得怎么弄 今天突然来了闲情乱搞一通,结果还真乱搞成了...特意写下为后来人少走点弯路 前 ...
- luogu4677山区建小学题解--区间DP
题目链接 https://www.luogu.org/problemnew/show/P4677 分析 这道题方法跟之前题不一样,我们相当于枚举一个左右端点来线性扩展,同时划分断点进行决策 \(f[i ...
- luogu1018乘积最大--区间DP
题目链接 https://www.luogu.org/problemnew/show/P1018 分析 这道题套路跟山区建小学差不多,可以先去看看那篇题解 \(f[i][j]\)表示枚举到第\(i\) ...
- JS-上下文练习
/** * 因为JS没有块级作用域,if里面的foo又是以var形式声明的,所以会被提升上去, * 被赋值为undefined,之后undefined代表false,所以会进入if语句块, * foo ...