Java进阶的第一天大集合
第一章 复习回顾
如何定义类
- 类的定义格式:
修饰符 class 类名{
// 类中的五大成分。之前学习三个成分
// 1.成员变量(属性)
// 2.成员方法 (行为)
// 3.构造器 (初始化类的对象数据的)
}
- 如何通过类来创建对象
类名 对象名称 = new 类名();
封装
- 使用private关键字来修饰成员变量
- 使用public关键字来修饰大多数成员方法
构造器
- 概念:理解成构造方法也可以,通过调用一个构造器可以返回一个类的对象,构造器同时负责帮助我们把对象的数据(属性和行为等信息)初始化
- 格式;
修饰符 类名(形参列表) {
// 构造体代码,执行代码
}
this关键字
- this出现在实例方法中,谁就调用这个方法,(哪个对象调用这个方法),this就代表谁
匿名对象
-
概念:就是指没有名称的对象。创建对象时,只有创建对象的语句,却没有把对象地址值赋值给某个变量。虽然是创建对象的简化写法,但是应用场景非常有限。
-
匿名对象的局限性
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wuFp2SzO-1614439024282)(d:\我的文档\桌面\java s tudy\java进阶\day01【复习回顾,继承,抽象类】\笔记\imgs\匿名对象局限性内存图解.jpg)]
- 说明:每使用一次new,在堆内存里都会创建一个新的内存空间,所以匿名对象只能针对对象使用一次时可以使用,当对象多起来的时候,它不再适用
继承
-
继承引入:面向对象语言三大基本特征:
封装(private)、继承(extends)、多态
Java中的类是描述生活中的任何事物的。而在生活中任何事物之间必然会存在一些联系。那么我们在前面学习的过程中,仅仅只是在描述单个的事物,并没把握事物和事物之间的关系。
接下来我们要研究的是如何通过Java中的类,展示所描述的事物和事物之间的关系。
一般事物和事物之间会有继承的关系。在Java中我们的类就是描述事物的,那么也就是说我们的类之间也应该存在继承的关系。
-
继承的好处:提高了代码的复用性
继承的相关规则:
-
并不是父类的所有内容都可以给子类继承的:
子类不能继承父类的构造器,因为子类有自己的构造器。
值得注意的是子类可以继承父类的私有成员(成员变量,方法),只是子类无法直接访问而已,可以通过getter/setter方法访问父类的private成员变量。
class Fu { public int num1 = 10; private int num2 = 20; public void show1() { System.out.println("show1"); } private void show2() { System.out.println("show2"); } public int getNum2() { return num2; } public void setNum2(int num2) { this.num2 = num2; } } class Zi extends Fu { } public class Demo03 { public static void main(String[] args) { Zi z = new Zi(); System.out.println(z.num1); // System.out.println(z.num2); // 私有的子类无法使用 // 通过getter/setter方法访问父类的private成员变量 System.out.println(z.getNum2()); z.show1(); // z.show2(); // 私有的子类无法使用 } }
-
Java中只能实现单继承,不支持多继承
//一个类只能有一个父类,不可以有多个父类。 class C extends A{} //ok class C extends A,B... //error
-
Java支持多重继承
解决继承后成员变量重名的情况
- 明确this和super所指的变量情况即可
解决继承后成员方法重名的情况
- 那么jvm将会调用子类中的方法,也叫方法重写
继承后构造器的特点
- 首先我们要回忆两个事情,构造器的定义格式和作用。
- 构造器的名字是与类名一致的。所以子类是无法继承父类构造方法的。
- 构造器的作用是初始化对象成员变量数据的。所以子类的初始化过程中,必须先执行父类的初始化动作。子类的构造方法中默认有一个
super()
,表示调用父类的构造方法,父类成员变量初始化后,才可以给子类使用。(先有爸爸,才能有儿子)
- 继承后子类构造器特点:子类所有构造器的第一行都会先调用父类的无参构造器,再执行自己
方法重写
- 概念:子类中出现与父类一模一样的方法时(返回值类型,方法名和参数列表都相同),会出现覆盖效果,也称为重写或者复写。声明不变,重新实现。
- 使用@Override:
- @Override:注解,重写注解校验!
- 这个注解标记的方法,就说明这个方法必须是重写父类的方法,否则编译阶段报错。
super(…)和this(…)
- 其完成用法:
this.成员变量 -- 本类的
super.成员变量 -- 父类的
this.成员方法名() -- 本类的
super.成员方法名() -- 父类的
super(...) -- 调用父类的构造器,根据参数匹配确认
this(...) -- 调用本类的其他构造器,根据参数匹配确认
抽象类
-
特征:抽象类的特征总结起来可以说是 有得有失
有得:抽象类得到了拥有抽象方法的能力。
有失:抽象类失去了创建对象的能力。
-
注意事项:
- 抽象类不能创建对象,如果创建,编译无法通过而报错。只能创建其非抽象子类的对象。
- 抽象类中,可以有构造器,是供子类创建对象时,初始化父类成员使用的。
- 抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
- 抽象类的子类,必须重写抽象父类中所有的抽象方法,否则子类也必须定义成抽象类,编译无法通过而报错。
- 抽象类存在的意义是为了被子类继承,抽象类体现的是模板思想。
。
2. 抽象类中,可以有构造器,是供子类创建对象时,初始化父类成员使用的。
3. 抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
4. 抽象类的子类,必须重写抽象父类中所有的抽象方法,否则子类也必须定义成抽象类,编译无法通过而报错。
5. 抽象类存在的意义是为了被子类继承,抽象类体现的是模板思想。