Java基础
1、java 发展历史
1995年Sun公司发布Java1.0版本。
2004年发布Java1.5版本。
2014年发布Java1.8版本。
这几个版本都是变动比较大的版本。
2、字节
- 字节是我们常见的计算机中最小存储单元
- 8个bit(二进制位)0000-0000表示为1个字节,写成1byte或者1B。
8bit=1B
1024B=1KB
1024KB=1MB
1024MB=1GB
1024GB=1TB
3、标识符
- 概念:我们自己定义的内容
- 命名规则:硬性要求
标识符可以包含英文字母26个(区分大小写)、0-9数字、$(美元符号)和_(下划线)。
标识符不能以数字开头。标识符不能是关键字。
命名规范:软性建议
类名规范:首字母大写,后面每个单词首字母大写(大驼峰式)。
方法名规范:首字母小写,后面每个单词首字母大写(小驼峰式)。
变量名规范:全部小写
4、常量分类
- 整数常量
- 小数常量
- 字符常量
- 字符串常量
- 布尔常量
- 空常量
5、变量
- 分类
- 基本数据类型
6、类型转换
byte;short;char 在做计算的时候会自动提升为int类型
public static void main(String[]args){
int i=1;byte b=2;
//byte x=b+i;//报错
//int类型和byte类型运算,结果是int类型
intj=b+i;
System.out.println(j);
}
7、运算符
public static void main(String[]args){
int i=(1==2?100:200);
System.out.println(i);//200
int j=(3<=4?500:600);
System.out.println(j);//500
/*
错误写法:1 左右数据类型不一致
int j=(3<=4?2.5:600);
2 三元运算符的结果必须被使用
3<=4?2.5:600
*/
}
8、选择结构swtich
- case中的值不能重复
- case中值的类型只能是byte,short,int,char,String,Enum
- switch具有穿透性:直到遇到第一个break才会结束执行
- case和default可以任意交换位置,并没有固定的顺序
9、方法
- 概念
- 方法要定义在类中,方法里面不能嵌套方法
- 方法定义的先后顺序无所谓
- 方法定义之后,不会立即执行,只有调用方法才会执行
- 方法有返回值要写return关键字,return的类型要和返回值的类型一致,但是逻辑代码不能写在return后面
- 一个方法中可以有多个return,但是必须保证方法只有一个return被执行到
- 重载
- 重载与修饰符无关
- 重载与参数的名称无关
- 重载与方法的返回值类型无关
- 重载的方法可以抛出不同的异常
- 重载只看参数的类型,个数或者多类型顺序
10、数组
数组有两种初始化的方式:动态初始化和静态初始化
动态初始化:
a 数据类型[] 名称 = new 数据类型[数组的长度];
b 数据类型[] 名称;
名称 = new 数据类型[数组的长度];
静态初始化:
a 数据类型[] 名称 = new 数据类型[]{具体的内容并且以逗号分隔开};
b 数据类型[] 名称 = {具体的内容};
c 错误写法:
数据类型[] 名称;
名称 = {};
注:动态初始化和静态时数组会默认值(静态初始化替换了数据)
a 整形 0
b 浮点型 0.0
c 字符型 ‘u0000’
d 布尔类型 false
e 引用类型 null
11、java中的内存区域划分
- 栈内存(Stack):存放的都是方法的局部变量,方法的运行一定要在栈当中。
局部变量:方法的参数,或者是方法{}内部的变量。
作用域:一旦超出作用域,立刻从栈内存当中消失。 - 堆内存(Heap):凡是new出来的东西都在堆内存中。
堆内存里面的数据都有一个地址值:16进制
堆内存里面的数据都有默认值:
a 整形 0
b 浮点型 0.0
c 字符型 ‘u0000’
d 布尔类型 false
e 引用类型 null - 方法区(Method Area):存储.class相关的信息,包含方法的信息。
- 本地方法栈(Native method Stack):与操作系统有关。
- 寄存器(pc Register):与CPU相关。
- 此图正摘自(https://blog.csdn.net/qq_26496915/article/details/76326614)
12、类与对象
1. 成员变量和局部变量的区别
在类中的位置不同(重点)
成员变量:类中,方法外
局部变量:方法中或者方法声明上(形式参数)
作用范围不一样(重点)
成员变量:类中
局部变量:方法中初始化值的不同重点
成员变量:有默认值
局部变量:没有默认值。必须先定义,赋值,最后使用
在内存中的位置不同(了解)
成员变量:堆内存
局部变量:栈内存
生命周期不同(了解)
成员变量:随着对象的创建而存在,随着对象的消失而消失
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
13、String类
- 字符串的常用的创建方式
//第一种方式(创建一个空字符串)
String s1 = new String();
//第二种方式
String s2 = new String("abc");
//第三种方式
String s3 = new String(char[]);
//第四种方式
String s4 = new String(byte[]);
//第五种方式(这种方式并不是没有new对象,而是jvm自动帮我们new了)
String s5 = "abc";
-
字符串的特点
a 字符串的内容不可改变(final修饰)
b 内容可以被共享使用
c 字符串效果上相当于char[]类型的数组,但是底层用byte[]实现 -
字符串的常量池
由此引出的一些问题:参考 String的对象创建问题
文章中说明了对象创建的问题。 -
字符串的比较
String s = "abc";
//推荐写法
System.out.println("abc".equals(s));
//不推荐写法(如果s为null,则会空指针异常)
System.out.println(s.equals("abc"));
14、static关键字
- static修饰成员变量,这个变量不再属于对象自己,而是属于所在的类,多个对象共享同一份数据。
- static修饰成员方法,此方法变成了静态方法,静态方法不属于对象,而是属于类,类名.方法名可以直接调用 。
注意 :a 无论是静态变量,还是静态方法,都推荐使用—>类名.什么<—的方式调用。
b 静态只能访问静态,不能访问非静态,原因是静态属于类,加载class就已经分配内存,但是此时非静态成 员还没有实例化,所以不存在,不存在的访问存在的当然不行。
c 静态方法中不能使用this关键字,因为this和对象有关,和类没有关系,而静态方法是属于类的。 - 关于内存的说明
public class MyTest {
public static void main(String[] args) {
User user = new User("张三", 14);
User.room("教室");
System.out.println(user);
}
}
class User {
int age;
static String room;
}
15、基本数据类型和包装类
- 装箱:Integer i = new Integer(1);
Integer i = Integer.valueOf(1);参数中放基本类型或者其对应的字符串"1"
拆箱:int a = i.intValue();
jdk1.5之后可以自动完成拆装箱的操作 - 字符串和基本数据类型之间的转换
转换为字符串:
String s = 200+"”;
String s = Integer.toString(200);
String s = String.valueOf(200);
转换为基本数据类型:
int i = Integer.parseInt(“1”);参数中放对应的字符串"1"
16、继承和抽象类
- 在继承关系中,如果成员变量重名,则创建子类对象时,访问方式有两种
a 直接通过子类对象访问成员变量:等号左边是谁,就优先找谁,如果没有则去父类找。
b 间接通过成员方法访问成员变量:方法属于谁就优先用谁,没有则去父类找。 - 继承关系中区分
局部变量:直接写变量名称;
成员变量:this.成员变量;
父类的成员变量:super.成员变量; - 继承关系中的成员方法如果重名,创建子类对象访问成员方法
创建的对象是谁就优先用谁,如果没有则去父类找。
注意:成员变量和方法,都是找不到去子类找。 - 方法的重写
a 必须保证父子类之间的方法名称相同,参数列表也相同。
b 子类方法的返回值必须小于等于父类方法的返回值。
c 子类方法的访问权限必须大于等于父类的访问权限。
应用场景:增加某项的功能。 - 父子类构造方法的访问特点
a 因为子类的构造方法时会有一个默认的“super()”,创建子类对象,先调用父类的构造方法,然后调用子类的构造方法。
b 子类可以通过super()调用父类的重载构造。(括号中可以填写参数代表有参构造)
c super调用父类构造,必须是子类构造方法中第一个语句,不能一个子类构造方法中多次super调用父类构造。
总结:子类构造方法必须调用父类的构造方法必须是第一个语句,不写就是默认super(),写了就使用指定的构造方法。 - super和this关键字
6.1 super关键字的三种用法
a 访问父类的成员方法。
b 访问父类的成员方法。
c 在构造方法中访问父类的构造方法。
6.2 this关键字的三种用法
a 访问本类的成员方法。
b 访问本类的成员变量。
c 在本类的构造方法中,调用自己的另外一个构造方法 this()
6.3 super与this的内存图
6.4 java继承的特点
6.5 抽象类和抽象方法
6.5.1 抽象方法:方法上加上abstract关键字,去掉大括号直接分号结束。
6.5.2 抽象类:抽象方法所在的类必须是抽象类,在class前面加上abstract关键,这个类就变成了一个抽象类。
17、接口
- 定义:接口就是一系列的公共规范。
- 接口是一种引用数据类型,最重要的额内容就是其中的:抽象方法,接口依然是一种.class文件。
- Java7接口中可以包含的内容有:
a 常量
概念:接口中可以定义的“成员变量”,但是必须使用public static final 修饰,效果上看,这就是接口的“常量”,并且必须赋值。
b 抽象方法
Java8还可以额外含有:
c 默认方法
格式:(public default 返回值类型 方法名称(参数列表){ 方法体})。
解决的问题:解决了接口升级的问题,比如新添加一个接口中的方法,不需要再对每个方法在其对应的实现类重写,默认方法会被实现类继承下来。
说明:接口中的默认方法,可以使用实现类直接调用,也可以被覆盖重写。
d 静态方法 (public static 返回值类型 方法名称(参数列表){ 方法体})
调用方式:不能使用实现类调用,因为一个类可能实现多个接口,多个接口中的静态方法可能会产生冲突,使用接口名.的方式。
Java9额外包含有:
e 私有方法
问题:我们需要抽取一个公共的方法用来解决默认方法之间的代码重复问题,但是方法不能被实现类使用,因此java9允许我们定义私有方法。
格式:普通方法的私有private 返回值类型 方法名称(参数列表){ 方法体 };
静态方法的私有private static 返回值类型 方法名称(参数列表){ 方法体 }。 - 接口中抽象方法的修饰符:固定的 public abstract
- 注意事项:第一,接口中不能有静态代码块;第二,接口中不能有构造方法;第三,一个类实现多个接口,接口中有重复的方法,只需要重写一次接口;第四,没有实现所有的抽象方法,这个类必须是一个抽象类;第五,多个接口中有冲突的默认方法,必须要进行重写;第六,如果父类和接口中的方法产生了冲突,优先使用父类的方法(类优先原则,接口的所有默认方法都会被忽略)。
- 【接口之间】可以多继承,如果父接口中有重复的抽象方法不需要管,默认方法需要重写,而且带上关键字default。
【类之间】只能【单继承】或者【多层继承】。
18、final,权限以及内部类
18.1 final
- 修饰类:不可被继承。
- 修饰方法:不能被重写。
- 修饰局部变量:对于基本类型来说,数据不可变;对于引用类型来说,是地址值不可变,但是引用类型里面的数据可以变。
- 修饰成员变量:也是不可变的,所以必须手动赋值或者通过构造方法赋值(所有的构造方法都赋值)。
18.2 权限修饰符
- public:所有人都能用。
- protected:同包及其子类可用。
- default:不是关键字,不写就是默认的,只有同包下才能用。
- private:只有自己能用。
18.3 内部类
具体参考:https://blog.csdn.net/weixin_42762133/article/details/82890555