Day005(ArrayList集合、数据共享、继承、重写、super、this)

内容介绍

  • 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方法中直接写入。

基本数据类型对应的引用数据类型表示形式
byteByte
shortShort
IntInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

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);
	}
}

this.png

说明:

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()语句,在访问父类中的空参数构造方法。所以父类的构造方法既可以给自己的对象初始化,也可以给自己的子类对象初始化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值