1、static修饰的变量叫做“静态变量”(静态变量,被存储在方法区中,所有的java对象共享静态变量,所有静态变量是类级别的,使用“类名.”的方式访问。),static修饰的方法叫做“静态方法”(静态方法中不能够直直接访问非静态数据。工具类中的方法大部分都是静态方法。 ),static还可以定义静态语句块。(静态语句块的语法为:static{java语句},静态语句块在类中可以有一个,也可以有多个。静态语句块在类加载的阶段执行,并且执行一次。并且(如果有多个静态语句块)是自上而下依次执行。)
- 实例语句块在每次调用构造方法之前执行,且(如果有多个实例语句块)是自上而下依次执行。语法:{java语句}。
- 静态的方法按照正规的方式“类名.”访问,静态的方法也能够使用“引用.”访问。(编译阶段会检查出引用的类型,编译通过,运行的时候,仍然使用“类名.”的方式去访问,静态方法执行不需要对象。)
- 成员变量在创建对象的时候初始化,静态变量在类加载阶段赋值,并且只赋值一次。
- 什么是设计模式:设计模式是可以重复利用的解决方案,从结构上可以分为三类:创建型、结构型和行为型。最简单的设计模式是单例设计模式:为了保证JVM中某一个类型的java对象永远只有一个,节省内存的开销。实现懒汉式单例设计模式的简单方式:将构造方法私有化,并对外提供一个公开获取这个类的对象的方法(该方法为静态方法,采用(类名.)的方式调用。),以及在类中提供一个这个类类型的静态变量。(懒汉式用到对象的时候才会创建。)(==两边如果是基本数据类型,可以比较这两个基本数据类型是否相等,==两边如果是引用数据类型,则比较的是内存地址。)
- 饿汉式单例设计模式:在类加载时已经创建单例对象。
2、引用类继承最基本的作用是代码重用。语法:[修饰符] class 子类名 extends 父类名。
- java语言中,类和类之间只支持单继承。一个类如果没有显示的继承其他类,则该类默认继承Object。Object是SUN提供的java中的根类。(继承是面向对象的重要概念,软件中的继承和现实中的继承概念是一样的)
- java语言中子类继承父类,会将父类中所有数据全部继承(构造方法无法被子类继承),包括私有的也能够继承过来,但是在子类中无法直接访问父类中的私有的数据,但是可以间接访问。(通过setter和getter方法访问和修改私有数据)
- 方法的覆盖或者说是方法的重写:(override或者overwrite)如果父类中的方法无法满足当前子类中的业务需求,需要将父类中的方法进行重新写一遍。(如果子类重写父类中的方法之后,子类对象一定调用的是子类重写的方法)。
- 发生方法覆盖的条件:1、发生在具有继承关系的两个类之间;2、具有相同的方法名、相同的返回值类型、相同的参数列表;3、重写的方法不能比被重写的方法拥有更低的访问权限;4、重写的方法不能比被重写的方法抛出更宽泛的异常;5、私有的方法不能被覆盖;6、构造方法无法被覆盖,因为构造方法无法被继承;7、静态的方法不存在覆盖;8、覆盖指的是成员方法,和成员变量无关。(继承最基本的作用是代码重用,最重要的作用是方法可以重写。)
3、java语言中向上转型(upcasting,子类转父类)和向下转型(downcasting,父类转子类),无论是向上转型还是向下转型,两个类之间必须要有继承关系。
- 向上转型又称为自动类型转换,父类型的引用指向子类型的对象(如Animal a = new Cat();),程序分为编译阶段和运行阶段两个阶段,编译阶段只知道a是一个Animal类型,而程序在运行的时候堆中实际对象是Cat类型。(a.eat();)程序在编译阶段a被编译器看作是Animal类型,所以程序在编译阶段a因哟i功能绑定的是Animal类中的eat方法(静态绑定);而程序在运行的时候堆中的实际对象是Cat类型,而Cat已经重写了eat方法,所以程序在运行阶段对象绑定的方法是Cat中的eat()方法。(动态绑定)
- 向下转型又称之为强制类型转换。(需要注意,Animal a = new Dog();Cat c = (Cat)a;编译阶段能够通过,但是程序在运行期可能会出错,会报java.lang.ClassCastException异常,所以在做强制类型转换的时候是存在风险的。)
- 为了避免ClassCastException的发生,java引入了instanceof。用法:instanceof运算符结果是boolean类型。(Cat a = new Cat();if(a instanceof Cat){Cat c = (Cat)a};如果结果是true,a引用指向堆中的java对象是Cat类型。)
- 多态的作用:项目的耦合度降低,项目的扩展能力增强。(尽量不要面向具体编程,面向父类型进行编程,面向抽象编程)
4、super不是引用类型,super中存储的不是内存地址,super指向的不是父类对象,而是代表当前子类对象中的父类型特征。
- 什么时候使用super?父类和子类中都有某个数据或者相同的方法,如果要在子类中访问父类中的属性或者方法,需要使用(super.)的方式。
- super可以使用在什么地方?super可以在成员方法中;(super和this相同,都不能直接用在静态上下文中)
- super关键字用在构造方法中,语法为:super(实参);,通过子类的构造方法去调用父类的构造方法,作用是给当前子类对象中的父类型特征赋值。(如果一个构造方法第一行如果没有this(...);也没有显式地调用super(...);系统会默认调用super();)。super(...);的调用只能够放在构造方法的第一行中,和this(...);一样,所以this(...);和super(...);不能共存。
- 需要注意的是,super(...)调用了父类的构造方法,但是并不会创建父类对象。(构造方法执行不一定创建对象)
- 在java语言中,只要是创建了java对象,那么Object中的无参数构造方法一定会执行。
- 父类的构造方法并不会被子类继承,但是可以被子类调用。(单例模式的类型无法被继承,即单例模式的类型没有子类。原因是单例模式构造方法私有化,子类的构造方法无法使用super();调用父类的私有构造方法。)
5、final修饰的类无法被继承,final修饰的方法无法被覆盖,final修饰的局部变量一旦赋值,不可再改变,final修饰的成员变量必须“显式的”初始化。class A{final int i;}编译无法通过。(要么final修饰的成员变量手动初始化,要么在构造方法调用结束之前赋值也行。如class A{final int i = 1200}或者class A{final int = k; A(){k = 1200;}} )(一般情况下,final修饰的成员变量一般和static连用,称之为常量。)
- 常量为值不可改变的变量,要求所有的常量大写。
6、如何定义抽象类:class关键字前加上abstract。(抽象类无法被实例化,即抽象类无法创建对象。)
- 虽然抽象类没有办法实例化,但是抽象类也有构造方法,该构造方法是给子类创建对象使用的。
- 抽象类中可以定义抽象方法,抽象方法的语法为:在方法的修饰符列表中添加abstract关键字,并且抽象方法应该以“;”结束,不带“{}”。(例如:public abstract void m();)
- 抽象类中不一定有抽象方法,但是抽象方法必须出现在抽象类中。
- 一个非抽象类继承一个抽象类,必须将抽象类中的抽象方法覆盖。
- 抽象类不能被final修饰;抽象方法不能被final修饰。(显示为非法的修饰符组合)
- final修饰的引用类型,该引用不可再重新指向其他的java对象,但是final修饰的引用,该引用指向
的对象的属性是可以修改的。
7、接口也是一种引用类型,可以等同看作类。
- 如何定义接口,语法为:[修饰符] interface 接口名{}(需要注意的是,接口中只能够出现常量和抽象方法)
- 接口其实是一种特殊的抽象类,特殊在于接口是完全抽象的。
- 接口中也没有构造方法,是无法被实例化的。
- 接口和接口之间可以进行多继承。
- 一个类可以实现多个接口。(一个类实现一个接口,需要使用implements关键字,implements和extends意义相同,这里的实现可以等同看作继承。),一个非抽象的类实现接口,需要将接口中的所有的方法“实现”。(或者说是重写)
- 在接口中常量用public static final修饰,public static final可以省略。接口中所有的抽象方法都是public abstract,public abstract可以省略。
- 接口的作用:1、可以使项目分层,所有层都面向接口开发,开发效率提高;2、接口使代码和代码之间的耦合度降低,就像内存条和主板的关系,变得“可插拔”,可以随意地切换。
- 接口和抽象类都能完成某个功能,优先选择接口。(因为接口可以多实现,多继承,并且一个类除了实现接口之外,还可以去继承其他类,保留了类的继承。)