(一)Java中,变量,常量,定义原则
1.1定义原则:
- 所有变量,方法,类名:见名知意
- 类成员变量:首字母小写和驼峰原则:monthSalary
- 局部变量:首字母小写与驼峰原则
- 常量:全大写和下滑线分割:MAX_VALUE
- 类名:首字母大写与驼峰原则:Man,GoodMan
- 方法名:首字母小写和驼峰原则:run(),runRun()
1.2变量的定义:
- 变量的本质(固定空间):停车位,空间已经确定,但具体放置哪量车不确定。
- 变量名(通过名字操作空间):停车位编号
- 数据(变化的量):车
1.3常量定义:
public class Demo02 {
//常量定义一般用大写字母表示,且修饰符先后顺序无影响,static final或者final static都一样
static final double PI=3.14;
public static void main(String[] args) {
System.out.println(PI);
}
}
public class Demo01 {
//类变量 加static
static double salary=2500;//在main中可以直接输出
//实例变量,从属于对象,必须由对象引用;
String name;
int age;
//main方法
public static void main(String[] args) {
//局部变量,必须声明和初始化
int i=10;
System.out.println(i);
//变量类型 变量名=new Demo01();
Demo01 demo01=new Demo01();
System.out.println(demo01.age);//如果age没进行初始化,会输出默认值0或者0,0.0
System.out.println(demo01.name);//字符串默认16位0000,bool值默认false;除了八个基本类型,其余都是null;
System.out.println(salary);
}
//其他方法,
}
1.4变量及其作用域
- 局部变量:从属于方法,作用范围:方法内部
- 成员变量:从属于对象,位于类内部,方法外部,对象创建,成员变量创建,(对象可以直接调用类的成员变量),对象消失,成员变量也跟着消失。
- 静态变量:从属于类,static修饰,类加载时有效,类被卸载时,静态变量消失。
package Demo09;
public class Test01
{
//成员变量
int a=10;
int b=20;
//静态变量
static int b=4;
public void run(){
int x=9; //局部变量
System.out.println(x);
}
}
public class Demo1{
//实例对象,作用范围在整个类中,可以不给初始值,会有默认值
String name;
int age=1;
public static void main(String[] args) {
/*局部变量,必须声明且初始化,作用范围只在函数中
在add()方法中不能调用*/
int a=1;
System.out.println(a);
/*main中调用实例对象*/
Demo1 demo=new Demo1();
System.out.println(demo.age);
System.out.println(demo.name);
}
/*其他方法*/
public void add(){
}
}
1.5数据类型
//整数
byte num1=2;
short num2=4;
int num3=3;
long num4=3l;//long类型后面要加l区分
//小数
float num5=1.4F;//float类型要加F区分
double num6=3.1415926;
//字符,字符串
char name='A';//单引号
String name2="中国";//双引号,String首字母大写
//布尔型
boolean flag=true;
boolean flag2=false;
(二)类及其对象的创建
2.1类的定义及命名规则
- 表示类名的标识符:每个单词首字母大写。
- 表示方法和变量的标识符:”驼峰原则“。
- 注:由于java不采用ASCLL字符集,而是Unicode字符集,因此这里字母含义不仅仅是英文,还包括汉字。(不建议用汉字)
定义学生类,Student类包含属性与方法
//学生类
public class Student {
//属性
String name;
int age;
//方法
public void study(){
System.out.println("学生");
}
}
2.2实例化
- Student类需要实例化才能使用,main函数中用new实例化,返回具体实例student
public class application {
public static void main(String[] args) {
//类是抽象的,需要实例化
//类实例化后返回自己的对象
Student student=new Student();
}
}
- 实例化出来的student可以具体给他的name和age赋值
public class application {
public static void main(String[] args) {
//类是抽象的,需要实例化
//类实例化后返回自己的对象
Student student=new Student();
//具体赋值
student.name="小红";
student.age=20;
System.out.println(student.age);
}
}
2.3类的构造
- 构造器和类名相同
- 构造器的调用规则,及super,this关键字详解
package Test_Demo;
//学生类
public class Student {
String name;
int age;
//一个类即使什么都不写,也会存在一个方法
//无参构造(显示构造器)
public Student() {
}
}//快捷键alt+insert选择constructor进行有参或无参构造
2.4封装
2.5接口
- 接口1的定义
- 由于接口不是类,所以其中定义的方法无法直接实现(且接口中无构造方法)
- 接口用来定义不同的方法,让不同的人实现(分工)
- 接口中的方法默认是public abstract类型
- implement可以实现多个接口
package Demo6;
public interface UserService {
//接口中的所有定义都是抽象的 public abstract
void run(String anme);//定义方法可以不用写public abstract,默认就是
void Delete(String name);
}
//定义完接口后可通过类来实现
- 接口2的定义
package Demo6;
public interface TimeService {
void time();
}
- 两个接口的继承(java是单继承,但接口中可以实现多继承),重写里面的方法即可
package Demo6;
//快捷键alt+insert选中implment
//实现接口的类必须重写接口中的方法
//接口可以多继承
public class UserServiceImp implements UserService,TimeService{
@Override
public void run(String anme) {
}
@Override
public void Delete(String name) {
}
@Override
public void time() {
}
}
2.6Java中内部类
- 内部类定义
package Demo14;
public class Outer {
private int id=10;
public void out(){
System.out.println("这是外部类方法");
}
//内部类
public class Inner{
public void in(){
System.out.println("这是内部类方法");
}
//内部类方法可以调用外部类中私有属性
public void getID(){
System.out.println(id);
}
}
}
- 测试类Application
package Demo14;
public class Application {
public static void main(String[] args) {
Outer outer = new Outer();
//通过外部类对象实例化内部类
Outer.Inner inner = outer.new Inner();
}
}
- 一个java文件中只能有一个public类,但是可以有多个class类,所以一些测试类可以写在class A{}中,不用再 建立一个新的java文件。
package Demo14;
public class Outer {
private int id=10;
public void out(){
System.out.println("这是外部类方法");
}
}
class A{
}
class B{
}
- 方法中也可以写类:局部内部类,类似于方法中定义的变量叫做局部变量
package Demo14;
public class Outer {
//局部内部类
public void out(){
class A{
}
}
}
- 匿名内部类:不将类的实例保存的变量中,正常实例化及调用类中属性
- A a=new A();a.name;
package Demo14;
public class Application {
public static void main(String[] args) {
new Apple().eat();
}
}
class Apple{
public void eat(){
System.out.println("1");
}
}
2.7 java中异常机制
(三)多线程
3.1继承thread类实现多线程
3.2实现Runnable接口实现多线程抢票
3.2多线程模仿龟兔赛跑
package Demo17;
public class Race implements Runnable{
private static String winner;//只有一个胜利者
@Override
public void run() {
for (int i = 0; i <= 100; i++) {
//模拟兔子休息
if (Thread.currentThread().getName().equals("兔子")&& i%10==0){
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//判断比赛是否结束
boolean flag=gameOver(i);
if (flag){
break;
}
System.out.println(Thread.currentThread().getName()+"-->跑了"+i+"步");
}
}
//判断比赛有没有结束
private boolean gameOver(int steps){
//判断是否有胜利者
if (winner!=null){
return true;
}else {
if(steps>=100){
winner=Thread.currentThread().getName();//获取线程的名字
System.out.println("胜利者是"+winner);
return true;
}
}
return false;
}
public static void main(String[] args) {
Race race = new Race();
new Thread(race,"兔子").start();
new Thread(race,"乌龟").start();
}
}
3.4静态代理
- 真实对象(target目标对象)和代理对象都要实现同一个接口
- 代理对象要代理真实角色,在代理中传入代理对象
- 代理对象可以做很多真实对象做不了的事情(处理琐事),真实对象专注于做自己的事情(结婚)
package Demo17;
//静态代理,实现模拟结婚
public class staticProxy {
public static void main(String[] args) {
WeddingCompany weddingCompany = new WeddingCompany(new You());
weddingCompany.HappyMarry();
}
}
interface Marry{
void HappyMarry();
}
//结婚的真实对象
class You implements Marry{
@Override
public void HappyMarry() {
System.out.println("xx要结婚!");
}
}
//婚庆公司(代理),帮你结婚
class WeddingCompany implements Marry{
private Marry target;//代理目标
//构造方法
public WeddingCompany(Marry target) {
this.target = target;
}
@Override
public void HappyMarry() {
befor();
this.target.HappyMarry();//真是对象
after();
}
private void after() {
System.out.println("结婚后收尾款");
}
private void befor() {
System.out.println("结婚前布置现场");
}
}
3.5线程的五大状态之停止线程
- 并不推荐使用JDK提供的stop(),的destory()方法停止线程。
- 推荐线程自己停下来。
- 建议使用一个标志位进行终止变量,flag=false,则终止线程运行。
package Demo17;
public class TestStop implements Runnable{
//设置标志位
private boolean flag=true;
@Override
public void run() {
int i=0;
while (flag){
System.out.println("run Thread"+i++);
}
}
//设置公开方法停止线程,转换标志位
public void stop(){
this.flag=false;
}
public static void main(String[] args) {
TestStop testStop = new TestStop();
new Thread(testStop).start();
for (int i = 0; i < 1000; i++) {
System.out.println("main"+i);
if (i==900){
//调用自己写的stop方法切换标志位
testStop.stop();
System.out.println("线程停止了");
}
}
}
}
3.6线程休眠
- sleep(时间)指定当前线程阻塞多少毫秒。
- sleep存在异常InterruptedException,需要抛出
- 时间到达后进入就绪状态
- sleep可以模拟网络延迟,倒计时等
- 每一个对象都有一个锁,sleep不会释放锁。
- 抢票时多个线程使用同一个对象,会导致线程不安全,例如某人可以抢所有的票,所以要加sleep来保证其他人也能抢。
package Demo17;
//模拟倒计时,10秒
public class testSleep {
public static void main(String[] args) {
try {
tenDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void tenDown() throws InterruptedException {
int num=10;
while (true){
Thread.sleep(1000);
System.out.println(num--);
if (num<=0){
break;
}
}
}
}
- 补充:获取系统当前时间并打印
import java.text.SimpleDateFormat;
import java.util.Date;
public class testSleep {
public static void main(String[] args) {
Date starTtime=new Date(System.currentTimeMillis());//获取当前时间
while (true){
try {
Thread.sleep(1000);
System.out.println(new SimpleDateFormat("HH:mm:ss").format(starTtime));//打印时分秒
starTtime=new Date(System.currentTimeMillis());//更新当前时间
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
线程礼让Yield
- 概念;A进程正在被CPU调度,B处于就绪状态,A执行礼让后从CPU中跳出,此时状态与B相同,并不是进入阻塞状态,接下来A,B均有被调度的可能,若CPU调度了B,则礼让成功,若又调度了A,则礼让失败,因为CPU调度不可控。
package Demo17;
public class TestYield {
public static void main(String[] args) {
Myyield myyield = new Myyield();
new Thread(myyield,"A线程").start();
new Thread(myyield,"B线程").start();
}
}
class Myyield implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"线程开始执行");
Thread.yield();
System.out.println(Thread.currentThread().getName()+"线程停止执行");
}
}