Java基础
面向对象
面向对象编程:拿东西过来做对应的事情。
类和对象
类里面可以定义
-
成员变量(代表属性)
-
成员方法(代表行为)
-
构造器
-
代码块
-
内部类
private修饰符的作用
-
是一个权限修饰符
-
可以修饰成员(成员变量和成员方法)
-
被private修饰的成员只能在本类中才能访问
this关键字的作用
<span style="background-color:#f8f8f8"><span style="color:#333333"> (1)this调用本类中的属性,this会调用类中的成员变量;
(2)this调用本类中的其他方法;
(3)this调用本类中的其他构造方法,调用时要放在构造方法的首行。</span></span>
构造方法
作用:在创建对象的时候给成员变量进行初始化。
-
如果没有定义构造方法,那么系统将默认给出一个无参的构造方法。
-
如果定义了构造方法,系统将不再提供默认的方法。
Java内存分配
-
栈:方法调用的时候,进栈执行。方法定义的变量也在栈里面。
-
堆:new出来的是在堆里面开辟一块小空间并产生地址值。
-
方法区(JDK8取消)
创建对象在内存中的执行过程:
-
加载class文件
-
申明局部变量
-
在堆内存开辟空间 (new对象)
-
默认初始化
-
显示初始化
-
构造方法初始化
-
将堆内存中的地址值赋值给左边的局部变量
基本数据类型和引用数据类型
基本数据类型:数据值存储在自己的空间中。赋值给其他变量,也是赋的真实的值。
引用数据类型:数据值是存储在其他空间中,自己空间中存储的是地址值。 赋值给其他变量,赋的地址值。
this的内存原理
this的本质:所在方法调用者的地址值。
成员变量和局部变量的区别
区别 | 成员变量 | 局部变量 |
---|---|---|
类中位置不同 | 类中,方法外 | 方法内、方法申明上 |
初始化值不同 | 有默认初始化值 | 无,使用之前需要完成赋值 |
内存位置不同 | 堆内存 | 栈内存 |
生命周期不同 | 随着对象的创建而存在,随着对象的消失而消失 | 随着方法的调用而存在,随着方法的运行结束而消失 |
作用域 | 整个类或中有效 | 当前方法中有效 |
static静态变量
static表示静态,可以修饰成员变量,成员方法。
被static修饰的变量叫成员变量。
被static修饰的方法叫成员方法。
静态变量的特点:被该类所有对象共享
静态变量是随着类加载而加载的,静态变量时优先于对象出现的。
static的注意事项
-
静态方法只能访问静态变量和静态方法,不能调用非静态变量和非静态方法。
-
非静态方法可以访问静态变量或者静态方法,也可以访问非静态的成员变量和非静态的成员方法。
-
静态方法中没有this关键字。
继承的特点
支持单继承,不支持多继承,但支持多层继承。
子类继承了父类哪些内容
子类不能调用父类的私有成员变量
能否继承 | 私有 | 非私有 |
---|---|---|
构造方法 | 不能继承 | 不能继承 |
成员变量 | 能继承 | 能继承 |
成员方法 | 不能继承 | 能继承 |
虚方法表
非private 非static 非final修饰的
只有父类中的虚方法才能被子类继承
一个类中可以有成员变量,成员方法,构造方法
继承中,成员变量的特点
就近原则,离谁近就用谁。
方法重写
子类中出现了和父类一模一样的方法声明,我们就称子类的方法是重写的方法
-
重写方法的名称、形参列表必须与父类中的一致。
-
子类重写父类方法时,访问权限子类必须大于等于父类。
-
子类重写父类方法时,返回值类型子类必须小于等于父类。
this super使用
关键字 | 访问成员变量 | 访问成员方法 | 访问构造方法 |
---|---|---|---|
this | this.成员变量 访问本类的成员变量 | this.成员方法 访问本类的成员方法 | this.() 访问本类的构造方法 |
super | super.成员变量 访问父类的成员变量 | super.成员方法 访问父类的成员方法 | super.() 访问父类的构造方法 |
多态
同类型的对象,表现出的不同的形态。
多态的表现形式
父类类型 对象名称=子类对象
多态的前提
-
有继承/实现的关系
-
有父类引用指向子类对象
-
有方法重写
多态调用成员的特点
-
变量调用:编译看左边,运行看左边
-
方法调用:编译看左边,运行看右边
多态的优点
-
在多态的形式下,右边对象可以实现解耦合,便于扩展和维护。
-
定义方法的时候,使用父类类型作为参数,可以接收所有子类对象,体现多态的扩展性与便利。
多态的弊端
不能调用子类特有的功能
代码块
-
局部代码块:写在方法里面的,提前结束变量的生命周期。
-
构造代码块:写在成员位置的代码块,优先于构造方法执行。可以把构造方法中重复的代码块写在构造代码块中。构造代码块优先于构造方法执行。
-
静态代码块:通过static修饰,随着类的加载而加载,并且自动触发、只执行一次。
静态代码块使用场景
在类加载的时候,做一些数据初始化的时候使用。
抽象类
如果一个类中有抽象方法,则该类必须声明为抽象类。
抽象类的作用:抽取共性的时候,无法确定方法体,就把方法定义为抽象的。强制让子类按照某种格式重写。
抽象方法
将共性的行为(方法)抽取到父类之后,由于每一个子类执行的内容是不同的,所以,在父类中不能确定具体的方法体。该方法就可以定义为抽象方法。
抽象类和抽象方法使用的注意事项
-
抽象类不能实例化(创建对象)。
-
抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类。
-
抽象类可以有构造方法:当创建子类对象时,给属性赋值时使用。
-
抽象类的子类
-
要么重写抽象类中的所有抽象方法,之后可以创建对象。
-
要么仍然是抽象类,仍然不能创建对象。
-
接口中成员的特点
1.成员变量:只能是常量。默认修饰符:public static final
2.构造方法:没有
3.成员方法:只能是抽象方法,默认修饰符:public abstract
接口和类之间的关系
-
类和类的关系:继承关系,只能单继承,不能多继承,但是可以多层继承。
-
类和接口的关系:实现关系,可以单实现,也可以多实现,还可以在继承一个类的同事实现多个接口。
-
接口和接口的关系:继承关系,可以单继承,也可以多继承。
JDK8以后,允许接口中定义默认方法,需要使用default修饰。
接口中默认方法的定义格式:
格式:public default 返回值类型 方法名(参数){}
接口中默认方法的使用注意事项:
-
默认方法不是抽象方法,所以不强制被重写。但是如果被重写,重写的时候去掉default关键字。
-
public可以省略,default不可以省略。
-
如果实现了多个接口,多个接口中存在相同名字的默认方法,子类就必须对该方法进行重写。
内部类
类的五大成员:属性、方法、构造方法、代码块、内部类
内部类表现的事物是外部类的一部分
内部类的访问特点
-
内部类可以直接访问外部类的成员,包括私有
-
外部类要访问内部类成员,必须创建对象
内部类的分类
-
成员内部类
-
静态内部类
-
局部内部类
-
匿名内部类
匿名内部类
匿名内部类的本质就是隐藏了名字的内部类。
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500">// 格式</span>
<span style="color:#770088">new</span> <span style="color:#000000">类名或者接口名</span>(){
<span style="color:#000000">重写方法;</span>
}</span></span>