一、重写
1.重写的规则:
(1)参数列表必须完全与被重写方法相同;
(2)返回类型必须完全与被重写方法的返回类型相同
(3)父类的方法只能被它的子类重写
(4)子类重写的方法权限不能低于父类中被重写的方法的权限
(5)声明为static和private的方法不能被重写,但是能够被重新声明
2.重写与重载的区别
(1)发生的位置:重载在一个类中;重写在子父类中
(2)参数列表限制:重载必须是不同的;重写:必须是相同的
(3)返回值类型:重载与返回值类型无关;重写返回值类型必须一致
(4)访问权限:重载与访问权限无关;重写:子类的方法权限必须不能小于父类的方法权限。
(5)异常处理:重载与异常无关;重写:异常范围可以更小,但是不能抛出新的异常
二、final和static关键字
1.final
(1)final用于修饰属性、变量;修饰的局部变量,只能赋值一次;成员属性,必须在声明时赋值。变量成为了常量。全局常量(public static final).
常量的命名规范:由一个或者多个单词组成,单词与单词之间必须使用下划线隔开,单词中所有字母大写。
(2)final用于修饰类:final修饰的类,不可以被继承
(3)final用于修饰方法:final修饰的方法,不能被子类重写
2.static
通过static修饰的存储在方法区中,不依赖对象来进行访问,只要类被加载了,就可以通过类名去进行访问,并且不会因为对象的多次创建而在内存中建立多份数据。静态不能访问非静态,非静态能够访问静态。
三、代码块
1.普通代码块:在执行的流程中出现的代码块,我们称其为普通代码块
2.构造代码块:在类中的成员代码块,我们称其为构造代码块,在每次创建对象时执行,执行在构造方法之前。
3.静态代码块:在类中使用static修饰的成员代码块,我们称其为静态代码块,在类加载时执行。每次程序启动到关闭,只会执行一次的代码块。
4.构造方法、构造代码块以及静态代码块的执行顺序:
静态代码块–>构造代码块–>构造方法
四、抽象类
1.概述
抽象类必须使用abstract class声明。一个抽象类中可以没有抽象方法。抽象方法必须写在抽象类或者接口中。
2.抽象方法
只声明而未实现的方法称为抽象方法,抽象方法必须使用abstract关键字声明。
3.不能被实例化
在抽象类的使用中有几个原则:
抽象类本身是不能直接进行实例化操作的,即:不能直接使用关键字new完成。
一个抽象类必须被子类所继承,被继承的子类(如果不是抽象类)则必须重写抽象类中的全部抽象方法。
4.常见问题
(1)抽象类能否使用final声明?
不能,因为final修饰的类是不能有子类的,而抽象类必须有子类才有意义,所以不能。
(2)抽象类能否有构造方法?
能有构造方法,而且子类对象实例化的时候的流程与普通类的继承是一样的,都要先调用父类中的构造方法,之后再调用子类自己的构造方法。
5.抽象类与普通类的区别
(1)抽象类必须用public 或者procted修饰
(2)抽象类不可以使用new关键字创建对象,但是在子类创建对象时,抽象父类也会被jvm实例化
(3)如果一个子类继承抽象类,那么必须实现其所有的抽象方法。如果有未实现的抽象方法,那么子类必须定义为abstract类。
五、接口
1.概述
如果一个类中的全部方法都是抽象方法,全部属性都是全局常量,那么此时就可以将这个类定义成一个接口。
2.面向接口编程思想
这种思想是接口是定义与实现的分离。
优点:
(1)降低程序的耦合性
(2)易于程序的扩展
(3)有利于程序的维护
3.全局常量和抽象方法的简写
因为接口本身都是由全局常量和抽象方法组成,所以接口中的成员定义可以简写。
(1)全局常量编写时,可以省略public static final关键字
(2)抽象方法编写时,可以省略public abstract关键字
4.接口的实现
接口可以多实现
5.接口的继承
接口因为都是抽象部分,不存在具体的实现,所以允许多继承。
6.接口和抽象类的区别
(1)抽象类要被子类继承,接口要被类实现
(2)接口只能声明抽象方法,抽象类中可以声明抽象方法,也可以写非抽象方法
(3)接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量
(4)抽象类使用继承来使用,无法多继承,接口使用实现来使用,可以多实现
(5)抽象类中可以包含static方法,但是接口中不允许
(6)接口不能由构造方法,但是抽象类可以有
六、多态
1.概述
多态:就是对象的多种表现形式(多种体现形式)
2.多态的体现
对象的多态性,从概念上非常好理解,在类中有子类和父类之分,子类就是父类的一种形态,对象多态性就由此而来。
方法的重载和重写也是多态的一种,不过是方法的多态。
重载:一个类中方法的多态性体现
重写:子父类中方法的多态性体现
3.多态的使用
对象的类型转换:
(1)向上转型:将子类实例变为父类实例
(1)向下转型:将父类实例变为子类实例
七、instanceof
作用:判断某个对象是否是指定类的实例,则可以使用instanceof关键字。
八、Object
1.概念
Object类是所有类的父类,如果一个类没有明确的继承某一个具体的类,则将默认继承Object类。
2.Object的多态
使用Object可以接收任意的引用数据类型
3.toString
建议重写Object中的toString方法,此方法的作用是:返回对象的字符串表现形式
object的toString方法,返回对象的内存地址。
4.equals
建议重写equals方法,此方法的作用:指示某个其他对象是否等于此对象。
object的equals方法,实现了对象上最具区别的可能等价关系;也就是说,对于任何非空引用值x和y,当且仅当x和y引用同一对象时,此方法返回true。
九、内部类
1.概念
在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。
2.成员内部类
成员内部类是最普通的内部类,它的定义位于另一个类的内部。
特点:成员内部类可以无条件访问外部类的所有成员属性和成员方法。不过需要注意的是,当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问的时成员内部类的成员。如果要访问外部类的同名成员,需要以下面的形式进行访问:
外部类.this.成员变量
外部类.this.成员方法
3.局部内部类
局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问权限于方法内或者该作用域内。
注意:局部内部类就像是方法里面的一个局部变量一样,是不能有public protected private 以及static修饰符的。
4.匿名内部类
匿名内部类由于没有名字,所以它的创建方式优点奇怪。创建格式如下:
new 父类构造器(参数列表)| 实现接口(){
匿名内部类的类体部分
}
注意:
(1)使用匿名内部类时,我们必须继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。
(2)匿名内部类中是不能定义构造函数的
(3)匿名内部类中不能存在任何的静态成员变量和静态方法
(4)匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效
(5)匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法
(6)只能访问final的局部变量
5.静态内部类
静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一个关键字static。静态内部类是不需要依赖外部对象的,这点和类的静态成员属性优点类似。并且它不能使用外部类的非static成员变量或者方法。
十、包装类
1.概述
在Java中有一个设计的原则:一切皆对象。那么这样一来Java中的一些基本数据类型,就完全不符合于这种设计思想,因为Java中的八种基本数据类型并不是引用数据类型,所以Java中为了解决这样的问题,引入了八种基本数据类型的包装类。
基本数据类型 | 包装类 |
---|---|
int | Integer |
char | Character |
float | Float |
double | Double |
boolean | Boolean |
byte | Byte |
short | Short |
long | Long |
但是以上的八种包装类也是分为两种大的类型的:
Number:Integer Short Long Float Double Byte都是Number的子类表示是一个数字。
Object:Character、Boolean都是Object的直接子类
2.装箱和拆箱操作
以下以Integer和Float为例进行操作:
将一个基本数据类型变为包装类,那么这样的操作称为装箱操作。
将一个包装类变为一个基本数据类型,这样的操作称为拆箱操作。
因为所有的数值类型的包装类都是Number的子类,Number中定义了如下的操作方法,以下的方法都是进行拆箱的操作。
装箱操作:
在JDK1.4之前,如果要想装箱,直接使用各个包装类的构造方法即可。但是在
JDK1.5之后,Java新增了自动装箱和自动拆箱,而且可以直接通过包装类进行四则运算和自增自减操作。
十一、字符串转换
使用包装类还有一个很优秀的地方在于:可以将一个字符串变为指定的基本数据类型,此点一般在接收输入数据上使用较多。