面向对象编程
java的核心思想就是OOP Object-oriented Programming.
面向对象的本质就是:以类的方式组织代码,以对象来组织(封装)数据。
对红字的解释:
- 解决复杂问题,要首先从宏观把握,分析框架和流程,此时需要面向对象的思路
- 具体到微观操作,也就是具体的实现过程,就需要面向过程的思路
总结:宏观---面向对象;微观---面向过程
这里说一些关于封装、继承和多态的浅薄的理解:
封装:字面理解,就是把变量包装起来,为了不让别人操作,留一个口自己操作;
继承:字面理解,儿子会继承父亲的所有东西,Java的继承也是如此,B类(子类)继承A类(父类),那么B类(子类)得到A类(父类)的所有东西;
多态:有两个人做同一样事情,由于人的差异,做事的结果肯定会不同。人是一个对象,这个对象有一个方法是学习,但是张三和李四都去执行学习这个方法,但是他们的学习能力不同,所以他们的成绩也不同。
从现实的角度,我们的思路是先有了众多的对象,我们把它们抽象成类。对象是具体的,类是抽象的;
从设计程序的角度,我们会先设计出一个类,然后再使用这个类的对象(new一个)。类是对象的模板。
基础知识回顾
Post Script:大型的java项目只有一个main方法,而我建立了很多packag,每个packag里面又有很多main方法,这是为了初期学习java测试程序方便
下面用一个实际的程序进行说明:
break是结束一层循环,return是结束一个方法并返回一个值
- 同一个包里面的方法可以互相调用,但是静态方法和非静态方法的调用方式有所区别
如上图所示,同一个package里面的方法可以直接调用,Demo08里面的PrintArray方法是static的,所以在Demo09里面可以使用“类名.方法名”进行调用,也可以先进行实例化,然后使用实例化的对象进行调用。
如上图所示,同一个package下的类可以互相调用,但是Demo06里面的factorial方法是非静态方法,所以不能直接使用“类名.方法名”进行调用,必须先实例化,然后使用实例化的对象进行调用。
- 当然不在一个package里面的类也可以互相调用其他类的方法,但是需要导入方法所在的package,调用原则同上。
- 当然,
也是可行的。
下面说一个特殊情况:
package oop;
public class Demo01 {
public static void main(String[] args) {
}
public static void a() {
b();//这里显示不出来,实际上这个语句是报错的
}
public void b() {
}
}
因为static和类Demo01一起加载的,时间片很早,类Demo01存在的时候,a方法就已经存在了,但是类Demo01实例化之后方法b才存在,也即就是说,一个已经存在的方法区调用一个不存在的方法,那肯定报错。
值传递和引用传递,下面是值传递:
package oop;
public class Demo02 {
public static void main(String[] args) {//java的值传递
int a=10;
System.out.println(a);
reverse(a);
System.out.println(a);
}
public static void reverse(int a) {
a=-10;
}
}
我们看到两次的输出结果都是10,a的值并未改变,这就是java的“值传递”。
- 在运行reverse方法之前,a=10毫无疑问,public static void reverse(int a)里面的a是形式参数,他只是一个占位符,传递的过程是把原来a所在内存的数值传递给形式参数a(并没有给形式参数a操作原来a所在内存的权限),所以reverse方法里面对a进行赋值并不能改变原来a 的值。
- 可以把形式参数a幻城不同于a 的任意一个符号或者字符串,更容易理解
下面是引用传递:
package oop;
public class Demo03 {
public static void main(String[] args) {//java的引用传递
Person person = new Person();
person.name = "jj";//person是Person的一个对象,这是一个具体的人,可以改变其属性
System.out.println(person.name);
change(person);
System.out.println(person.name);
}
public static void change(Person person) {
person.name = "juanjuan";
}
}
class Person {//定义了一个Person类,它有一个属性:name
String name;
}
运行结果:
分析:引用传递和值传递使用了完全相同的操作,区别只有值传递使用的是内部类int,而引用传递使用的是自定义的Person类,那么重点来了,值传递传递的是变量内存中存储的数值,这一点跟C语言的函数的形参传递参数是相同的道理,而引用传递传递的是实实在在的Person类的对象的属性,类似于把指向对象的属性的指针传递给了方法中的参数,此时方法也具有了读写原来Person类的对象的属性的能力。这就是面向对象的编程的魅力所在!
完全相似的操作(unbelievable):