文章目录
- 注意
- java基础核心语法
- 疑惑
- java
注意
java基础核心语法
ps:
加粗和【】表示重点
删除表示已解决
1.跳转语句:
- continue:跳出当前循环,继续下一次循环
- break:结束循环
- return:结束方法
- System.exit(0):结束虚拟机
2.switch后的表达式的类型:
- jdk1.0-jdk1.4:byte、short、char、int
- jdk1.5-jdk1.6:+枚举(enum)
- jdk1.7_:+String
【 如果case语句后没跟break,会被穿透(一次条件判断后,就不再判断而直接执行,直到遇见break)】
switch(1) {
case 1:
System.out.println(1);
case 2:
System.out.println(2);
case 3:
System.out.println(3);
break;
default:
System.out.println(0);
break;
}
//1、2、3
3.int[] arr = new int[3];
System.out.println(arr);//[I@15db9742
结果分析:
- [:表示一维数组
- I:int类型
- @:没有实际意义,分隔符
- 15db9742:地址数据转为16进制
4.数组定义及赋值
数组:引用数据类型。栈 存地址,通过地址找到 堆 里面存储的数据(new一次就在堆中创建一块存储区域)
- 1.动态初始化int[] arr1 = new int[3]; arr1[0]=1; arr1[1]=2; arr1[2]=3;
- 2.静态初始化int[] arr2 = new int[]{1,2,3};
- 3.简写静态初始化int arr3[] = {1,2,3};//默认加了new关键字
- 4.int[] arr4;arr4 = new int[]{1,2,3}
- 5.错误:int[] arr5;arr5={1,2,3}//整型数组的引用类型arr5没有值。NullPointerExcption:空指针异常,表达的就是引用类型arr5中存储的地址为空。
5.jvm内存分块
- 常用
- 栈内存:用于执行方法,每个方法在栈中都有独立的存储和执行空间
- 堆内存:用于存储数组、对象等数据量比较大的数据。(垃圾回收站)
- 方法区:用于存储字节码对象、常量、静态变量、方法
- 不常用
- 本地方法区:用于执行本地方法
- 程序计数器:用于控制程序的执行、控制程序执行到了哪个操作
6.方法重载
在同一个类中,方法名相同,参数列表不同,【与返回值类型无关】
Eclipse可以自动解析,不需要区分方法名,实参个数或者类型不一样可被区分
//返回值类型不一样,不是重载reload,方法重名了,报错
public void test() {}
public int test() {}
7.两个引用指向一个数组(引用:arr1、arr2)
int[] arr1 = {111,222,333};
int[] arr2 = arr1;
arr2[0] = 444;
arr2[1] = 555;
//打印结果都一样:444 555 333
System.out.println(arr1[0]+"\t"+arr1[1]+"\t"+arr1[2]);
System.out.println(arr2[0]+"\t"+arr2[1]+"\t"+arr2[2]);
解释:在栈中申明arr1、arr2,其中存储的都是堆内存地址。arr2=arr1:那么两个数组存放数据的地址相同。即指向同一存储区域,故,打印结果一样。
8.面向过程——>面向对象(执行者变成指挥者)
面向过程是编年体;面向对象是纪传体——引用网友的话
- 面向过程:比如,如何洗衣服。设计方式:自顶向下,不断分解
- 面向对象(OOP):比如,谁洗衣服;张三做什么事。设计方式:自底向上,不断组装
- 特点:1、封装 2、继承 3、多态
面向过程: 将衣服丢进盆里→放洗衣液→放水→洗衣服→倒掉脏水→再放水→再清洗→拧干衣服→晾晒。现在你将洗衣服的一部分过程(放水,洗衣服,倒掉脏水,再放水,再清洗,拧干衣服)都交给了洗衣机,这时,洗衣机这个对象就出现了!
面向对象: 把衣服放进洗衣机→放洗衣液→(洗衣机.放水()→洗衣机.洗衣服()→洗衣机.倒掉脏水()→洗衣机.再放水()→洗衣机.再清洗()→洗衣机.拧干衣服())→晒衣服创建了洗衣机这个对象以后,你要做的就是括号以外的事情,而具体怎么洗,就是洗衣机的事情了
9.类和对象
①类:类型,是对具体事物的一个抽象认识,抽象的描述(人类)
一组相关属性和行为定义的集合
属性: 1)、用于描述事物的特征,一般都是一些可以量化的数据,一般是一个名词 2)、java中,使用成员变量来描述事物的属性,和以前定义的方式一样 只不过位置发生了改变:定义在类中,方法外 eg:String name;
行为: 1)、用于描述事物可以做的事情,可以完成的功能,一般都是一些动词或者动宾结构 2)、java中,使用成员方法来描述事物的功能,和以往定义方法的方式一样 eg:Sleep()、eat()
Ps:同一个包下面不可有相同名字的类(好比,对植物的分类,不可能有两个相同的分类一样)
②对象:一切客观存在的事物
事物的具体体现(张三、李四)
1)、对象: 具体数据和功能的一个集合 2)、创建的格式: 类名 对象名 = new 类名(); 3)、属性访问: 获取属性:对象名.属性名 修改属性:对象名.属性名 = 属性值; 4)、功能访问: 对象名.方法名();
Ps:【第一次使用某个类型时,需要将该类型的字节码加载到方法区,之后使用某个类型时,不需要重新加载这个类】
10.匿名对象
格式:new 类名();
使用场景:
1)、如果需要在对象创建之后,只调用一次方法,就不再使用该对象,就可以使用匿名对象。
2)、可以作为某个方法的实际参数进行传递
3)、可以作为某个方法的返回值进行返回(返回的是某个类,或类中对象\方法,那么定义此方法时类型也要是这个类)
11.封装、this
封装:安全、私有、提高复用性,只提供供外部访问的接口(比如,访问当前类的共有方法,从而访问该类的私有成员变量)
this:表示本类的,当前的
12.构造方法
(和set方法都是给成员变量赋值,但是set更偏向于修改;构造方法指对象初始化,更死板一些)
- Constructor:构造器、构造方法
- 作用:给成员变量赋值,故不能有返回类型和返回值
- 格式:权限修饰符 类名(参数列表){……}
- 不需要手动调用,创建类时,jvm自动调用
Ps:没有手动创建构造方法时,系统自动构造了一个空参构造方法(同一个类中,最好同时创建有参、无参构造方法)
【 默认初始化(空参构造、有参时有默认值)——>显示初始化(创建成员变量时赋值)——>构造方法初始化】
注意:
①构造方法用于子类访问
②构造方法用于父类私有成员变量赋值
③有无有参构造方法,在于,是否有需要初始化的成员变量
13.静态变量
随着类加载而加载至方法区的静态区,加载时,直接分配空间
方式:直接使用类名点变量名(不建议使用:对象名)
优先对象而存在
eg:Persion.name
【注意】:当前类不变时,该静态变量不变
静态变量:不会随着对象的改变而改变。换言之,不管创建了多少个对象,它始终只在此类加载时创建一次(方法区)
14.静态方法
①静态方法不能访问非静态的变量或方法(即,静态不能访问非静态)
(可以直接用 类名.方法名 直接调用静态方法。静态方法可在没有创建对象的情况下直接调用,所以静态方法不能访问非静态的变量,也不能访问非静态方法,否则这样会间接访问非静态变量)
②不能再静态方法中,访问this、super关键字
(这两个关键字都是表示对象的引用,需要对象创建之后,才有地址)
【注意】:顶层父类不变时,该静态方法不变
15.工具类(方法都是static)
简言之,实现某些功能,比如遍历数组、求最大值
- 调用:直接使用类名点方法名。最好不要创建对象(ArryTool at = new ArryTool())来调用,会浪费内存空间。
- 【阻止创建对象:将空参构造方法私有化private ArryTool(){……}】
16.文档注释
帮助生成帮助文档
符号:/**……/
@version 版本号
@author 作者名称
@param 参数名称 参数解释——》描述方法中的参数含义
@return 返回值类型
生成帮助文档:
1)dos命令(需要单独设为java文件,必须加public,不然 权限不够)
javadoc -d 帮助文档生成目录 -version -author 工具类名称
例如:javadoc -d ./doc -author -version ArryTool1.java
2)eclipse
选择文件——》export——》java——》javadoc……
17.一个java文件中,只能有一个public类,并且和文件名相同
18.继承extends
1)词语解释:
①ex:前妻
②extend:扩展
2)关系解释:
父类:被继承的类,超类,基类(基础类)
子类:继承的类,派生类
3)含义:子类继承父类(父类中的所有属性,行为都可以调用)
4)好处:
- 减少赘余
- 提高可维护性
- 类与类建立联系
- 多态的前提
5)缺点:
- 耦合性高(依赖性高)
6)出现同名成员变量时,仍然需要访问父类成员变量,使用super.成员变量名
注意:
①私有成员不能被继承,父类成员变量最好设置为私有,子类没必要直接使用父类的成员变量(private成员不能直接使用,可以通过父类的共有成员方法访问)
②父类的构造方法不能被子类继承(构造方法名需与类名相同)
③不要因为一部分功能而随意建立继承关系(不是所属关系不要建立)
④Java中的继承:单继承,不能多继承(一个子类只有一个父类)
⑤Java中,可以多层继承(子类有一个父类,父类还有父类……)
⑥final类(最终类)不可被继承
⑥子父类的成员变量都要参与构造方法时:
//name,age是父类的;subject是子类的
public Teacher(String name,int age,String subject) {
super(name,age);
//可用set方法,但是这样使用,还是会自动访问父类的空参构造。故不如直接使用父类的构造方法
// this.setName(name);
// this.setAge(age);
this.subject = subject;
}
19.开发原则:
1)高内聚(自立自强),低耦合(少依赖)
2)高复用性(能用别人的就用)
20.this、super
ps:父类先加载,之后再加载子类(所以:父类构造方法实现之后,再实现子类的默认构造初始化)
1)
- this.对象名
- super.对象名
2)【必须放在第一句】
- this(参数):访问子类构造方法(不加参数就访问无参构造,反之,有参构造)
- super(参数):访问父类构造方法(……)
21.方法重写(覆盖、修改——和变量重新赋值同理)、(继承才能重写)
只是对父类某个方法的实现进行重新编写
可在子类中的重写方法之上加:@override
与重载的区别:
- 重载:方法名同、参数列表不同、返回值类型无关。同一个类中
- 重写(覆写、override):方法名同、参数列表同、返回值类型同。子父类中
重写原则:
1)父类私有方法不能被重写(无法访问)
2)权限不能越来越小,类不能越来越弱(重写是一个加强的过程)
3)重写不能涉及静态(静态代表不变,所以不可重写)(静态不能被重写+前面静态时说明了:静态不能访问非静态)
4)final修饰的方法不可被重写
22.代码块
1)局部代码块
含义:
定义在局部位置(方法)的代码块
格式:
{……}
好处:
限定变量的生命周期(在局部代码块中声明的变量,代码块结束时,立刻收回)
2)构造代码块(提取共有部分)
含义:
定义在类中方法外,用于成员变量赋值
格式:
{……}
机制:
jvm自动执行
【构造方法前执行】
创建一次对象,就执行一次构造代码块
其实:
【就是把空参和有参共有的代码提取出来,减少赘余】
3)静态代码块(只执行一次,类加载就执行)
含义:
用于定义【只执行一次的内容的代码块】
位置:
类中方法外
格式:
static{……}
作用:
用于给静态成员变量赋值
用于执行只需执行一次的代码,例如驱动加载
特点:
随着类加载而执行(优先于同类其他方法)
4)同步代码块
synchronized (arrstr) {
}
24.final关键字
final修饰的对象地址不可变,但是里面的内容可以被修改(比如,今天限号ox1000,其他车牌的不能上路,但是可以套牌,让其他车上路)
含义:修饰(类、方法、变量【或者引用数据类型】)的关键字——》最终的:不可被继承;不可被重写;不可再赋值
符号:final
例如:final class Person{……}、final void test(){……}、final int a = 10【final Person p = new Person(),即地址不可变】
注意:当final修饰成员对象时,成员对象只有显示初始化和构造方法初始化,且二者之一必须为其赋值。
显示初始化后,则不可在有参构造该变量;有参构造后,不可空参
static final 命名:这类变量。只能在显示初始化或者静态代码块赋值(因为它随着类加载就分配了空间)
定义常量:
格式:public static final 类型 命名= 常量值;
解释:
- public:因为是共有的,所以加public关键字
- static:不需要是常量,没必要多次加载,所以直接放在静态池即可
-final: 常量不可更改,所以加final关键字 - 命名:全大写,两个单词之间用下划线隔开
25.常用快捷键总结
Ctrl
- Ctrl + n :快速创建工程
- Ctrl + d :快速删除
- Ctrl + / :快速注释
- Ctrl + 1 :报错提醒(F2)
- Ctrl + O :在当前类中,搜索类的大纲(方法之类)
Alt
- Alt + /:自动补全代码
- Alt + ↑(↓):向上(下)移动
Alt + Ctrl
- Alt + Ctrl + ↑(↓):向上(下)复制
Ctrl + Shift
- Ctrl+ Shift + F:自动调整代码(不好使:右键-source-Format)
- Ctrl + Shift + O :导包,并把不需要的包替换
- Ctrl + Shift + T :搜索某个类型
Alt + Shift
- Alt + Shift + R :重命名
- Alt + Shift + S :源代码相关的操作
- Alt + Shift + Z :创建代码块
F
- F2:修改类名、文件名
- F3:查看指定类型(Ctrl + 鼠标左键)
26.内部类
27.包
含义:用来分类存放类文件的一个文件夹 作用: 1、可以将不同类型不同作用的类,存放到不同的文件夹,便于搜索 2、不同的文件夹中,可以定义相同的类名 包的声明:
1、表示该类属于哪个包;表示将该类打包
2、效果:编译完成之后,直接就在指定的文件夹中生成字节码文件
3、格式:package 包名称
package 语句必须写在当前文件的第一行
一个文件中,只能有一个package语句
4、包名称:全部小写,域名倒着写,可以做到全球唯一
com.hbw.demos
5、带包声明的类的编译
javac -d 文件夹生成的位置 源码路径
跨包访问:
1) 使用全类名:包名 + 类名
eg:com.day08.demo.Person p = new com.day08.demo.Person()
2)导包
注意:【在一个类中,使用不同包下相同类名的类时,不可再导包来写,此、时使用全类名】(分不清楚是哪个包下的类)
eg:
①先导包:import com.day08.demos.Person;
②直接使用:Person p = new Person();
28.权限修饰符
friendly(默认)
29.多态
30.抽象
抽象方法:
含义:只有方法申明,没有方法体
关键字:abstract
格式:权限 abstract 类型 方法名();
抽象类:
格式:abstract class 类名{……}
【注意】:
①抽象方法只能存在于 抽象类和接口 中
②抽象类中,可能存在抽象方法(也可不存在)
③抽象类不可实例化(因为抽象类中可能存在抽象方法,而抽象方法没有方法体,那么没有意义)
④可以通过定义子类来重写抽象方法——》即,实现
⑤子类必须重写父类的所以抽象方法,不然子类也是抽象类(此时可在子类前加abstract),且不能实例化了
⑥抽象类中可以定义静态方法
【作用】:用于强制子类重写抽象方法;比如手机不知道具体要运行什么功能,但是要先把父类App申明出来
特点
1)成员变量:可以定义成员变量和常量
2)构造方法:
①构造方法用于子类访问
②构造方法用于父类私有成员变量赋值
③有无构造方法,在于,是否需要初始化的成员变量
3)成员方法:
①抽象类中可有抽象方法,也可有非抽象方法
②非抽象方法可以继承到子类中,提高代码复用性
③抽象方法用于强制子类重写
31.接口
32.API应用程序编程接口
33.集合
34.异常
35.File类
36.IO流
37.多线程
38.java8特性
疑惑
ps:删除线
java
1.为何静态不能被重写
静态表示,不变的。
静态变量:当前类不变时,静态变量不改变
静态方法:顶层父类不变时,那么该方法不可变
2.已解决
public static void main(String[] args) {
SUV[] s = new SUV[2];
Scanner sc = new Scanner(System.in);
for(int i = 0;i<s.length;i++) {
//错误 ????
//解答:定义了一个SUV数组,但SUV每一个对象并没有实例化(new),所以a[0].setBrand为null,因此就报错了。
//添加:s[i] = new SUV();
s[i].setBrand(sc.next());
s[i].setLength(sc.nextDouble());
s[i].setPrice(sc.nextDouble());
}
for(int i=0;i<s.length;i++) {
if(s[i].judge(s[i].getLength())==0) {
System.out.println(s[i].getBrand() + "\t" + s[i].getLength() + "\t" + s[i].getPrice());
}
}
}
}
3.System.out.println(name+ "\t" + age + "\t" + code);
??????
4.内部类待完善
5.包待补全
6.Body.Gan bg = new Body.Gan();创建的是Gan对象,还是Body对象
静态成员内部类:静态不可实例化,那么创建的应当是Body对象
7.重载是什么
8.找不到app.txt
放到java文件的根目录下面
9.接口待补充
10.如何理解接口
接口:规则
比如:usbc一说起usbc都知道长什么样子,但不关心具体的实现过程(芯片什么样子、接线怎么接)
再比如:定义“会响的就是闹钟”,不关心到底是什么东西会响(它可能是手机、可能是汽车等)
11.如何理解多态
多种状态,多种指向
App a =new Music()
a = new Game()
a = new Novel()
将Music、Game、Novel实际地址放到App a 引用中,调用时通过引用 a 找到实际类对象中的成员
11.day09笔记没整理
12.API待补充
13.day10笔记待整理
14.day11笔记待整理
15.day12笔记待整理
16.day13笔记待整理~
17.集合——List待补充
18.Entry是Map的内部接口,如何存储键值对、
内部接口如何调用
Entry是Map接口中的一个内部接口,它是实现键值对存储关键。在HashMap中,有Entry的实现类,叫做Entry。Entry类很简 单,里面包含key,value,由外部引入的hash,还有指向下一个Entry对象的引用,和数据结构中学的链表中的note节点很类似。
19.day14笔记待整理
20.day15笔记待整理
21.IO流练习待补充
22.多线程练习待补充; 多线程(下)待补充
23.java8特性中的:函数式编程思想?几种接口?streamming?
24.数组与集合的区别。为何需要集合
区别:
1)数组:可以存储基本数据类型、引用类型
2)集合:只能存储引用类型,因为底层使用的Object数组来装数据,而基本数据类型不包含在Object中,但是基本数据类型对应的包装类对象可以存储在Object中,所以,也根据自动装箱、拆箱可以直接存储基本数据类型。
对象类型的数组每次声明时,都要固定对象个数,不便于扩容。并且要实现的每一个功能都需要手动编写创建。集合就应运而生。
25.stream是一个流???什么是流?
当作对流对象。像管道传输一样
26.同步代码块
synchronized (arrstr) {
}
27.folat与long表达范围
28.jav8特性待补充
29.API中的StringBuilder待补充