1,java虚拟机的内存划分
| JVM的内存划分: | |
|---|---|
| 区域名称 | 作用 |
| 寄存器 | 给CPU使用,和我们开发无关。 |
| 本地方法栈 | JVM在使用操作系统功能的时候使用,和我们开发无关。 |
| 方法区 | 存储可以运行的class文件。 |
| 堆内存 | 存储对象或者数组,new来创建的,都存储在堆内存 |
| 方法栈 | 方法运行时使用的内存,比如main方法运行,进入方法栈中执行。 |
2,API的查看方法
1,搜索,2,查看包的路径,3,查看构造方法,4,查看方法摘要
3,String类
字符串的特点:
1,字符串的内容永不可变(重点),底层是一个final修饰的字节数组 2,因为字符串不可改变,所以字符串是可以共享使用的。 3,字符串效果上相当于是char[]字符串,但是底层是byte[]字节数组。
创建字符串的3+1种方式
public String() :创建一个空白字符串,不含有任何内容
public String(char[] array):根据字符数组的内容,来创建对应的字符串
public String(byte[] array):根据字节数组的内容,来创建对应的字符串
直接创建 String str="abcd";
且三种创建方式,创建的String都是对象
new出来的都在常量池中,直接创建的在堆当中
== 和 equals()
推荐写法 "abc".equals(str)
== 比较的是值
equals基本数据类型比较的是值
equals引用数据类型比较的是对象的地址值
常用api
equalsIgnoreCase(String str) //不区分大小写,比较字符串
int length():获取字符串当中含有的字符串个数
String concat(String str)将当前字符串和参数字符串拼接成为新字符串
char charAt(int index)获取指定索引位置的单个字符
int indexOf(String str):查找字符串在本字符串当中首次出现的索引位置,如果没有就是-1
String substring(int index)截取从参数位置到末尾,返回新字符串
String substring(int begin,int end)截取从begin,到end结束,返回新字符串
char[] toCharArray()将当前字符串拆分为字符数组
byte[] getBytes()获得当前字符串底层的字节数组
String replace(CharSequence oldString,CharSequence newString)将所有出现的老字符串替换成新的字符串,返回新字符串
CharSequence意思是可以接受字符串类型
String[] split(String regex):按照参数,将字符串切分成为若干部分,
split里面的参数其实是正则表达式
4static关键字
(1)类变量
当 static 修饰成员变量时,该变量称为类变量。该类的每个对象都共享同一个类变量的值。任何对象都可以更改该类变量的值,但也可以在不创建该类的对象的情况下对类变量进行操作。
(2)静态方法
当 static 修饰成员方法时,该方法称为类方法 。静态方法在声明中有 static ,建议使用类名来调用,而不需要创建类的对象。调用方式非常简单。 静态不能直接访问非静态 静态方法当中不能用this
(3)静态内存图
静态代码块
static{
//特点:当第一次用到本类时,静态执行唯一一次,且优先于非静态,用于一次性的对静态成员变量进行赋值
}
5,Arrays类
这是一个关于数组的类,有大量静态方法
常用API
static String toString(数组) 将参数数组变成字符串,
String void sort(数组) 按照默认升序对数组的元素进行排序
6,Math类
常用API
static double abs(double num);取绝对值
static double ceil(double num);向上取整
static double floor(double num);向下取整
static long round(double num);四舍五入
7,继承
(1)重写
1,父子之间的方法名相同,参数列表相同 2,子类返回值必须小于等于父类的返回值类型 3,子类方法的权限必须大于等于父类方法的修饰符 4,子类构造方法当中有一个默认的super()调用,所以是先父类构造,再子类构造 5,子类构造可以通过super关键字来调用父类重载构造。 6,super的父类构造调用,必须是构造方法的第一个语句,且只有一个。 7,方法可以重写,变量不能重写
(2)this的三种用法
1,在本类的成员 方法中,访问本类的成员变量。 2,在本类的成员方法中,访问本类的另一个成员方法。 3,在本类的构造方法中,访问本类的另一个构造方法。 4,this()调用也必须是构造方法的第一个语句。且为唯一一个 5,super和this两种构造调用,不能同事使用。
(3)访问成员变量的两种方式
1,直接通过对象名称访问成员变量,看等号左边是谁,就是谁,没有则向上找。 2,间接通过成员方法访问。看方法属于谁,优先用谁,没有就向上找。
8,接口
1,默认方法可以不用子类实现。 2,从jdk8开始,接口允许定义静态方法。 3,从jdk9开始,接口中允许定义私有方法,用于解决默认方法之间重复代码问题。 4,接口中可以有成员变量,但必须用public static finall,就是常量,一旦赋值,不可修改。 5,接口没有构造方法,所以无法实例化。 6,接口中可以有: 抽象方法、 默认方法、 静态方法、 私有方法。默认方法可以覆盖重写
9,面向对象
面向对象的三大特性:封装,继承,多态。 多态:一个对象有多个形态,比如小明既是学生,也是人。代码当中体现就是:父类引用指向子类对象
父类名称 对象 = new 子类名称();
(1)向上转型
多态本身是子类类型向父类类型向上转换的过程,这个过程是默认的。
父类类型 变量名 = new 子类类型();
(2)向下转型
向下转型:父类类型向子类类型向下转换的过程,这个过程是强制的。 为什么要向下转型?为了调用子类特有的方法。为了安全,应该用instanceof关键字判断一下。
10,final用法
final: 不可改变。可以用于修饰类、方法和变量。
类:被修饰的类,不能被继承。
方法:被修饰的方法,不能被重写。
变量:被修饰的变量,不能被重新赋值。
11,权限修饰符
12,内部类
1,成员内部类:定义在类当中的
2,局部内部类(包含匿名内部类):定义在方法之中的,局部内部类只能在当前方法中使用。
访问特点
1,外部类要访问内部类的成员,必须要建立内部类的对象。内部类可以直接访问外部类的成员,包括私有成员。 2,局部内部类如果要访问所在方法的局部变量,那么这个局部变量必须是(有效final的)原因:
1,new出来的对象在堆内存中,
2,局部变量是跟着方法走的,在栈内存中。
3,方法运行结束之后,立即出栈,局部变量立刻消失。
4,但是new出来的对象会在堆中持续存在,直到垃圾回收。
权限修饰符的使用
1,外部类:public/default 2,成员内部类:public/protected/default/private 3,局部内部类:什么都不写
匿名内部类(重点)
如果接口的实现类,(或者是父类的子类)只需要使用唯一的一次,
那么这种情况下可以省略掉该类的定义,而改为使用【匿名内部类】
匿名内部类的定义格式:
接口名称 对象名 = new 接口名称(){
//覆盖重写所有抽象方法
}
注意: (一)匿名内部类,在创建对象的时候,只能使用唯一一次。 (二)匿名对象,在【调用方法】的时候,只能调用唯一一次,如果希望同一个对象调用多次,则必须给对象取个名。 (三)匿名内部类省略了【实现类/子类名称】,但是匿名对象省略了对象名称,匿名内部类和匿名对象不一样