文章目录
内容介绍
- ArrayList集合
- static关键字
- 集成
- this和super关键字
ArrayList集合
特点:
查询效率高,增删效率低,线程不安全。
由于数组的长度不可变,所以需要使用集合。
ArrayList可以看做是一个长度可以变的数组。
ArrayList类封装了一个可动态改变大小的Object类型的数组,每个ArrayList都有一个表示其自身容量的数值,但是效率并没有数组高,ArrayList可以添加,删除和修改元素,并且其大小可动态改变。
ArrayList <引用数据类型> 变量名 = new ArrayList <引用数据类型>();
容器相关类都定义了泛型,我们在开发和工作中,在使用容器类时都要使用泛型。这样,在容器的存储数据、读取数据时都避免了大量的类型判断,非常便捷。
泛型:
ArrayList:,表示一种指定的数据类型,叫做泛型。E,取自Element(元素)的首字母,用于限定集合中的元素类型。
例子:
存储String类型的元素
ArrayList list = new ArrayList();
存储int类型的数据
ArrayList list = new ArrayList();
存储Phone类型的数据
ArrayList list = new ArrayList();
泛型:就是上方的<引用数据类型>
包装类
Java是一种面向对象的编程语言,他提供了8种基本数据类型。但是,这8种基本数据类型并不符合面对对象的编程机制,因为基本数据类型并不具有对象所具有的属性,方法,构造方法等特性。
Java提供了对8种基本数据类型的“包装”,称为包装类。包装类符合对象的特征,对基本数据类型进行了封装,提供了一些必要的属性和方法,满足了面对对象编程的要求,每种基本数据类型都要有一个包装类与之相对应。
四类八种引用数据类型在进行元素添加时,可以在add方法中直接写入。
基本数据类型 | 对应的引用数据类型表示形式 |
---|---|
byte | Byte |
short | Short |
Int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
JDK中有一种机制,自动装箱和自动拆箱。
- 自动装箱:将基本数据类型封装成引用数据类型
- 自动拆箱:将引用数据类型拆封为基本数据类型
使用包装类需要进行实例化操作,语法如下:
包装类 类变量 = new 包装类(初始化值);
常用方法
add(Object obj):
- 向数组末尾添加元素
remove(int index):
-
将制定索引位置的元素删除,返回值是当前删除的元素值
-
删除后的元素索引也消失了
-
如果你要删除的元素并没有存在,会报数组越界异常
remove(Object o)
- 从列表中删除指定元素的第一个出现(如果存在)。
- 返回的是一个boolean的值
get(int index):
-
获得当前数组的索引
-
使用for循环可以进行集合的遍历
-
如果你要获得的元素并没有存在,会报数组越界异常
size():
- 集合的大小
clear():
- 清空集合,集合依然存在,其内容为空
数据共享
static关键字
定义格式:
static 数据类型 变量名;
类变量的生命周期和类相同,在整个应用程序执行期间都有效。
static定义的变量也是会有初值的。
static关键字可以修饰变量、方法以及程序员。当static修饰类的成员变量时,那么该成员变量称为类变量,也称为静态变量,与之相对,非static修饰的成员变量称为实例变量。
-
对于该类的所有对象来说,static成员变量只有一份,该类被所有对象共享。
-
一般用“类名.类属性/方法”来调用。
-
不建议用对象的方式调用静态变量(会浪费内存)
-
在static方法中不可以直接访问static成员。
注意事项:
- 静态内容优先于对象存在,只能访问静态,不能使用this/super。静态修饰的内容存于静态区。
- main方法为静态方法仅仅只是作为程序执行入口,它不属于任何一个对象,可以定义在任意类中。
- 同一个类中,静态成员只能访问静态成员(静态不能访问非静态)。
静态代码块
静态代码块是定义在成员位置,使用static修饰的代码块。
特点:
-
它优先于主方法执行、优先于构造代码块执行,当以任意形式第一次使用到该类时执行。
-
该类不管创建多少对象,静态代码块只执行一次。
-
可用于给静态变量赋值,用来给类进行初始化。
public class Person { private String name; private int age; //静态代码块 static{ System.out.println("静态代码块执行了"); } }
继承(extends)
在程序中,如果想声明一个类继承另一个类,需要使用extends关键字。
格式:
class 子类 extends 父类 {}
-
1.父类也称作超类、基类、派生类等。
-
2.Java中只有单继承,没有像C++那样的多继承。多继承会引起混乱,使得继承链过于复杂,系统难于维护。也就是说一个类只能有一个直接父类。
-
3.Java中类没有多继承,接口有多继承,类只有单继承。
-
4.子类继承父类,可以得到父类的全部属性和方法 (除了父类的构造方法),但不见得可以直接访问(比如,父类私有的属性和方法)。
-
5.如果定义一个类时,没有调用extends,则它的父类是:java.lang.Object。
-
静态跟类走,所以也是可以进行继承的。
-
可以多个类继承一个父类。
-
可以进行多层继承,即一个类的父类可以再去继承另外一个父类。
好处:
- 调高了代码的复用性,提高软件开发效率
- 继承的出现让类与类之间产生了关系,提供了多态的前提
重写
子类通过重写父类的方法,可以用自身的行为替换父类的行为。
当子类需要父类的功能,而功能主题子类有自己的特有的内容时,可以重写父类中的方法,这样即沿袭了父类的功能,又定义了子类特有的内容。
当一个类是另一个类中的一种时,可以通过继承来继承属性和方法。如果父类具备的功能内容需要子类的特殊定义时,进行方法的重写。
方法的重写需要符合下面的三个要点:
1.“==”: 方法名、形参列表相同。
2.“≤”:返回值类型和声明异常类型,子类小于等于父类。
3.“≥”: 访问权限,子类大于等于父类。
super关键字
-
super是直接父类对象的引用。可以通过super来访问父类中被子类覆盖的方法或属性。
-
使用super调用普通方法,语句没有位置限制,可以在子类中随便调用。
-
若是构造方法的第一行代码没有显式的调用super(…)或者this(…);那么Java默认都会调用super(),含义是调用父类的无参数构造方法。这里的super()可以省略。
this关键字构造方法的使用
在一个类之中可以使用this关键字进行调用构造方法
构造方法调用格式:
this(参数列表);
构造方法的调用:
class Person {
// Person的成员属性
private int age;
private String name;
// 无参数的构造方法
Person() {
}
// 给姓名初始化的构造方法
Person(String nm) {
name = nm;
}
// 给姓名和年龄初始化的构造方法
Person(String nm, int a) {
// 由于已经存在给姓名进行初始化的构造方法 name = nm;因此只需要调用即可
// 调用其他构造方法,需要通过this关键字来调用
this(nm);
// 给年龄初始化
age = a;
}
}
this的原理图解
class Person {
private int age;
private String name;
Person() {
}
Person(String nm) {
name = nm;
}
Person(String nm, int a) {
this(nm);
age = a;
}
}
class PersonDemo {
public static void main(String[] args) {
Person p = new Person("张三", 23);
}
}
说明:
1、先执行main方法,main方法压栈,执行其中的new Person(“张三”,23);
2、堆内存中开辟空间,并为其分配内存地址0x33,,紧接着成员变量默认初始化(name=null age = 0);
3、拥有两个参数的构造方法(Person(String nm , int a))压栈,在这个构造方法中有一个隐式的this,因为构造方法是给对象初始化的,那个对象调用到这个构造方法,this就指向堆中的那个对象。
4、由于Person(String nm , int a)构造方法中使用了this(nm);构造方法Person(String nm)就会压栈,并将“张三”传递给nm。在Person(String nm , int a)构造方法中同样也有隐式的this,this的值同样也为0x33,这时会执行其中name = nm,即把“张三”赋值给成员的name。当赋值结束后Person(String nm , int a)构造方法弹栈。
5、程序继续执行构造方法(Person(String nm , int a)中的age = a;这时会将23赋值给成员属性age。赋值结束构造方法(Person(String nm , int a)弹栈。
6、当构造方法(Person(String nm , int a)弹栈结束后,Person对象在内存中创建完成,并将0x33赋值给main方法中的p引用变量。
this到底代表什么呢?this代表的是对象,具体代表哪个对象呢?哪个对象调用了this所在的方法,this就代表哪个对象。
调用其他构造方法的语句必须定义在构造方法的第一行,原因是初始化动作要最先执行。
super关键字构造方法的使用
this和super都必须在第一行,所以只能选择一个
调用本类中的构造方法
this(实参列表);
调用父类中的空参数构造方法
super();
调用父类中的有参数构造方法
super(实参列表);
当父类中没有空参数构造方法时,子类的构造方法必须有显示的super语句,指定要访问的父类有参数构造方法。
类中的构造方法默认第一行都有隐式的super()语句,在访问父类中的空参数构造方法。所以父类的构造方法既可以给自己的对象初始化,也可以给自己的子类对象初始化。