成员变量:类内,方法外定义的;堆内存,随对象的存在而存在;
局部变量:方法中定义;栈内存;随方法的调用而存在;
在同一类中,访问时采用的是就近原则(即若该方法中有这一局部变量,则采用局部变量;若无这一局部变量,则访问成员变量);
若有成员变量与局部变量同名的现象,可通过this关键字访问同一类中的成员变量
构造方法
创建对象的时候,虚拟机会自动调用构造方法,作用是给成员变量进行初始化;
若不写构造方法,系统会默认有一个空参构造;写了构造方法则系统不会默认给空参构造;
格式:
public class user{
//成员变量
private String name;
private int age;
public user(){
}//空参构造
public user(String name,String age){//局部变量
this.name = name;
this.age = age;
}
}
static关键字
静态变量随着类的加载而加载,非静态则是与对象有关的;
被static修饰的成员变量称为静态变量;被该类所有对象共享;调用方式:类名调用/对象名调用
静态成员变量在堆内存中有专门的静态存储位置
被static修饰的方法称为静态方法,静态方法中没有this关键字,静态方法只能调用静态变量或静态方法,而非静态方法可以调用所有;原因:this关键字是指向一个对象,而静态方法可以不需创建对象;
继承
java只支持单继承,不支持多继承,但支持多层继承
java中所有的类都直接或间接继承于Obeject类
子类可以直接使用父类非私有的成员
构造方法:子类不能继承父类的构造方法,因为构造方法的名字需要与类名相同;
成员方法:会构造一个虚方法表,子类会继承父类的虚方法表(非final,非static,非private,其中static方法可以调用,但不是继承)
![](https://i-blog.csdnimg.cn/blog_migrate/c9ec68ae588c01e21a8badef1b2ec658.png)
继承中成员变量的访问特点:就近原则(先在局部位置找,本类成员位置找,父类成员位置找,逐级往上);关键字:this,super。成员方法也是类似的
继承中构造方法的访问特点:父类的构造方法不会被子类继承,子类中所有的构造方法默认先访问父类中的无参构造,再执行自己。原因:子类在初始化时,可能会用到父类的数据,如果父类没有完成初始化,子类将无法使用父类的数据;因此子类在初始化之前,一定要调用父类的构造方法先完成父类数据空间的初始化。子类构造方法的第一句默认就是:super(),不写也存在,但必须是第一句,如果想调用父类的有参构造,必须手动写super进行调用。
多态
同类型的对象,表现出的不同形态;
父类类型 对象名称 = 子类对象;(对象的上转型对象)
前提:有继承关系;有父类引用指向子类对象;有方法重写;Fu fu1 = new Zi();
优点:使用父类型作为形参,可以接受所有的子类对象,体现多态的扩展性和便利性
缺点:不能直接调用子类的特有方法,要进行类型转换
调用成员变量:编译看左边(javac编译时会看父类中有没有这个变量,有就编译成功,否则失败),调用也看左边,java运行代码时,获取的就是左边父类中成员变量的值
调用成员方法:编译看左边(同上),调用看右边(子类在重写父类时,会在虚方法中把父类的方法覆盖)
包
包就是文件夹;
使用同一个包中的类时,不需要导包;
使用Java.lang中的包时,不需要导包;
其他情况下需要;
是由两个包中的同名类时需要使用全名;
final
最终的,不可改变;
修饰方法,表明该方法为最终方法,不能被重写;
修饰类,表面该类为最终类,不能被继承;
修饰变量,叫做常量,只能被赋值一次;
final修饰的是基本数据类型,那么变量存储的数据值不能改变;
final修饰的是引用数据类型,那么变量存储的地址值不能改变,对象内部的可以改变;
抽象类和抽象方法
强制子类进行重写;
抽象类不能创建对象;抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类;
可以有构造方法;作用是当创建子类对象时,给属性进行赋值的;
抽象类的子类,要么重写抽象类中的所有抽象方法,要么是抽象类;
接口
是一种规则,是对行为的抽象。
public interface 接口名{}
接口不能实例化;接口和类之间是实现关系,通过implements关键字表示;(public class 类名 implements接口名)
接口的子类(实现类)要么重写接口中所有的抽象方法,要么是抽象类;
接口和类的实现关系,可以单实现,也可以多实现;实现类还可以在继承一个类的同时实现多个接口;