java基础

(一)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类的构造

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线程的五大状态之停止线程

在这里插入图片描述

  1. 并不推荐使用JDK提供的stop(),的destory()方法停止线程。
  2. 推荐线程自己停下来。
  3. 建议使用一个标志位进行终止变量,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()+"线程停止执行");
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泰勒今天想展开

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值