Java面向对象学习的三条主线
- 面向对象的三大特征:封装性、继承性、多态性
- java类以及类的成员:属性。方法。构造器;代码块、内部类
- 其它关键字:this/supper/static、final、abstract、interface、package、inport、
类和对象的使用步骤
- 创建类设计类的成员、方法
- 创建类的对象、
- 通过.属性、.方法、来调用对象的属性和方法
类和对象的关系
对象是类的实例化,比如(这时候面试应该用开发中的场景举例子,而不要用上课中的小猫小狗来举例子,这样显得专业)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;