什么是JDK简单:语法简单、没有多继承、没有指针,但有引用、自动的垃圾回收机制
面向对象:提供了类、接口等;
安全:java没有像c/c++那样的指针,操作内存需要通过对象的实例,这样使应用更加安全
跨平台:一套代码,到处运行,这主要依赖于jvm,jvm相当于中介,java编译成字节码文件后,jvm将字节码翻译成各硬件可以执行的指令,因此开发者无须对不同平台做适配。
支持多线程:多个任务可以同时进行
什么是JreJDK包括是java的核心,包括Java编译器,Java运行工具(jre)、Java文档生成工具、java打包工具等;Jdk是给开发者使用的,JDK是软件开发包
Java运行机制Java运行的环境,包括jvm、java的基础类库等
Java的语法Java运行时需要经过编译,然后才能运行
步骤:Javac Demo.java //javac命令会将.java文件编译成jvm可以执行的.class文件
java Demo //java命令启动运行程序,java虚拟机将.class文件加载到内存中,这个过程是类加载过程,由类加载器完成(类加载器有:启动类类加载器、平台类加载器(java8以上有,java8及以下为扩展类加载器),应用类加载器),然后对内存中的java类进行执行
public class ClassName{ //修饰符 class 类名
public static void main(String[] agrs){
//单行注释
int userId = 123;//标识符只能是字母、下划线_、$组成,不能是java保留的关键字;标识符区分大小写 不符合命名:1222UserId、class等
//
if(条件表达式){}else if(){}else
switch(表达式){
case 1: 语句。。。break;
}
while(表达式){}//可能一次都不会执行
do{}while(表达式){} //至少会执行一次
for(初始表达式;循环条件;操作表达式){}
//数组的定义:
int[] x = new int[10];
int[] y;
y = new int[10];
}
访问修饰符 返回值类型 方法名(参数类型 参数名.....){//方法
方法体
}
}
java的数据类型
数据类型转换基本数据类型:
数值型: byte:8位(1个字节), short:16位(2个字节), int:32位(4个字节), long:64位(8个字节), float:4个字节, double:8个字节
字符型(char):2个字节
布尔型(boolean)
引用数据类型:类、接口、数组、枚举、注解
面向对象 什么是面向对象自动类型转换:也叫隐式类型转换;条件:两种数据类型彼此兼容、目标类型取值范围大于源类型的范围:比如byte b = 2;int x = b; x+=b;
强制类型转换:也叫显示类型转换,两种数据类型之间的转换需要进行显示的声明,数据类型不兼容,目标类型取值范围小于源类型时就需要进行强制类型转换
面向对象的特点在生活中,各种事物都有不同的属性,事物之间都有这不同的关系,在程序中使用对象来映射生活中的事物,使用对象的关系来描述对象之间的关系;
例如:学生和老师;学生有学号、姓名等信息,老师有职工号、教学科目等;老师与学生之间的关系就是老师教授学生
this关键字的理解封装性:封装就是将对象的属性和行为封装起来,不让外界知道内部细节
继承性:继承就是将一个类的特性继承给另一个类,继承类可以会拥有父类的属性和行为,这样的好出就是增强了代码的复用等
多态性:多态性是指在程序中可以出现重名的现象,指在一个类中定义的属性和方法被其他类继承后,他们可以具有不同的数据类型或表现出不同的行为,这 就使得同一个属性和方法在不同的类中有不同的语义;
super关键字的理解this表示当前类的引用,可以用this来调用成员变量、调用成员方法,this(参数) 可以用来调用构造方法
final关键字的理解super关键字用来访问父类的方法或成员变量,也可以调用父类的构造方法
static关键字的理解final关键字可以修饰类、变量、方法,表示最终的,不可改变的
final修饰的类不能被继承、修饰的方法不能被子类重写,修饰的变量是常量,常量只能被赋值一次
内部类static用来修饰成员变量、成员方法、代码块等;
被修饰的成员方法称为静态方法,无法通过实例化的方式调用,只能是ClassName.staticMethodName()的形式
静态代码块,static{ 、、、、}的形式,类被加载的时候,静态代码块会被执行,类只会被加载一次,所以静态代码块只能被执行一次;静态代码块可以用来 做初始化工作;
静态成员变量在内存中只存在一份,因此类的多个实例可以共享一个静态成员变量的数据,使用ClassName.staticName的形式使用;例如:Student stu1 = new Student();Stu.schoolName =“XXXX”;Student stu2 = new Student();stu1.schoolName 和stu2.schoolName的值一样
匿名内部类Java允许在内部定义类,这种类就是内部类
内部类有成员内部类、静态内部类、方法内部类
成员内部类:类的成员可以是变量、方法,也可以是成员内部类,例如下:
静态内部类:使用static关键字修饰的一个成员内部类
方法内部类:在一个方法中定义的类
public class LindedList{
private class Node{}//这就是一个成员内部类
static class Node{}//这是一个静态内部类
public void mehodName(){
class Inner{ }//方法内部类
}
}
注意事项:静态内部类中只能访问外部类的静态成员;静态内部类中可以定义静态成员,而在非静态的内部类中不允许定义静态成员
抽象类接口除了被实现,还可以使用new 来实现,比如 new IService(){
public void test(){}
}
接口抽象类使用abstract关键字修饰类 public abstract class ClassName{}
抽象方法定义:public abstract void shout();
抽象类不可以被实例化,抽象方法没有方法体
抽象类允许方法有方法体
抽象类中可以有静态成员,有方法体
抽象类不能用final,static,private修饰;可以是默认、public、protected;
继承接口使用 interface 修饰,例如:public interface ClassdName{}
接口中所有方法都是抽象方法,默认使用public abstract修饰
接口中的变量默认使用public static final来修饰,既全局常量
接口中的方法都是抽象方法,因此不能通过实例化对象的方式来调用接口中的方法,需要定义一个类来实现一个接口,使用implements关键字,例如 public class ClassA implements IUserService{}
多态使用extends 关键字,例如 public class A extends B{}
final修饰的成员不能被继承,final修饰的方法不能被重写,static修饰的方法不能被重写,
多态的定义异常指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)
实现多态的技术实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
多态存在的三个必要条件
继承:在多态中必须存在有继承关系的子类和父类。
重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。
对于Java而言,它多态的实现机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。即超类可是使用子类方法,但不能调用父类同名方法。
比如使用一个父类的引用来指向子类的实例;比如
public class A extends C {}
public class B extends C{}
C a = new A();
C b = new B();
多态的优点1.可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
2.可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。
3.接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。如图8.3所示。图中超类Shape规定了两个实现多态的接口方法,computeArea()以及computeVolume()。子类,如Circle和Sphere为了实现多态,完善或者覆盖这两个接口方法。
4.灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。
5.简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。
访问修饰符及访问权限异常是程序在编译或者运行时出现的错误
异常分为Error和Exception,Error类是错误类,Java在运行时系统内部出现的错误或者资源耗尽,靠修改代码是无法恢复的
Exception类是异常类,是程序本身可以处理的错误,Exception的子类RuntimeException表示运行时异常,除了RutimeException及其子类外,其他的都是编译时异常
Excetpion和Error都是ThrowAble的子类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WdmcqLj6-1634123151033)(D:DesktopFiles笔记imgimage-20210924111012137.png)]
多线程线程的生命周期进程:每个独立执行的程序可称为一个进程,也就是正在运行的程序,比如系统中任务管理器中,QQ.exe等;每个运行的程序都是一个进程
线程:在一个进程中,还可以有多个单元同时进行,这些执行单元可以看作是程序执行的一条条线索,被称为线程;(程序中负责执行的哪个东东就叫做线程)
创建线程主要有两种方法:
通过继承Thread类,覆写Thread类的run()方法,再有就是通过实现Runnable接口,
比较创建线程的两种方式:
开发中,优先选择实现Runable接口的方式
原因1:实现的方式没有类的单继承性的局限性
2:实现的方式更适合用来处理多个线程有共享数据的情况
联系:Thread也是实现自Runable,两种方式都需要重写run()方法,将线程要执行的逻辑声明在run中
线程的调度线程的生命周期有5个阶段:新建状态(New)、就绪状态(Runnable)、运行状态(Running)、阻塞状态(Blocked)、死亡状态(Terminated)
多线程同步程序中的多个线程是并发执行的,某个线程若想被执行就必须要得到CPU的使用权,Java虚拟机会按照特定的机制为程序的每个线程分配CPU的使用权,这种机制就是线程的调度
线程的调度有两种:分时调度模型和抢占式调度模型
分时调度模型就是指所有的线程轮流获得CPU的使用权,并且平均分配每个线程占用的CPU的时间片;
抢占式调度模型是指让可运行池中优先级高的线程先占用CPU,对于优先级相同的线程,随机选择一个线程使其占用CPU,当他失去了CPU的使用权后,再随机选择其他线程获取CPU使用权,Java虚拟机默认采用抢占式调度模型
线程的优先级:线程的优先级用1-10之间的整数表示,数字越大优先级越高;通过Thread类的setPriority(int newPriority)设置
线程休眠:可以使用sleep(long millis)实现,将CPU让给别的线程执行,当前执行的线程会暂停一定时间
线程让步:通过yield()方法来实现,该方法不会阻塞该线程,它只是将线程转换成就绪状态,让系统的调度重新调度一次。当调用yield()方法后,只有与当前线程优先级相同或更高的才能获得执行的机会
线程插队:调用join()方法,调用的线程会进入阻塞状态
多线程同步,就是限制某个资源在同一时刻只能被一个线程访问
线程安全:当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象就是线程安全的。
线程安全问题其实就是多个线程同时处理共享资源导致的
同步代码块:synchronized(lock){
操作共享资源代码块
}
lock是一个锁对象,它是同步代码块的关键,当线程执行同步代码块时,会首先会检查锁对象的标志位,默认情况下标志位为1,此时线程会执行同步代码块,同时将锁对象的标志置为0,新线程会发生阻塞,等待当前线程执行完同步代码块后,锁对象的标志位被设为1,新的线程才能执行同步代码块。比如排队取钱,一个去完后才能让下一个
同步方法:使用synchronized修饰的方法;被修饰的方法在同一时刻只能被一个线程调用,其他线程会发生阻塞,直到当前线程执行完
死锁问题:两个线程在运行时都在等待对方的锁,这就造成了程序的停滞,这种现象就是死锁
多线程通信?



