面向对象学习上

Java面向对象学习的三条主线

  1. 面向对象的三大特征:封装性、继承性、多态性
  2. java类以及类的成员:属性。方法。构造器;代码块、内部类
  3. 其它关键字:this/supper/static、final、abstract、interface、package、inport、

类和对象的使用步骤

  1. 创建类设计类的成员、方法
  2. 创建类的对象、
  3. 通过.属性、.方法、来调用对象的属性和方法

类和对象的关系

对象是类的实例化,比如(这时候面试应该用开发中的场景举例子,而不要用上课中的小猫小狗来举例子,这样显得专业)scanner类定义的scanner的属性方法,而具体用的时候需要新建一个scanner类型的对象。

对象的创建和使用:内存解析

在这里插入图片描述

  • 方法区:用于存放已经被虚拟机加载过的类,常量,静态变量及被即时编译器编译了的代码数据

    • 堆:它的唯一的目的是存放类的对象实例,所有的对象实例以及数组都要在堆上进行分配
    • 栈:指的是虚拟机的栈,用来存放创建的局部变量,以及对象的引用(reference类),不同于对象本身,他存储的是对象在堆中的首地址,指向堆中的对象,相当于是个指针变量一样。
    • 在这里插入图片描述
      上图中的p1,p2都是新对象的创建,创建的对象存放在堆中,栈中放着p1,p2的引用变量,而person p3=p1这句话并没有创建新的对象,p3只是对对象p1的一个新的引用变量

属性(类的成员变量)和局部变量的比较

相同点:
1、定义变量的格式相同
2、都是先声明后使用
3、都有其对应的作用域

不同点:
在这里插入图片描述
在这里插入图片描述
2.3属性都有初始值:

  • 整形(byte、short、int、long):0
  • 浮点型(float、double):0.0
    在这里插入图片描述
  • 在内存中加载的位置不同
  • 属性加载在堆空间中(非static的)
  • 局部变量加载在栈中

jvm内存结构

编译完成后生成一个或多个字节码文件。
我们用jvm中加载器和解释器运行字节码文件,也就是说,将字节码文件中的类加载到内存中去,涉及到内存解析。
在这里插入图片描述
虚拟机栈:平时用到的栈结构,局部变量加载在栈中
堆:我们家new的结构(比如 对象,数组)等加载在堆空间中,注意:对象的属性加载在堆空间中
方法区:类的加载信息,常量域,静态域、

对象数组的内存结构

在这里插入图片描述
现在堆中建立一个student类型的引用数组,在栈中建立一个变量stus,stus指向该数组的首地址,stus【0】初始值为null,后来最为student类的引用变量,指向新建的student对象的首地址0*1122。

匿名对象

特点:没有引用变量指向这个对象
eg:new student();就是一个匿名对象,他只能使用一次,因为没有一个变量引用他
开发中使用匿名对象的例子:对象.方法(new student());
mall.show(new phone());

参数传递机制

实参到形参的值传递中变量的赋值:
如果变量是基本数据类型(int long double float char boolean。。),此时赋值的是变量所保存的数据值,而不是实参的地址,所以改变方法中改变形参的值,实参不会改变
如果变量是引用数据类型(类、 接口类型、 数组类型、 枚举类型、 注解类型、 字符串型),此时赋值的是变量所保存的数据的地址值
在这里插入图片描述
Value val=new Value();
v=val; //second中这串代码执行后,只是形参v的地址由原来的05556指向了08899。
实参v的值并没有变成val,还是原来的0*5566。所以second()执行后输出的(v.i)还是20

java网红题

在这里插入图片描述
微软面试题

定义一个int型的数组:int[] arr = new int[]{12,3,3,34,56,77,432};
让数组的每个位置上的值去除以首位置的元素,得到的结果,作为该位置上的
新值。遍历新的数组。
答案:
//错误写法
for(int i= 0;i < arr.length;i++){
arr[i] = arr[i] / arr[0];
}
//正确写法1
for(int i = arr.length – 1;i >= 0;i–){
arr[i] = arr[i] / arr[0];
}
//正确写法2
int temp = arr[0];
for(int i= 0;i < arr.length;i++){
arr[i] = arr[i] / temp;
}

乐视面试

int[] arr = new int[10];
System.out.println(arr);//地址值?
char[] arr1 = new char[10];
System.out.println(arr1); //地址值?其实不是地址值

面向对象的封装性

封装性的引入
当我们创建一个类的对象以后,我们可以通过对象。属性的方式对对象进行赋值,但是独行的数据类型和存储范围在实际情况中是有制约的。

  • 除此之外还有其他制约条件。实际问题中,我们不能直接在声明属性时添加这些条件,我们只能通过方法进行限制条件的添加,(如set方法)
  • 同时我们要避免用户再次调用对象.属性的方式赋值,这时我们用private声明属性的私有性,再用set方法提供属性的赋值
  • ————>此时针对属性,就体现了封装性

Java中通过将数据声明为私有的(private),再提供公共的(public)
方法:getXxx()和setXxx()实现对该属性的操作,以实现下述目的:
隐藏一个类中不需要对外提供的实现细节;
使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,
限制对属性的不合理操作;
便于修改,增强代码的可维护性;

*二、封装的体现:

  • 把类的属性私有化(private),同时在公共的(public)方法来获取(get)和设置(set)此属性

四种权限: private、缺省、protect、public

类的成员三:构造器(constructor)

其实一直在用,只是不知道
person p=new person();
new的person()就是一个构造器
构造器的作用:
1.创建对象
2.初始化属性
二、说明
1.如果没有显示的定义类的构造器,系统默认提供一个无参的构造器
2.构造器的格式: 权限修饰符 类名(形参列表){}
3.构造器可以在一个类中定义多个,彼此构成重载
4.一旦我们显示的定义了类的构造器之后,系统就不再提供默认的空参构造器了
5.一个类中至少要有一个构造器

属性赋值的先后顺序

赋值的位置:
① 默认初始化(int age;)
② 显式初始化(int age=5;)
③ 构造器中初始化
④ 通过“对象.属性“或“对象.方法”的方式赋值(setAge(int a=5){ age=a; })
 赋值的先后顺序:
① - ② - ③ - ④

Javabean

所谓的javabean,是java中java语言写的可重用操作
1、类是公共的
2有一个无参的公共的构造器
3、有属性,且有对应的get、set方法

 用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以
用Java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP
页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。用
户可以认为JavaBean提供了一种随时随地的复制和粘贴的功能,而不用关
心任何改变

this关键字

 在Java中,this关键字比较难理解,它的作用和其词义很接近。
 它在方法内部使用,即这个方法所属对象的引用(通俗的讲,this就是当前对象);
 它在构造器内部使用,表示该构造器正在初始化的对象。
 this 可以调用类的属性、方法和构造器  什么时候使用this关键字呢?
 当在方法内需要用到调用该方法的对象时,就用this。
具体的:我们可以用this来区分属性和局部变量。
比如:this.name = name;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值