*目录*
示例: Person p = new Person (“zhangsan”,20) ;
BufferedWriter缓冲区写入器---------就是装饰类的增强效果.
Synchronized升级版_Lock,Condition
提示:笔记截图批量上传有问题, 需要原始文件的, 可以后台私信我发你
*Java中的名称规范*
* **常量与变量*
*类与**对象**😗
\1. 类: 就是对现实生活中事物的描述
\2. 对象: 就是这类事物,实实在在存在的个体;
映射到java中,描述就是class定义的类。 描述事物其实就是在描述事物的属性和行为。
具体对象就是对应java在堆内存中用new建立实体。
*变量的存储特点:*
\1. 成员变量:在堆内存中,因为对象的存在,才在内存中存在。
\2. 局部变量:存在栈内存中。
*封装:*
是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
1好处:
●将变化隔离。
便于使用。
提高重用性。.
●提高安全性。
2封装原则:
●将不需要对外提供的内容都隐藏起来。
●把属性都隐藏,提供公共方法对其访问。
注意:私有仅仅是封装的一种表现形式。
*之所以对外提供访问方式,*
\1. 就因为可以在访问方式中加入逻辑判断等语句。
\2. 对访问的数据进行操作。提高代码健壮性。
*构造代码块。*
\1. 作用:给对象进行初始化。
a) 对象一建立就运行,而且优先于构造函数执行。
\2. 和构造函数的区别:
a) 构造代码块是给所有对象进行统一初始化,
b) 而构造函数是给对应的对象初始化。
c) 构造代码快中定义的是不同对象共性的初始化内容。
\3. 格式: 将代码直接放入{};中.无任何其他字符;
\4. 静态代码块: 给类初始化
\5. 自定义构造函数: 给对应对象初始化;
\6. 执行顺序: 静态代码块>构造代码块>构造函数;
*T**his*
1.代表它所在函数所属对象的引用。
简单说:哪个对象在调用this所在的函数,this就代表哪个对象。
2.另外也用于区分同名成员变量与局部变量;
3.this语句:用于构造函数之间进行互相调用。
4.和super一样,放在第一行;
*static特点:*
1,随着类的加载而加载。
2,优先于的对象存在
3,被所有对象所共享
4,可以直接被类名所调用。
*静态使用注意事项:*
1,静态方法只能访问静态成员。
非静态方法既可以访问静态也可以访问非静态。
2,静态方法中不可以定义this, super关键字。
因为静态优先于对象存在。所以静态方法中不可以出现this.
*静态有利有弊*
\1. 利处:
a) 对对象的共享数据进行单独空间的存储,节省空间。没有必要每一个对象中 都存储一份 。
b) 可以直 接被类名调用.
\2. 弊端:
a) 生命周期过长。
b) 访问出现局限性。(静态虽好,只能访问静态.)
*静态修饰的内容_有成员变量和函数。*
\1. 什么时候定义静态变量(类变量)呢?
a) 当对象中出现共享数据时,该数据被静态所修饰。
b) 对象中的特有数据要定义成非静态存在于堆内存中。
\2. 什么时候定义静态函数呢?
a) 当功能内部没有访问到非静态数据(对象的特有数据),那么该功能可以定义成静态的。
*实例变量和类变量的区别:*
1,存放位置。
类变量随着类的加载而存在于方法区中。
实例变量随着对象的建立而存在于堆内存中。
2,生命周期:
类变量生命周期最长,随着类的消失而消失。
实例变量生命周期随着对象的消失而消失。
*主函数的定义:*
\1. public static void main(String[] args)
\2. 主函数:是一个特殊的函数。作为程序的入口,可以被jvm调用。
\3. public:代表着该函数访问权限是最大的。
\4. static:代表主函数随着类的加载就已经存在了。
\5. void:主函数没有具体的返回值。
\6. main: 不是关键字,但是是一个特殊的单词,可以被jvm识别。
\7. (String[] arr) :函数的参数,参数类型是一个数组,该数组中的元素是字符串。字符串类型的数组。
\8. 主函数是固定格式的: jvm识别。
\9. jvm在调用主函数时,传入的是new String[0];
*冒泡排序与选择排序*
给一个数组中的数字排序
\1. 冒泡排序:通过比较每两个元素之间的大小,如果第一个大于第二个,就交互它们的位置.
\2. 计较方式: 两个for循环,外层for控制数组循环次数,内层for控制数组中每个元素需要和其他元素循环比较的次数.
\3. 需要注意的一点:外层会少循环一次,内层中,每个元素和会和其他元素都互相比较一次.
所以比较的次数也会比数组长度少一,
因为数组中比较过的元素就不需要再比较了, 所以每下一次循环还会将次数减一,
\4. 说通俗点,比如一个数组有四个随机数字,用第一个数字分别和后面的三个数字相比较,
再用第二个数字分别和后面的二个数字相比较,
再用第三个数字分别和后面的一个数字相比较
每次计较结果为true就会交换它们之间的位置.
\1. 选择排序:也是两个for循环,外层for控制数组循环的次数,内层for控制数组中相邻两个元素之间的比较次数.
\2. 需要注意一点: 因为内层for是控制数组中相邻元素之间的比较,所以为了避免数组角标越界,循环的次数也会减一,
因为上一次循环前面两个数字已经比较过一次了, 所以后面的内层每次循环都会次数减一.
\3. 通俗点:就是数组中所有相邻的两个元素之间比较.
*代码在内存中**_**执行顺序**😗
静态代码块>开辟空间,分配地址,建立属性变量,进行默认初始化>显示初始化>构造代码块>对应构造函数>将堆内存中的地址分配给栈内存中的变量
*示例**😗 *Person p = new Person (“zhangsan”,20) ;*
该句话都做了什么事情?
1, 因为new用到了Person.class.所以会先找到Person.class文件并加载到内存中=
2,执行该类中的static代码块, 如果有的话,给Person. class类进行初始化。
3,在堆内存中开辟空间,分配内存地址。
4, 在堆内存中建立对象的特有属性。并进行默认初始化。
5, 对属性进行显示初始化。
6,对对象进行构造代码块初始化。
7, 对对象进行对应的构造函数初始化。
8,将内存地址付给栈内存中的p变量。
Person p = new Person();//短短这行代码发生了很多事情
1.把Person.class文件加载进内存
2.在栈内存中,开辟空间,存放引用变量p
3.在堆内存中,开辟空间,存放Person对象
4.对成员变量进行默认的初始化
5.对成员变量进行显示初始化
6.执行构造方法(如果有构造代码块,就先执行构造代码块再执行构造方法)
7.堆内存完成
8.把堆内存的地址值赋值给变量p ,p就是一个引用变量,引用了Person对象的地址值
*局部代码块*
\1. 位置: 在方法里面的代码块
\2. 作用: 通常用于控制变量的作用范围,出了花括号就失效
\3. 注意事项: 变量的作用范围越小越好,成员变量会存在线程安全的问题
执行顺序:构造代码块->构造方法->普通方法->局部代码块,分析:
1.当创建对象时,会触发构造函数
2.创建对象时,也会触发构造代码块,并且构造代码块优先于构造方法执行
3.我们创建好对象后才能通过对象调用普通方法
4.如果普通方法里有局部代码块,才会触发对应的局部代码块 */
*帮助文档_API*
使用格式:
生成的文档中,类需要被public修饰,不然生成不了;
*单例设计模式*
*称为:饿汉式。*
Student 类一进内存, 就已经创建好了对象。------一般用这个.
*懒汉式*
*继承:*
1,提高了代码的复用性。
2,让类与类之间产生了关系。有了这个关系,才有了多态的特性。
注意:
千万不要为了获取其他类的功能,简化代码而继承。;
必须是类与类之间有所属关系才可以继承。所属关系is a.
因为多继承容易带来安全隐患:当多个父类中定义了相同功能,
当功能内容不同时,子类对象不确定要运行哪一个。
但是java保留这种机制。并用另一种体现形式来完成表示。多实现。
java支持多层继承。也就是一个继承体系
3,如何使用一个继承体系中的功能呢?
想要使用体系,先查阅体系父类的描述,因为父类中定义的是该体系中共性功能。
通过了解共性功能,就可以知道该体系的基本功能。
4,那么这个体系已经可以基本使用了。在具体调用时,要创建最子类的对象,为什么呢?
一是因为有可能父类不能创建对象,
二是创建子类对象可以使用更多的功能,包括基本的也包括特有的。
简单一句话:查阅父类功能,创建子类对象使用功能。
—静态只能重写(覆盖)静态
*多态*
1,多态的体现
父类的引用指向了自己的子类对象。
父类的引用也可以接收自己的子类对象。
2,多态的前提
必须是类与类之间有关系。要么继承,
要么实现。
通常还有一个前提:存在覆盖。
3, 多态的好处
多态的出现大大的提高程序的扩展性.
4,多态的弊端:
提高了扩展性,但是只能使用父类的引用访问父类中的成员。
5,多态的应用
多态至始至终都是子类对象在做着变化.
\1. 在多态 (指父类引用指向自己子类的对象) 中成员函数的特点:
a) 在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。
b) 在运行时期:参阅对象所属的类中是否有调用的方法。
c) 简单总结:成员函数在多态调用时,编译看左边,运行看右边.
\2. 在多态中,成员变量的特点:
无论编译和运行,都参考左边(引用型变量所属的类).
\3. 在多态中,静态成员变量 和 静态函数 的特点:
无论编译和运行,都参考左边.
*内部类的访问规则:*
1, 内部类可以直接访问外部类中的成员,包括私有。
2, 之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用,格式 : 外部类名. this
3,外部类要访问内部类,必须建立内部类对象。
访问格式:
当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中。
可以直接建立内部类对象。
格式:
外部类名.内部类名 变量名 = new外部类对象().new 内部类对象();
Outer . Inner in = new Outer () .new Inner () ;
注意:只有内部类才能私有化,但是外部类不能私有化,不然怎么访问
4,当内部类在成员位置上,就可以被成员修饰符所修饰。
比如:
private: 将内部类在外部类中进行封装。
static:内部类就具备static的特性。
a) 当内部类被static修饰后,只能直接访问外部类中的static成员。出现了访问局限。
b) 在外部其他类中,如何直接访问static内部类的非静态成员呢?
new Outer. Inner() . function() ;
c) 在外部其他类中,如何直接访问static内部类的静态成员呢?
Outer. Inner . function() ;
注意:
当内部类中定义了静态成员,该内部类必须是static的。
当外部类中的静态方法访问内部类时,内部类也必须是static的。
当描述事物时,事物的内部还有事物,该事物用内部类来描述。
因为内部事务在使用外部事物的内容。
内部类定义在局部时,
1,不可以被成员修饰符修饰
2,可以直接访问外部类中的成员,因为还持有外部类中的引用。
但是不可以访问它所在的局部中的变量。只能访问被final修饰的局部变量。
局部内部类: 指的是-外部类的方法中的类,
匿名内部类中定义的方法最好不要超过3个。
练习……
下面是主要代码区
下面为主函数
练习-----
没有接口,也没有父类,如何才能用匿名内部类呢?
用Object来创建匿名内部类;
*String字符串*
*包装类*
*日期格式化*
*IO流*
https://blog.csdn.net/m0_47630931/article/details/107234412 //大神一站式总结
中国国标码: GB2312→扩容: GBK-2字节
国际国标码: Unicode→优化: utf-8-3字节
港澳: BIG-5码
*字符流*
*演示:写入文件数据*
*演示**😗*对已有文件的数据续写**.*
*通过字符,读文件.*
*通过字符数组,读文件*
*文件的复制**.*
思路
演示.
续-----关闭流.
*BufferedWriter缓冲区写入器**---------**就是装饰类的增强效果**.*
**一次写入一行数据.****—**readLine方法返回的时候只返回回车符之前的数据内容,并不返回回车符.
*装饰类设计模式.*
演示.
主函数.
*装饰类的特点及与继承的区别*
也就是装饰类和被装饰类都是在同一超类体系下的一个层次上.
*字节流*
*复制图片*
*Mp**3(音乐)的复制*
*流*
.
*流操作的基本规律*
*键盘录入*
*File*
*F**ile类常见方法*
*递归*
*递归遍历所有文件*
*递归使用:加法、进制转换*
*P**roperties*
*字节打印流与字符打印流*
*S**erializable*(序列化)------懵逼………………
序列化标识接口,里面没有方法,用于反序列化的时候能能正常访问。
被static和transient修饰的不能被序列化。
*RandomAccessFile*
*异常*
*异常*
*异常的处理*
只有在try中,函数一旦发生异常就会结束try内剩余的运行.
*自定义异常*
*特殊异常*
*异常的三种格式*
记住一点: catch是用于处理异常,如果没有catch就代表异常没有被处理.
如果该异常是检测时异常就必须声明
* **异常在子类中重写的体现*
*异常总结*
*包*
*I**mport*
分为静态导入和一般导入.
静态导入 格式:import static
作用:使类中的静态方法和静态变量可以直接使用.
如: import static java.lang.System.out;
System. out.println();-----àout.println();
*Jar*
设置java运行临时环境: set classpath = (运行路径)
包编译: javac –d . 文件名.java //”.”表示当前路径
包运行:java 包名.文件名
Jar编译: jar -cf 文件名.jar 包名1 包名2
Jar运行: jar 文件名.jar //具体运行那种方式要看文件名前的命令代码
*多线程*
*线程定义方式*
*线程:实现方式和继承方式的区别*
图解析-------------------------------------------------------------------------
*单线程和多线程的区别*
*线程状态_示意图*
*并发安全问题*
*并发安全问题**__**卖票示例*
*同步的前提*
*静态修饰的同步锁*
*死锁*
*等待与唤醒*
Notify一直都是唤醒最先进入wait状态的一个线程.
*多线程_多个生产者与消费者_等待与唤醒___示例*
提示要点:
*S**ynchronized升级版_Lock,Condition*
*Thread_interrupted(中断)*
*集合*
集合里面只能存引用数据类型.
*List*
List集合判断元素是否相同,依据是元素的equals方法.
*A**dd方法*
*LinkedList*
*Vector**__略…*
*Iterator_迭代器*
示例
*Set*
*范型*
*泛型的应用*
*M**ap*
*HashMap__**增删查判*
示例
*集合的取出方式*
*第一种* *.map.keySet取出方式_示例*
图解
*第二种方式_map.entry*
图解
M****ap.entry的详解.
*T**reeMap*
续-------↓↓↙↙
*练习**_**获取字符串中字母出现的次数**.*
高级for循环
*可变参数*
*静态导入*
*网络编程*
*概述*
*通讯要素*
*浏览器请求*
[外链图片转存中…(img-Qb94GVb0-1727094839563)]
示例
[外链图片转存中…(img-icRKYhoV-1727094839564)]
*集合的取出方式*
[外链图片转存中…(img-fYsV9G8q-1727094839565)]
*第一种* *.map.keySet取出方式_示例*
[外链图片转存中…(img-ZZFvMasq-1727094839566)]
图解
[外链图片转存中…(img-eysAWIa9-1727094839566)]
*第二种方式_map.entry*
[外链图片转存中…(img-kTtLARor-1727094839569)]
图解
[外链图片转存中…(img-OjKrs1el-1727094839574)]
M****ap.entry的详解.
[外链图片转存中…(img-37SbW0Jf-1727094839575)]
*T**reeMap*
[外链图片转存中…(img-e1zzbvyt-1727094839577)]续-------↓↓↙↙
[外链图片转存中…(img-lEsfEXgb-1727094839578)]
*练习**_**获取字符串中字母出现的次数**.*
[外链图片转存中…(img-yPP7RNkw-1727094839579)]
[外链图片转存中…(img-nREmadR7-1727094839580)]
[外链图片转存中…(img-ZnlOgdHJ-1727094839581)]
高级for循环
[外链图片转存中…(img-DMj2JO3l-1727094839581)]
*可变参数*
[外链图片转存中…(img-6AhbYUgW-1727094839582)]
[外链图片转存中…(img-k3ksJeEN-1727094839583)]
*静态导入*
[外链图片转存中…(img-bTP97OtD-1727094839584)]
*网络编程*
*概述*
[外链图片转存中…(img-mjqiDDBO-1727094839585)]
*通讯要素*
[外链图片转存中…(img-RdEyPUTk-1727094839586)]