java基础(2)面向对象

在这里插入图片描述
理解p1,p2在堆中生成,开辟空间。
p3其实只是申明变量,并指向p1
在这里插入图片描述
局部变量和变量的区别
在这里插入图片描述
属性是有默认的
局部变量是没有初始化的
属性加载在堆(非static)
局部变量:加载到堆空间

jvm简单了解

编译完源程序以后,生成一个或多个字节码文件
我们使用jvm中的类的加载器和解释器堆字节码文件解释运行,需要记字节码文件相应的类加载在内存中,涉及内存解析。
在这里插入图片描述
jvm中我们将局部变量(类中方法的属性)存储在栈结构中
堆:我们将new的对象(数组,对象)加载在空间中,对象的(非static)属性。
方法区:类加载信息,常量池,静态域
引用类型(类,接口,数组)的变量,只可能存储(null与地址值)
在这里插入图片描述
在这里插入图片描述
new出对象以后内存就是这个样子
所以输出student[]会显示地址,stus.state会显示值,在没有值的属性会报空指针错误
引用数据类型,在修改值以后,指向该值的数据类型都得发生变化

可变形参表示

在这里插入图片描述
可变个数形参的 方法与本类中方法名相同,形参不同的方法之间构成重载
可变个数形参的 方法与本类中方法名相同,形参类型相同的数组方法之间不构成重载,不可共存
其也必须申明在末尾
在这里插入图片描述
遍历其本质还是数组

权限

在这里插入图片描述

This关键字

表示:当前对象的
在类方法/构造器中我们可以使用this.属性或this.方法。通常我们都会省略。
只有在形参和属性同名的时候才需要显式的使用this.变量。表面其为属性而非形参
在这里插入图片描述
1.this在构造器中可以用this(age)来调用其他构造器的内容,这样就省略了this.age=age;这句。
2.this不可再构造器中调用自己,且不能构成环路。
N个构造器,只有n-1个this。
3.this必须在首行,且只能申明一个

MVC

在这里插入图片描述

继承

extends子类继承父类的所有方法属性,private也可以继承,只是不可以直接调用。子类可以拓展
java只允许单继承,其子类可以有多个父类,且全部继承。
所有的类都继承于object类

方法重写

对父类方法的改造
在这里插入图片描述

super关键词

指父类的
在这里插入图片描述

第一个返回子类第二个就是父类的
在这里插入图片描述
在这里插入图片描述

子类对象实例化

  • 结果上:子类继承父类之后,就获取了父类申明的方法与属性。创建子类的对象,在堆空间中,就加载所有父类对象声明的属性
  • 从过程上来看:当我们通过子类构造器创造子类对象时,我们一定会直接或间接调用父类构造器,进而调用父类的父类构造器。知道object的空参构造器为止,因为加载过所有父类所以才可以在内存中有父类的结构,子类对象才可以考虑进行调用
    在这里插入图片描述
    内存中有这么多构造器但是只是只创建过一个对象

多态

即多种形态
在这里插入图片描述

父类的引用指向子类的对象
在这里插入图片描述
这个是编译期调用父类方法,但是在执行期执行子类重写的方法即eat方法指向person类,但是运行的是man重写的方法。编译看左边,执行看右边
多态的前提:

  1. 类的继承关系
  2. 方法的重写
  3. 属性不适用多态性

虚拟方法:使用多态时的父类方法

多态是一个运行时行为。编译阶段也可称为动态绑定

重载与重写的区别

一、定义上的区别:

1、重载是指不同的函数使用相同的函数名,但是函数的参数个数或类型不同。调用的时候根据函数的参数来区别不同的函数。

编译就绑定了也称早绑定与静态绑定。
2、覆盖(也叫重写)是指在派生类中重新对基类中的虚函数(注意是虚函数)重新实现。即函数名和参数都一样,只是函数的实现体不一样。
调用时才知道具体方法,也称晚绑定与动态绑定
二、规则上的不同:

1、重载的规则:

①必须具有不同的参数列表。

②可以有不同的访问修饰符。

③可以抛出不同的异常。

2、重写方法的规则:

①参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载。

②返回的类型必须一直与被重写的方法的返回类型相同,否则不能称其为重写而是重载。

③访问修饰符的限一定要大于被重写方法的访问修饰符。

④重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。

三、类的关系上的区别:

重写是子类和父类之间的关系,是垂直关系;重载是同一个类中方法之间的关系,是水平关系。

instanceof关键字

x instanceof B
检验x是否是B的对象返回值时boolean
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

object

在这里插入图片描述

==运算符:

  • 用于基本数据类型比较值(类型可以不同,boolean除外)
  • 用于引用数据类型,比较地址

equals方法:
只能用于引用数据类型

  • object类中equals是等价于==的
  • String,data,File,包装类都重写了equals方法,就比较的是内容了
  • 在这里插入图片描述

在这里插入图片描述

toString
在这里插入图片描述
object中的toString返回的就是地址

  • String,data,File,包装类都重写了toString方法

包装类

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
未定义boolean基本数据类型返回false,类返回null。
在这里插入图片描述

自动装箱与拆箱
在这里插入图片描述
在这里插入图片描述
直接将基本数据类型赋值给类
让类等于数据类型

String到基本数据类型/包装类用parse*方法
在这里插入图片描述
基本类型到String可以直接连接,也可以valueof
在这里插入图片描述
面试题:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
源码中,integer内部定义了integercache,integercache定义了integer[]数组,保存了-127-128之间的数如果用自动装箱(第二个)在范围内可以直接使用数组元素,不用再new了。
第三个就是new了指向地址不同所以为false;

Static关键字

1.static
在这里插入图片描述
static:静态变量,在创建类的多个对象,多个对象共享同一个静态变量,当通过某一个对象修改静态变量,会导致其他对象中同样的属性修改

  • static随着类的加载而加载
  • 静态变量加载早于对象的创建
  • 因为类只会加载一次,所以静态变量只会存一份,存在方法区的静态域
  • 例如,system.out,math,pi等类

在这里插入图片描述
静态方法只可以调用静态的方法与属性
非静态方法可以调用非静态与静态的方法与属性

static不可以用this与super,因为是在类加载期

用法:属性可以被多个对象共享,不会随着对象不同而不同
操作静态属性的方法,通常申明为static
工具类的方法,习惯上申明为static

单例设计模式

在这里插入图片描述
在这里插入图片描述
一个类只有一个对象,且创建对象是在类中。上述为饿汉式
一上来就new对象
在这里插入图片描述
懒汉式,不用不造

区别:
饿汉式对象加载时间长,线程安全
懒汉式:延迟创建对象,线程不安全
应用:
网络计数器,日志应用,数据库连接池,application

属性赋值先后顺序

  1. 默认初始化
  2. 显式初始化
  3. 构造器初始化
  4. 对象.属性/方法

final关键字

final:
类:不能继承Eg:String,System类
方法:不能重写
变量属性:常量
static final 修饰属性:全局常量

抽象类

abstract:
类不可以实例化,但是提供构造器,便于子类实例化调用开发中都会提供抽象类子类,让子类实例化
方法:只有方法申明,没有方法体
包含抽象方法的类,一定是抽象类
子类重写父类的所有抽象方法,子类就可以实例化,少一个方法那么子类仍然是抽象类,要使用abstract关键字

模板方法设计模式

在这里插入图片描述
在这里插入图片描述
抽象类中有抽象方法,子类继承抽象父类。
需要重写父类的抽象方法
main方法中也是建立子类

接口

java不支持多继承,有了接口就可以多重继承
接口和类是两个并列的两个结构
JDK7以前只能定义全局变量public static final 和抽象方法:public abstract的。
jdk8除了定义全局常量和抽象方法,还可以定义静态方法,默认方法

接口中不可以有构造器,接口不可以实例化
在这里插入图片描述
接口中让类实现接口来使用,如果实现类实现了接口中的所有抽象方法那么就可以实力化 如果实现类没有覆盖所有,那他仍然是一个抽象类

java类可以实现多个接口–>弥补了java的 单继承性的局限性
接口实际是一种规范
在这里插入图片描述

代理模式(proxy)

在这里插入图片描述

工厂模式()

后面看

面试题
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
接口的ball不可再改变。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43430273/article/details/112729945