面向对象三大特性
封装:隐藏了类内部的实现机制,暴漏给外界的只是类的访问方法,可以限制外界对类的属性的不合理的操作
继承:从已有的类中派生出新的类,子类拥有父类的所有属性和方法,新的类在父类的基础上扩展了新的能力,避 免了对共同特征的重复描述,提高代码重用性
多态:在继承关系(或接口实现关系)与重写方法的基础上,让父类引用指向子类对象,实际调用的子类的方法, 程序到底调用哪个方法只有在运行期才能确定
Java是如何实现跨平台的
一个java程序(.java文件),首先被编译生成字节码文件(.class文件),不同平台下的字节码文件都是相同的,不同平台下有各自的虚拟机,(虚拟机中的解释器和即时编译器)将字节码文件翻译成各自平台硬件可识别的机器码去运行。
解释器:逐行解释,立马就启动,但速度不快
jit即时编译器:第一次编译后,将经常调用的热点代码对应的机器码保存下来,下次直接使用,启动慢,速度快
成员变量与局部变量的区别
成员变量:有初始值,可以用权限修饰符,在堆中
局部变量:无初始值,不可以用权限修饰符,在栈中
成员变量是属于类的,局部变量是属于方法的
成员变量的生命周期与对象相同,局部变量随着方法的调用结束而消亡
重载和重写的异同
重载(编译期):"两同一不同" 同一个类,同一个方法名;参数列表不同(参数个数不同、顺序不同、类型不同,总之就是要编译器在编译期间能通过参数列表区分你用的哪个方法)
重写(运行期):"继承关系,同名同参,两小一大",子类重写父类同名同参的方法,子类无法重写私有、静态、final的方法,子类的返回值和抛出的异常都是小于等于,权限修饰符是大于等于
子类如何调用父类的私有方法?可以通过调用父类的public方法,在public方法中调用父类的私有方法
如果方法的返回类型是 void 和基本数据类型,则返回值重写时不可修改。但是如果方法的返回值是引用类型,重写时是可以返回该引用类型的子类的。
构造方法无法被重写只能被重载
权限修饰符
顶级class只能被public或缺省修饰;
权限修饰符可修饰属性、方法、构造器、内部类;
private的类无法被继承;
continue、break、return区别
continue是跳出本次循环继续下一轮循环,break是跳出整个循环体,return是返回方法这个方法结束了
static关键字
作用域:可以修饰属性、方法、代码块、内部类 注:构造器无法被static、final、abstract修饰
生命周期:随着类的加载而加载,生命周期与类相同
static的用途:不创建对象的时候也能调用静态方法或静态变量
静态方法:静态只能调用静态的东西,而不能调用非静态的,没有this或者super;非静态可以调用静态或者非静态
静态变量:静态变量在内存中只存在一份,由所有对象共享
静态成员的调用方式两种: 对象.方法名 类名.方法名
静态代码块可以提升程序性能,一些初始化工作可在静态代码块中
son是father的子类 new son();
代码执行顺序:父类静态代码块->子类静态代码块->父类构造方法->子类构造方法
final关键字
作用域:final可以修饰类、方法、变量(成员变量、局部变量都行)
final修饰类时,表明这个类无法被继承,并且此类中的所有方法都会被隐式指定为final方法
final修饰方法时,表明这个方法无法被重写
final修饰变量时,若修饰基本类型变量,表明这个变量变为了常量,不可修改其值,
若修饰引用类型变量,表明这个变量不能再指向其他的对象,也即引用地址无法再改变
一定要给final变量赋值,可以赋值的位置:定义时赋值、代码块赋值、构造器赋值,不赋值是没法用的
abstract和interface关键字
abstract(有构造器)
作用域:修饰类、方法
abstract修饰类:无法实例化
abstract修饰方法:没有方法体,abstract无法修饰final、static、private的方法,因为他们无法被重写
抽象类不一定有抽象方法,但有抽象方法一定是抽象类
若子类无法重写抽象父类所有的抽象方法则子类也应是抽象类
interface(没有构造器)
变量:都用public static final修饰
方法:都用public abstract修饰
无法实例化,接口可以多继承,一个类可以实现多个接口
相同:抽象类和接口都不能被实例化
不同:抽象类有构造方法 ; 接口没有构造方法
抽象类可以有普通成员变量 ;接口的变量都是 public static final的
抽象类可以包含非抽象方法 ; 接口中的方法都是抽象的 用public abstract修饰,java8开始接口中还可以有默认方法和静态方法,java9开始接口中还可以有私有方法
抽象类单继承 ; 接口可以多继承
抽象类中的抽象方法可以是public 或 protected的 ;接口中的抽象方法必须是public的
一个java类只可以继承一个抽象类 但可以实现多个接口