学习时间:
2020-11-18
学习内容:
面向对象思想
A:面向过程思想概述
我们完成一个需求的步骤:首先是搞清楚我们要做什么,然后在分析怎么做,最后我们再代码体现。
一步一步去实现,而具体的每一步都需要我们去实现和操作。这些步骤相互调用和协作,完成我们的需求。
在上面的每一个具体步骤中我们都是参与者,并且需要面对具体的每一个步骤和过程,这就是面向过程最直接的体现。
那么什么是面向过程开发呢? 面向过程开发,其实就是面向着具体的每一个步骤和过程,把每一个步骤和过程完成,然后由这些功能方法相互调用,完成需求。
面向过程的代表语言:C语言
B:面向对象思想概述
当需求单一,或者简单时,我们一步一步去操作没问题,并且效率也挺高。
可随着需求的更改,功能的增多,发现需要面对每一个步骤很麻烦了。这时就开始思索,
能不能把这些步骤和功能在进行封装,封装时根据不同的功能,进行不同的封装,功能类似的封装在一起。
这样结构就清晰了很多。用的时候,找到对应的类就可以了。这就是面向对象的思想。
C:面向对象思想特点
a:是一种更符合我们思想习惯的思想 懒人思想
b:可以将复杂的事情简单化
c:将我们从执行者变成了指挥者
角色发生了转换
简而言之,面向对象可以简单地理解为,为了实现这个目标“不择手段”,不考虑为什么,只关心是否实现。
类和对象
我们如何描述现实世界事物
举例: 描述学生事物
姓名 , 年龄 , 性别 ....
学习 , 吃饭 , 睡觉 ....
属性: 就是该事物的描述信息
行为: 就是该事物能够做什么
我们学习编程语言,就是为了模拟现实中的事物,我们学习的Java语言最基本单位是类,所以,我们就应该把事物用一个类来体现。
由此我们就得到了现实中的事物和类的对应关系
事物 ----------------- 类
属性 ----------------- 成员变量
行为 ----------------- 成员方法
C:定义类其实就是定义类的成员(成员变量和成员方法)
a:成员变量 和以前定义变量是一样的,只不过位置发生了改变。在类中,方法外。
b:成员方法 和以前定义方法是一样的,只不过把static去掉,后面在详细讲解static的作用。
D:类和对象的概念
a:类:是一组相关的属性和行为的集合
b:对象:是该类事物的具体体现
c:举例:
类 学生
对象 班长就是一个对象
在面对一类事物的时候,我们通常用这个类中的某一个具体对象体现。
比如:
电脑这个类,它有它的属性,如品牌,颜色,价格。。。这些东西在某一刻是不可变的,是属于他的属性(Java中将其抽象称为成员变量)。他还有许许多多的功能,比如上网,办公,听音乐。。。。这些是它的功能,就是可以通过它办成的事情(Java将其抽象称为成员方法)。
那么成员变量和局部变量有什么不一样呢?
成员变量和局部变量的不同之处:
A:在类中的位置不同
成员变量:在类中方法外
局部变量:在方法定义中或者方法声明上
B:生命周期不同
成员变量:随着对象的创建而存在,随着对象的消失而消失
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
C:在内存中的位置不同
成员变量:在堆内存
局部变量:在栈内存
D:初始化值不同
成员变量:有默认初始化值
局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。
注意事项:: 局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则。
这里用一个电脑类来说明:
public class Computer {
String symbol; //成员变量
String name;
int price;
public void Internet(){ //成员方法
System.out.println("功能一:上网");
}
public void Learn(){
System.out.println("功能二:学习");
}
public void Music(){
System.out.println("功能三:音乐");
}
}
public class Test {
public static void main(String[] args) {
Computer com = new Computer ();
com.name="电脑一号";
System.out.println("电脑的名字是"+com.name);
com.price=10086;
System.out.println("电脑的品牌是"+com.price);
com.symbol="联想";
System.out.println("电脑的价格是"+com.symbol);
com.Internet();
com.Music();
com.Learn();
}
}
内存图分析:
匿名对象
A:什么是匿名对象
就是没有名字的对象
B:匿名对象应用场景
a:调用方法,仅仅只调用一次的时候。
b:匿名对象可以作为实际参数传递
public class MyTest {
public static void main(String[] args) {
Dog dog = new Dog();
dog.name="小白";
dog.eat();
dog.eat();
dog.eat();
System.out.println("====================");
//匿名对象:没有名字的对象,他可以调用方法,可以成员变量
//每new 一次都是一个新的对象
//1.如果这个方法,仅仅只想调用一次,你可以使用匿名对象来调用。
//2.匿名对象可以作为参数来传递
new Dog(); //匿名对象1
new Dog().eat(); //匿名对象2
new Dog().eat(); //匿名对象3
new Dog().eat(); //匿名对象4
new Dog().name="小黑";
System.out.println("===========================");
Dog dog1 = new Dog();
test(dog1,10);
System.out.println(dog1.name); //null
System.out.println(dog1.age); //10
System.out.println("===========================");
//匿名对象可以作为参数传递
Dog dog2 = new Dog() ;
test(new Dog(), 20);
test(dog2, 20);
test(dog2, 20);
System.out.println(dog1.name); //null null
System.out.println(dog1.age); //20 10
}
public static void test(Dog dog,int age){
dog.age=age;
System.out.println(dog.name+"====");
System.out.println(dog.age+"=====");
}
}
public class Dog {
String name;
int age;
public void eat(){
System.out.println("狗吃骨头");
}
}
值得注意的是每new一次,就会出现一个新的匿名对象。