成员变量和局部变量的区别
A:在类中的位置不同
-
成员变量:在类中方法外
-
局部变量:在方法定义中或者方法声明上
B:在内存中的位置不同
-
成员变量:在堆内存(成员变量属于对象,对象进堆内存)
-
局部变量:在栈内存(局部变量属于方法,方法进栈内存)
C:生命周期不同
-
成员变量:随着对象的创建而存在,随着对象的消失而消失
-
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
D:初始化值不同
-
成员变量:有默认初始化值
-
局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。
注意事项:
-
局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则。
-
基本数据类型变量包括哪些:byte,short,int,long,float,double,boolean,char
-
引用数据类型变量包括哪些:数组,类,接口,枚举
封装
-
是指隐藏对象的属性和实现细节,仅对外提供公共访问方式
-
防止该类的代码和数据被外部类定义的代码随机访问
-
将抽象性函式接口的实现细节部份包装、隐藏起来的方法
-
隐藏实现细节,提供公共的访问方式
-
提高了代码的复用性
-
提高安全性
-
将不需要对外提供的内容都隐藏起来
-
把属性隐藏,提供公共方法对其访问
构造方法
-
给对象的数据(属性)进行初始化
-
方法名与类名相同(大小也要与类名一致)
-
没有返回值类型,连void都没有
-
没有具体的返回值return
注意事项:
子类中所有的构造方法默认都会访问父类中空参数的构造方法。因为子类会继承父类中的数据,可能还会使用父类的数据,所以,子类初始化之前,一定要先完成父类数据的初始化。
每一个构造方法的第一条语句默认都是:super() Object类最顶层的父类。
继承
-
让类与类之间产生关系,子父类关系
-
让类与类之间产生了关系,是多态的前提
-
提高了代码的复用性
-
提高了代码的维护性
-
类的耦合性增强了(开发的原则:高内聚,低耦合。耦合:类与类的关系,内聚:就是自己完成某件事情的能力)
-
java里面的继承是单继承,不支持多继承
-
所有类都直接或者间接继承Objcet类
特点:
-
如果想用这个体系的所有功能用最底层的类创建对象
-
如果想看这个体系的共性功能,看最顶层的类
注意事项:
-
子类只能继承父类所有非私有的成员(成员方法和成员变量)
-
子类不能继承父类的构造方法,但是可以通过super关键字去访问父类构造方法。
-
不要为了部分功能而去继承
重载(Overload)
-
方法名称相同,但是参数列表不同
-
方法的重载与返回类型无关,与访问修饰符无关(但不能是private)
-
包含参数的顺序,当参数类型不同且不能自动提升时(不推荐使用这种方式重载)
-
虚拟机在调用重载的方式时,是通过方法签名区分不同方法的,方法签名=方法名+参数列表
重写(Override)
-
要有继承关系
-
子类中的方法和父类中的方法三要素相同(返回类型,方法名,参数列表)
-
返回类型也可以是父类返回类型的子类
-
子类返回类型要大于等于父类返回类型,private除外
-
子类访问修饰符要大于等于父类
-
子类重写父类的方法的异常要小于等于父类方法的异常
抽象 --- abstract
-
只有方法头没有方法体的方法称为抽象方法
-
有抽象方法的类也要声明为抽象的,被abstract修饰的类称为抽象类
-
成员变量既可以是变量也可以是常量。abstract不能修饰成员变量
-
有构造方法,用于子类访问父类数据的初始化
-
成员方法既可以是抽象的,也可以是非抽象的
-
抽象方法,强制子类要求做的事情
-
非抽象方法,子类继承的事情,提高代码的复用性
-
抽象类可以存着非抽象的方法
-
抽象类不能被直接实例化
-
如果继承抽象类,就必须重写抽象类中的所有抽象方法,除非子类也是抽象类
-
abstract不能跟static一起使用,因为被abstract修饰的方法没有方法体,而被static修饰的方法可以被类名.调用,但是类名.调用抽象方法是没有意义的。
-
abstract不能跟final一起使用,因为被abstract修饰的方法强制子类重写,而被final修饰的方法不让子类重写,所以它们互相矛盾。
-
abstract不能跟private一起使用,因为被abstract修饰的方法是为了让子类看到并强制重写,而被private修饰的方法不让子类访问,所以他们互相矛盾。
接口 --- interface
-
从狭义的角度上讲就是指java中的interface,从广义的角度讲对外提供规则的都是接口
-
如果抽象类中所有的方法都是抽象的,我们可以把这个抽象类声明为接口
-
接口和类的关系是实现(implements),接口和接口之间是继承
-
继承是单继承,实现是多实现
-
接口中不能定义非抽象方法
-
接口中的方法默认被public abstract修饰
-
接口中的成员变量默认被public static final修饰
-
接口中没有构造方法,子类的构造方法里的super()默认访问的是Object里的构造方法。
类与类,类与接口,接口与接口的关系
-
类与类之间是继承关系,只能但继承,可以多层继承
-
类与接口之间可以单实现,也可以多实现,并且还可以在继承一个类的同时实现多个接口
-
接口与接口是继承关系,可以单继承,也可以多继承
抽象类和接口的区别
-
抽象类:被继承体现的是”is a“的关系。抽象类中定义的是该继承体系的共性功能。
-
接口:被实现体现的是”like a“的关系。接口中定义的是该继承体系的扩展功能。
内部类
-
把内部类当成外部类的一个普通成员
-
静态内部类中只能使用静态成员变量
-
非静态内部类中只能使用非静态方法和成员变量
-
外部类不能直接访问内部类的私有属性
-
内部类可以访问外部类的私有属性
-
抽象类和接口不能直接创建子类对象,但可以通过匿名内部类来创建子类实例去操作属性或方法
多态
-
具有继承关系
-
子类重写父类方法
-
父类的引用指向子类的对象(向上转型)
-
父类到子类的转换(用instanceof关键字进行强制类型转换,向下转型)
-
成员方法(非静态):编译看父类,运行看子类(动态绑定)
-
成员方法(静态):编译看父类,运行也看父类
-
成员变量(静态和非静态一样):编译看父类,运行也看父类
-
父类作为方法形参实现多态,传的值优先转换到精确度最高的类型(就近原则)。
-
父类作为方法返回值实现多态
静态代码块,构造代码块,构造方法三者之间的先后执行顺序:
父类静态代码块>子类静态代码块>父类非静态代码块>父类构造方法>子类非静态代码块>子类构造方法
static
-
随着类的加载而加载
-
优先于对象存在,static修饰的方法里面不能用this和super
-
共性用静态,特性用非静态
-
静态成员变量,可以通过类名直接访问,也可以通过对象访问
-
静态变量是该类所有对象共享,静态变量也称为类变量
-
静态中方法中只能使用静态方法或属性(静态只能访问静态)
-
非静态方法中既能使用非静态方法或属性也能使用静态的方法或者属性(非静态可以能访问静态,也可以访问非静态)
-
静态代码块在对象创建时调用,并且只会被调用一次
-
被静态修饰的方法和属性生命周期最长
-
一般在工具类中大量使用静态方法
静态变量和成员变量的区别
静态变量也叫类变量 成员变量也叫对象变量
A:所属不同
-
静态变量属于类,所以也称为为类变量
-
成员变量属于对象,所以也称为实例变量(对象变量)
B:内存中位置不同
-
静态变量存储于方法区的静态区
-
成员变量存储于堆内存
C:内存出现时间不同
-
静态变量随着类的加载而加载,随着类的消失而消失
-
成员变量随着对象的创建而存在,随着对象的消失而消失
D:调用不同
-
静态变量可以通过类名调用,也可以通过对象调用
-
成员变量只能通过对 象名调用
this
-
代表当前对象的引用,谁来调用我,我就代表谁
-
this()表示调用本类除了自己以外的构造器,只能写在其他构造器里面
-
this()只能写在构造器里面的第一行
-
this表示本类对象
-
this.属性名称 可以调用本类中的成员变量,也可以调用父类的成员变量
-
this.方法名称 可以调用本类中的成员方法,也可以调用父类中的成员方法
super
-
代表当前对象父类的引用
-
super()表示调用父类的构造器,这个必须写在子类构造器里面的第一行
-
super.属性名(方法名),表示调用父类的方法或属性
-
super其实就是一个父类对象
final
-
被final修饰的类不能被继承
-
被final修饰的变量是常量,,只能被赋值一次,但是可以被子类的值覆盖(重写)
-
被final修饰的方法不能被覆盖(重写)
-
被final修饰的对象值可变,引用不能变
-
被final修饰的局部变量如果是基本数据类型,是值不能被改变。如果是引用类型,是地址值不能被改变,对象中的属性可以改变
-
final和abstract不能一起使用