JavaSE复习_3 继承

△先默认初始化,在显示初始化,在构造函数初始化

△继承的弊端:代码的耦合性增加了.

△子类不能继承父类的构造方法.

△子类会拥有父类的私有成员变量,但是必须通过get,set方法访问.

△super不是一个对象的引用,不能将super赋给另一个对象变量,它只是一个指示编译器调用超类方法的特殊关键字.

△如果子类没有显示的调用超类的构造器,则将自动的调用超类默认的构造器,如果超类没有不带参数的构造器,并且在子类的构造器中也没有显式的调用其他构造器,将会编译报告错误.

△顺序:

父类的静态成员赋值和静态块,默认初始化 (静态块和静态成员的顺序为,谁在前面谁先执行(在不出错的情况下)(父.class先加载,子.class再加载)

子类的静态成员和静态块 ,默认初始化

跳转到父类的构造方法,再跳到构造代码块.

父类的成员赋值和初始化块

父类的构造方法中的其它语句

子类的成员赋值和初始化块

子类的构造方法中的其它语句

父类静态代码块--子类静态代码块--父类构造代码块--父类构造方法--子类构造代码块--子类的构造方法.

△子类中的有参构造函数和空参构造函数都默认为访问父类的空参构造函数.子类重写父类方法的时候,访问权限不能更低.父类静态方法只能在子类中由子类所覆盖.

方法重载:本类中出现的方法名一样,参数列表不同的方法,与返回值无关

方法重写:子类重写父类的方法,与返回值有关,必须相同或者是子父类

△final所修饰的变量要不然直接显示初始化,要不然采用构造函数初始化和构造代码快初始化.

△动态绑定:在运行的时候确定所需要调用的方法.虚拟机一定调用与x引用对象实际类型最合适的那个类的方法.静态绑定当且仅当方法关键字为private,static,final的时候采用,编译器将可以准确的知道应该调用哪个方法.

△父类引用的成员变量是父类的成员变量

父类引用使用子类方法:编译看左边,运行看右边,动态绑定.子类方法中的父类变量仍然要看子类有没有重写该变量,子类方法的变量隐式参数是this.

子父类的静态方法:编译看左边,运行也看左边.

△子类重写父类的方法的时候,有一种特殊的情况,即super.show().此时,调用的是父类的show方法,而不是覆盖重写后的子类的show方法.因为,super指向的是父类空间.

△Java7新特性:Objects类.

static boolean equals(Object a,Object b):判断两个对象是否相等,使用的是对象a的equals方法.

static int hash(Object...objects):返回一个散列码,由提供的所有对象的散列码组合得到.(很实用,可以在覆盖equals和hashcode方法的时候根据equals用到的成员变量便捷覆盖hashcode方法).也可以用这个方法调用Objects.hash(7)便捷获得基本数据类型的hashcode.

△对于equals方法的覆盖,应该遵循两个原则:

  • 如果子类拥有自己的相等概念,那么对称性需求将强制采用getclass进行检测.
  • 如果由超类决定相等的概念,可以使用instanceof并对超类的类名进行检测,这样可以在不同的子类之间进行相等的比较,并且将父类的equals方法声明为final.

△getClass是指运行时类,因此父类引用指向子类对象的时候,所得的getclass是子类的class对象

△Instance of 判断引用是否指向后面的数据类型..

△父类属性存储方式是在堆中的子类对象里面分配空间

一个对象的实例化过程:

Person p=new Person();

1.jvm会读取指定路径下的Person.class文件,并加载进内存,并会加载Person的父类

2.在堆内存中开辟空间,分配内存地址。

3.并且在对象空间中,对对象的属性进行默认初始化。

4.调用相应的构造函数进行初始化。先进子类构造函数,在子类构造函数中,第一行会调用父类构造函数进行初始化,父类初始化完毕后(先显示初始化在构造函数初始化),再对子类属性进行显示初始化,然后调用子类构造函数进行特定的初始化。

5.将地址赋给相应的变量。

△对于父类的方法覆盖时,方法签名必须相同,返回值也必须相同或者为子类也可以.

△对象引用的类型转换:1).只能在继承层次内进行类型转换2).在超类转化为子类之前应该使用instanceOf进行检查

时间: 2024-10-14 14:57:48

JavaSE复习_3 继承的相关文章

JavaSE复习日记 : 继承关系和super关键字

/* * 类的继承和super关键字 * * 软件开发的三大目的: * 可拓展性; * 可维护性; * 可重用性; * * 这里单说下可重用性这一项: * 为了代码复用,复用方式有: * 函数的调用复用; * 类的实例化复用,类直接的复用; * 类的继承复用; * 前两个我都有发过,这里就说一下类的继承,以及继承中用的较多的关键字:super; * * * 首先要先了解什么是继承? * 继承,用人认知的角度说的话就好比一个父亲的东西由他的几个儿子来继承,也就是有了父亲的东西,同时也有自己的东西-

JAVASE复习

top 暑假每天中午更新 六花酱赛高 目录: 内部类 枚举类 垃圾回收 修饰符 与运行环境交互 内部类: 1. 外部类可以通过非静态内部类对象访问内部类的private属性,内部类可以直接访问外部类的private属性,说明外部类和内部类都是在“一个类中”,这样才能相互访问到对方的private属性 2. 非静态内部类的实例化:new Outer().new Inner();//这个很好理解,Inner需要用outer对象来实例化,Inner的命名空间是Outer 3. 静态内部类的实例化: n

javaSE复习之——线程

线程其实就是程序执行的一条路径,一个进程中可以包含多条线程,多线程并发执行可以提高程序效率,可以同使完成多项任务 多线程的应用场景 迅雷多线程一起下载 服务器同时处理多个客户请求 多线程原理(单核CPU) 在电脑上运行多个程序时,其实cpu一次只能做一个事,做一段时间后然后换另一个另一个做一段时间,只是cpu的速度太快了,看起来就是同时做很多事,也就是说多线程其实只是表面上的多线程,底层cpu还是一次只能做一个事,但是这有个前提,那就是那个cpu是单核cpu,如果事多核cpu,那么就可以真正的达

JavaSE复习总结之集合(Collection)

Java早期版本只给集合类库提供了很少的一组类,但是随着Java版本的升级,Java集合类库越来越充实.集合类库里面存放的,是各式各样的数据容器,我们基本都学过数据结构这门课,数据结构所讲的就是ADT(抽象数据模型)的部分,数据结构不是针对于某一门语言,它所讲的通常是对各语言都通用的ADT部分,ADT和具体实现是没有关系的.但是根据教材.根据各专业的不同,各专业会选用使用不同编程语言实现的教材.而我们所讲的,就是如何使用Java数据容器,即Java集合(用Java实现的ADT),具体的实现部分,

JavaSE复习日记 : 抽象类

/* * 抽象类 * 抽象: * 面向对象的三大核心思想; * 封装: 封装,ppp是封装的一部分 * 继承; * 多态: 父类的引用指向子类的对象 * 引用: 是指一个引用型变量 * 有哪些变量? * 成员变量; * 构造方法的局部变量; * 普通方法的局部变量; * 立马声明立马使用的变量; * 静态变量; * 什么是抽象类? * 就是用abstract关键字修饰的类就叫抽象类; * 什么是抽象方法? * 没有方法体的方法叫抽象方法,连{}都没有;抽象方法必须在修饰符列表中加上abstrac

JavaSE复习日记 : 接口

/* * 接口 * 引用数据类型: * 类,接口,数组; * * 接口是一种引用数据类型,可以看作是一个特殊的类,它存在的目的是为了解决没有多重继承引起的功能弱的问题而设计的,一个类只能有一个父类,但是这个类却可以实现多个接口; * * 接口还可以看作是只有抽象方法的类,即接口的所有方法都必须被实现; * 接口声明的关键字是interface,代替了class;而普通类的继承关键字extends也变成了implements(实现); * 但是其作用和普通类中是一样的,只不过是为了区分而已; *

JavaSE 复习

这里分享一下学JavaSE 用的教材 高宏静的 <Java从入门到精通>,每一章都是一个单独的PDF用来复习JavaSE该是够了. 链接: http://pan.baidu.com/s/1ntyrDMx 密码: 6htz

JavaSE复习一

一.属性和局部变量的相同点和不同点 `1.1 相同点:都是声明在类的内部 1.2 不同点:属性在方法外,局部变量在方法内. 属性是跟随类创建的时候一起创建,而局部变量只有在类调用的时候才会开辟相应的内存空间进行创建. 二.Object类 2.1 equals的使用: Person类 public class Person { private String name; private int age; public String getName() { return name; } public

C# 基础知识复习(六)---继承

继承允许我们根据一个类来定义另一个类,这使得创建和维护应用程序变得更容易.同时也有利于重用代码和节省开发时间. using System; namespace InheritanceApplication { class Shape { public void setWidth(int w) { width = w; } public void setHeight(int h) { height = h; } protected int width; protected int height;