day06 01-面向对象-概述
1、特点:
(1)面向对象就是一种常见的思考习惯,符合人们的思考习惯。
(2)面向对象的出现,将复杂问题简单化。
(3)面向对象的出现,让曾经在过程中的执行者,变成了对象中的指挥者。
day06 03-面向对象-举例2
1、如果面试时,能因时因地因场景的说出来,证明你理解一个问题已经比较深化了。举例时,最好举生活中常见的。
day06 04-面向对象-类与对象之间的关系
1、类:用java语言对现实生活中的事物的描述。通过类的形式来体现。
2、怎么描述呢?
对于事物描述通常只关注两方面:①属性②行为(动作,功能)
1、生活中的汽车在大马路上跑,用计算机语言产生的汽车在内存上跑。
2、对象是该类实实在在存在的个体。对象是java中实实在在开辟的内存。
3、类与对象之间的关系:类是事物的描述;对象是该类事物的实例。
6、注意以下示例:
<pre name="code" class="java">class A{
String name="A";
void talk(){
System.out.println(name);
}
}
class B{
A a=new A();
a.talk();//你这么写,编译会报错。
}
编译报错:
Exception in thread"main" java.lang.Error: Unresolved compilation problem:
atJavaTest.TestDemo03.main(TestDemo03.java:8)
这么写不会:
class A{
String name="A";
void talk(){
System.out.println(name);
}
}
class B{
A a=new A();
void mathod(){
a.talk();
}
}
day06 06-面向对象-类与对象的体现-细节
1、定义类,其实就是定义类中的成员。类中的成员就两种:
一、成员变量(属性)
二、成员方法(行为)
day06 07-面向对象-对象的内存体现
1、Car c=new Car();
2、局部变量
3、以下代码在内存中会产生垃圾吗?
Car c1=new Car();
Car c2=c1;
c1.num=8;
c2.color="red";
c1.run();
c1=null;
答:不会有,因为即使c1无堆内存指向,但c2还在指向该内存。
4、只有当一块堆内存真真正正无任何栈内存指向时,他才能称为垃圾。
day06 08-面向对象-成员变量和局部变量的区别
1、成员变量和局部变量的区别
(1)定义的位置不同
成员变量直接定义在类中,整个类中都可以访问。
局部变量定义在函数、语句、局部代码块中,只在所属的区域有效。
(2)存放的位置不同
成员变量存在于堆内存的对象中。
局部变量存在于栈内存的方法中。
(3)存活的时间不同
成员变量随着对象的创建而存在,随着对象的消失而消失。
局部变量随着所属区域的执行而存在,随着所属区域的结束而释放。
(4)
成员变量有默认初始化值。
局部变量无默认初始化值,不手动初始化,不能用。
day06 09-面向对象-成员变量和局部变量的同名&显示初始化
1、以下代码运行结果是什么?
public class TestDemo04 {
public static void main(String[] args) {
Car c=new Car();
c.num=4;
c.run();
}
}
class Car{
int num;
String clor;
void run(){
int num=10;
System.out.println(num);
}
}
运行结果:10
2、以下代码运行结果是什么?
public class TestDemo04 {
public static void main(String[] args) {
int num=666;
System.out.println(num);
Car c=new Car();
System.out.println(c.num);
c.num=4;
c.run();
System.out.println(c.num);
}
}
class Car{
int num;
String clor;
void run(){
num=10;
System.out.println(num);
}
}
运行结果:666 0 10 10
3、在自己的栈里面找没找着,去堆里找去。自己所属的内存区域有东西,还用去其他地方找吗?
day06 10-面向对象-类类型参数
1、汽车改装厂代码示例:
public static void show(Car c){
c.num=4;
c.color="red";
System.out.println(c.num+"……"+c.color);
}
这里参数列表中的Car c就是接受Car类型参数。这是一种类类型参数。
2、引用数据类型:数组、类、接口。
注意:类与接口是一种数据类型!
day06 11-面向对象-匿名对象
1、匿名对象:没有名字的对象,无栈内存来指向的对象。是对象定义的一种简写格式。
new Car();
2、①当对象对方法仅进行一次调用的时候,就可以简化为匿名对象。
看new,只要出现new,证明要开辟新的对内存空间,就是新对象。
3、为何此处要说对方法,而不是说对成员变量?
运行结果:0...null
在调用下一个匿名对象语句前,上一个匿名对象就已经变成垃圾了。你用匿名对象改了一个成员变量内容。还没等用,他就已经是垃圾了。这毫无意义。
4、②匿名对象可以作为实际参数进行传递。
此时这个匿名对象变垃圾吗?
不变,因为c在栈内存中接收了它。相当于Car c=newCar();
show方法弹栈后他才变垃圾。
day06 12-面向对象-基本数据类型参数传递图解
1、以下代码的结果是什么:
public static void main(String[] args) {
int x=3;
show(x);
System.out.println("x="+x);
}
public static void show(int x){
x=4;
}
此x非彼x。show方法中的x,始终是他参数列表的x,这个参数x是show方法中的局部变量。
show方法中隐藏了一个return,一遇到return,函数结束,弹栈,彻底离开栈内存。
运行结果x=3。打印完之后main方法弹栈。
1、始终记得,函数的参数列表中的参数,是本方法所在栈内存区域中的局部变量。
day06 13-面向对象-引用数据类型参数传递图解
1、以下代码的运行结果是什么?
public class Demo {
int x=3;
public static void main(String[] args) {
Demo d=new Demo();
d.x=9;
show(d);
System.out.println(d.x);
}
public static void show(Demo d){
d.x=4;
}
}
2、
show(d);这一句其实相当于Demo d=d;是把主方法中new的d这个对象的堆内存指向,给了show方法栈内存的参数(局部变量)Demod。
运行结果:4
2、局部变量,有自己的栈所属,与堆内存无关。成员变量有自己的堆所属,任何一个指向他的栈内存都可以修改里面的数。多个栈内存指向操作的是同一个堆内存成员变量。
day06 14-面向对象-封装-代码示例
1、封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
2、private(私有)关键字。私有的东西,仅可以在本类中有效,只可以在本类中被调用。
3、封装原则:
(1)将不需要对外提供的内容都隐藏起来。
(2)把属性都隐藏起来,提供公共方法对其访问。