角色
表示修饰符,使用修饰的变量,在Java中分配内存后会一直存在,直到程序退出时才会释放该空间。 修改后的变量可以通过添加“.”直接访问到类名。
决赛的作用
Final的意思是不可改变的。 如果修改一个类,则意味着该类是final类,不能被继承。 默认情况下,其中的所有方法都是最终的。 如果方法被修改,则不能被子类重写,但可以被子类继承(父类中的方法不能被子类重写,默认为final)。 如果修改成员变量,则意味着该变量是常量,只能赋值一次,赋值后不能更改。
和...之间的不同
重载()是指同一个类中可以有多个方法名相同的方法,但这些方法的参数列表不同(参数的数量、类型或顺序)。
()的意思是子类重写了父类中的一个方法。 相同的内容包括方法名、参数和返回类型。 子类的方法访问修饰符的作用域必须大于或等于父类的作用域,并且子类只能抛出比父类少的异常。 声明为final的方法不能被覆盖。 声明为的方法不能被重写,但可以重新声明。 如果子类和父类在同一个包中,子类可以重写除final和final之外的所有方法。 如果子类和父类不在同一个包中,子类只能重写父类声明的方法。
内部类
每个内部类都可以独立继承一个接口,与外部类无关。
成员内部类作为外部类的成员,可以使用外部类的所有成员和方法,但外部类必须首先拥有成员内部类的实例对象,然后才能访问内部类。 成员内部类不能有任何变量或方法。 只有先创建外部类,才能创建成员内部类。 (新建外部类实例;外部类名.内部类名内部类对象名=外部类实例.新建内部类名)。
局部内部类是在方法或作用域中定义的类,其访问权限仅限于该方法或该作用域。
匿名内部类,无访问修饰符; 新的匿名内部类; 这是一个简单的例子。
这里测试方法的参数是final修饰的,里面也定义了一个final变量,然后在匿名内部类中执行。
可以使用了。 run方法中,对于a,Java编译器可以确定它的值,因此在编译时会直接将一个值相等的变量添加到匿名类的常量池中; 对于b,在编译期间无法确定参数的值。 这时,测试方法中的形参a就会作为参数传入,对匿名内部类中的副本进行初始化和赋值。 这里有一个问题。 内部类中的变量和测试中的局部变量不是同一个对象,所以Java直接限制为final变量,不允许改变。 这样就解决了数据不一致的问题。
静态内部类,使用修改内部类。 内部类不依赖于外部类,不能使用外部类的非成员变量或方法创建静态内部类对象,外部类名.内部类名内部类对象名=new外部类名.inner班级名称 ()。
Java二维数组
定义,输入[][]或输入[][]。
静态初始化,int array[][] = {{1,2},{1,2,3},{1,2,3,4}};
在Java中,二维数组被视为数组的数组。 数组的空间是不连续的,因此二维数组的各个维度的大小并不要求相等。
动态初始化可以直接给数组的各个维度分配相同的大小,也可以先确定数组最高维度的大小,然后再具体分配各个维度。 int array[][] = new int[2][3];int array[][] = new int[2][],array[0] = new int[5],array[1]=new int[ 10]。
接口和抽象类
抽象类
可以包含具体的方法;
子类使用关键字来继承抽象类。 如果子类不是抽象类,则需要实现父类中的所有抽象方法,或者继续声明为抽象类;
抽象类也可能不包含抽象方法;
抽象类可以有成员变量;
抽象类可以有构造函数,但不能直接使用它们来创建抽象类的实例。 在继承抽象类的子类中,可以通过super调用抽象类中的构造函数;
抽象类可以继承一个类来实现多个接口。
界面
接口可以且只能有最终修改的常量。
子类需要使用实现接口并实现接口中声明的所有方法;
该接口没有构造函数;
接口默认修饰符为 , 且不能更改为其他修饰符。
反射机制
Java反射机制处于运行状态。 对于任何类,该类的所有属性和方法都是已知的,对于任何对象,都可以调用它的任何方法和属性。 这种动态获取信息、动态调用对象方法的功能称为Java语言的反射机制。
通过反射获取类的包名、类名等类相关信息。
通过反射使用Class创建类对象
java面向对象的三个特点及含义
继承:继承是通过从现有类获取继承信息来创建新类的过程。 提供继承信息的类称为父类(基类、超类); 获得继承信息的类称为子类(派生类)。 继承使不断变化的软件系统具有一定程度的可持续性。 同时,继承也是程序中封装可变因素的重要手段。
封装:用类编写的方法封装了实现细节。 编写类封装了数据和数据操作。 封装就是隐藏所有能隐藏的东西,只向外界提供最简单的接口。
多态性:多态性允许不同子类型的对象对同一消息做出不同的响应。
编译时多态:指根据不同的参数列表来区分不同的函数。 编译后会变成两个函数,主要指的是方法重载。
运行时多态:(动态绑定)是指在程序运行过程中确定所引用对象的实际类型,并根据实际类型判断并调用相应的方法和属性。
要实现多态需要做两件事: 1、方法重写(子类继承父类,重写父类中已有的或抽象方法); 2.对象建模(使用父类型引用来引用子类型对象,这样,使用相同的引用调用相同的方法将根据子类对象的不同表现出不同的行为)。
Java 线程和进程
线程存在于进程中,每个进程至少有一个线程。 线程共享进程的资源,包括内存和打开的文件。 进程和线程是并发编程的两个基本执行单元。 在Java中,并发编程主要涉及到线程。
Java中实现多线程有两种方式,1.继承类,2.实现接口。
进程的基本状态及其转换
线程可以处于四种状态之一:
1. 创造新的。 当线程被创建时,它只会短暂地处于这种状态。 此时它已经分配了必要的系统资源并执行了初始化。 此时,线程已经有资格获得CPU时间,然后调度程序将线程更改为可运行状态或阻塞状态。
2. 准备好。 在这种状态下,只要调度器为线程分配时间片,线程就可以运行。 也就是说,在任何时候,线程可能正在运行,也可能没有运行。 只要调度器能给线程分配时间片,它就可以运行,这与死亡和阻塞状态不同。
3.堵塞。 线程可以运行,但有一个条件阻止它运行。 当线程被阻塞时,调度程序会忽略该线程,并且不会为该线程分配 CPU 时间。 线程在重新进入就绪状态之前不可能执行操作。
4.死亡。 处于死亡或终止状态的线程不再是可调度的。 并且永远不会再获得 CPU 时间。 任务终止的通常方式是从 run() 方法返回,但任务线程也可以被中断。
Java中使用关键字来实现同步。
运行()和开始()
系统通过调用start()方法来启动一个线程。 此时线程处于就绪状态。 直接调用run()方法,这将被视为普通的函数调用。 程序中仍然只有一个线程,即主线程。
等待()和()
当代码正在执行时,线程可以调用该对象的wait()方法,释放该对象的锁,并进入等待状态,直到其他线程调用该对象的()方法或()方法。 () 唤醒等待队列中的第一个线程并运行它来获取锁。 (),唤醒队列中等待的所有线程,让它们竞争锁。
Java 5添加了Lock接口及其实现类之一(可重入锁)。 lock() 方法。 以阻塞方式获取锁。 如果获得锁,则立即返回; 如果另一个线程持有该锁,则当前线程将等待,直到获得该锁并返回。 (),以非阻塞形式获取锁。 如果获取到则返回true。 如果没有获取到,则返回false。
睡眠()和等待()
sleep不会释放锁,wait会释放锁。
加入
join 方法是通过线程对象调用的。 如果在线程A中调用了另一个线程B的join方法,线程A会等待线程B执行完毕才执行。
这个和超级
this用于指向当前实例的对象,用于区分方法的成员变量和形参。 如果方法的形参与成员变量的名称相同,则方法的形参会覆盖成员变量。
super 用于访问父类的方法或成员变量。
用该修饰符修饰的变量,程序读取其值时会直接从内存中获取,且必须是最新的值。 而不是从缓存中获取。
其他
按值传递和按引用传递
按值传递。 在方法调用过程中,实参将其值传递给形参使用。 虽然两个值完全相等,但它们在内存中确实处于完全不同的位置,并且形参的改变不会影响实参。
通过引用传递。 在方法调用中,传递的是对象的地址,这意味着形参和实参实际上指向同一个存储单元。
在Java中,八种基本数据类型都是按值传递的,包装类也都是按值传递的。
数学中的圆、天花板和地板
round 四舍五入并返回结果 int。
ceil 被四舍五入并返回。
地板向下舍入并返回。
Java I/O 流
字节流:和
字符流:和
流套接字,使用TCP协议。 提供面向连接的服务。 提供可靠的连接。 Java提供了两个用于TCP连接的类,以及类。 一个实例代表 TCP 连接的客户端,一个实例代表服务器。 一般情况下,程序中会有多个客户端和一台服务器。 客户端向服务器发送连接请求,服务器实例监听客户端的连接请求,创建一个新实例并为每个请求启动一个新线程。 调用()方法进行监听。 每个实例都有一个与其关联的总和。 通过写数据发送数据,通过接收数据接收数据。 通信完成后记得关闭连接。
数据报套接字,使用UDP协议。 对于无连接、不可靠的连接。 服务器和客户端都使用send()和()方法来接收和发送数据。 由于UDP是无连接的,服务器不必等待客户端请求连接。 UDP 服务器使用相同的套接字进行所有通信。 如果传输过程中数据丢失,程序将始终阻塞在()处。 为了避免这个问题,可以设置()的最大阻塞时间,并指定重发数据报的次数。
堆和栈
在Java中,基本数据类型的变量和对象的引用变量以及内存都是在栈上分配的。
对于引用类型变量,内存分配在堆上或常量池中。
关于
List、Queue、Set 和 Stack 继承自该接口。
集合,其元素不能重复。 线程不同步。 有两个实现类: 和 。 实现了接口,底层数据结构是二叉树,是有序的。
List 和 都是基于数组实现的。 只有最后添加和删除元素快,随机访问快,而且是线程安全的。 它基于双向链表,可以快速在指定位置插入数据。
封装结构、区别
它是一个接口,是Set、List等容器的父接口; 它是一个工具类,提供了一系列静态方法来辅助容器操作。 这些方法包括容器搜索、排序、线程安全等。
地图收藏
该集合存储键值对。 实现类有:
,底层是哈希表数据结构,不能存储空键和空值,线程是同步的。
,底层是哈希表数据结构,可以存储空键和空值,线程不同步,效率高。
,底层是一个二叉树数据结构,实现了接口,线程不同步,可以用来对map集合中的key进行排序。
种类
对象是不可变类型,具有通用返回类型的方法每次都会返回一个新对象。
如何比较对象:
==内存比较直接比较两个引用所指向的内存值。 准确的介绍很简单。
字符串值比较,比较两个引用所指向的对象的字面值是否相等。
公共方法有哪些
1、clone方法实现对象的浅复制。 只有实现了该接口才能调用该方法。
2.,final方法,获取运行时类型。
3.方法,一般由子类覆盖。
4.方法,用于释放资源,因为无法确定这个方法什么时候会被调用,很少。
5、方法。 一个很重要的方法,用于比较,子类一般需要重写它。
6.方法,该方法用于散列搜索,可以减少搜索时使用的次数。 一般情况下,如果重写方法,就必须重写该方法。 这种方法被用在一些哈希函数中。
7.等待方法。 调用该方法后,当前线程进入睡眠状态,直到以下事件发生。
(1). 其他线程调用该对象的方法或方法。
(2)。 其他线程调用中断该线程。
(3) 等待(长时间)设定的时间间隔已到。
此时,如果线程被中断、抛出异常,或者处于可以调度的状态。
8. 唤醒等待该对象的线程。
9. 唤醒所有等待该对象的线程。
是Java中所有错误和异常的超类。 包含两个子类,Error 和 . 是一个子类,代表Java虚拟机正常运行期间可能抛出的异常的超类。 编译器不会检查 Error 和 . 您必须修改代码以避免这些情况。
、受检异常、类本身以及除子类之外的其他子类都是受检异常,Java编译器会检查这些异常。 此类异常必须通过声明抛出或通过try-catch捕获,否则无法编译。
要补充能量,请查看并阅读: