Java 面向对象之初识面向对象及方法回顾和加深
java面向对象
1.初始面向对象
1.1 面向过程与面向对象
-
面向对象是整体的框架,面向过程是具体的流程。
- 如果程序中语句非常多,那么我们将其封装成方法;如果程序中变量比较多,那么我们将其封装成结构体。属性加方法构成一个类。
- 面向过程是一个人完成一个巨大的工程比如建一个房子,自己一个人从头做到尾,而面向对象是一个总设计师来分配给好多个人,有的人负责买材料,有的人负责构造房屋图纸,有的人负责施工,各个部分合起来完成这栋房子的建设,每个人都是一个对象,将一个大问题分化成好多小问题,让每个小问题再面向对象,最后各个部分完成之后,总的任务就完成了,如果某个人(某个对象)出了问题,直接就可以找这个部分的负责人。
-
面向过程思想
- 步骤清晰简单,第一步做什么,第二步做什么…
- 面对过程适合处理一些较为简单的问题
-
面向对象思想
- 物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考。最后,才对某个分类下的细节进行面向过程的思索。
- 面向对象适合处理复杂的问题,适合处理需要多人协作的问题。
- 对于描述复杂的事物,为了从宏观上把握、从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。但是,具体到微观操作,仍然需要面向过程的思维去处理。
1.2 什么是面向对象
-
面向对象编程(Object-Oriented Programming, OOP)
-
面向对象编程的本质就是: 以类的方式组织代码,以对象的形式封装数据。
- 类是抽象的,对象是具体的实物,是类的实现
-
核心:抽象
-
三大特性:
- 封装
- 继承
- 多态
-
从认识论角度考虑是先有对象后有类。对象,是具体的事物。类,是抽象的,是对对象的抽象。
-
从代码运行角度考虑是先有类后有对象。类是对象的模板。
2.方法的回顾和调用
-
方法的定义
-
修饰符:public表示是方法或变量是公共的,所有人都可以访问这个方法,static表示该方法或者变量是静态的,可以直接调用,而不需要去创建对象来调用。
-
返回类型
-
break 和 return 的区别
break跳出循环或者结束switch
continue会跳过此次循环,开始执行下一个循环
return结束方法体,只要遇到return就会退出方法体,其后方法体内的所有代码都不会被执行 -
方法命名规则: 驼峰命名法,且要见名知义。
-
参数列表: (参数类型 参数名)可有多个(...)。
-
抛出异常: 后面讲解
-
-
IDEA中分屏对比操作: 点击要并列的程序,点击鼠标右键,选择split and move right,就可以对比着敲某个程序
2.1 方法的定义代码演示:
package oopdemo01.demo01;
import java.io.IOException;
public class Demo01 {
//main 方法 一个类中只有一个main方法,我们在类中定义方法,通过调包来使用,一般不是每一个类中都有main方法的,学习阶段的main方法只是为了方便运行。
public static void main(String[] args) {
}
/*
* 修饰符 返回值类型 方法名(...){
* //方法体
* return 返回值;
* }
*
* */
//方法可以有返回值,返回值需要一个同类型的变量来接;也可以没有返回值,比如直接打印输出一些东西
//String:返回一个字符串
public String sayHello(){
return "hello world";
}
//返回一个空值
public void hello(){
return; //return结束方法,返回一个结果
//遇到return就退出方法体,return后的语句都会被报错;
}
public int maxPrint(int a,int b){
return a>b ? a:b; //三元运算符
}
//读文件,抛出异常
public void readFile(String file)throws IOException {
//抛出异常,这才是一个完整的方法
}
}
运行结果
hello world
i = 5
———————————————————————————————————————————————————————————
3.方法的调用:递归
-
非静态方法: 真实开发中都是非静态的方法调用,需要创建一个新的对象;
- 同一包下不同类中的方法调用,需要new一个该类的对象,通过对象名.方法名来调用非静态方法。
-
静态方法
-
同一包下不同类中静态方法的调用,直接对象名.方法名
-
方法调用的几种场景:非静态方法位于类下,主函数main之外
-
(1).同一类下的非静态方法可以相互调用
-
(2).同一类下,主函数main之外的静态方法也可以相互调用
-
(3).同一类下的静态方法不可以调用非静态方法,因为静态方法随着类加载,而非静态方法只有实例化,即new出一个对象之后才能被加载
-
-
形参和实参
-
值传递和引用传递
-
this关键字: (代表当前这个类)
3.1 静态方法和非静态方法代码演示
package oopdemo01.demo01;
public class Demo02 {
public static void main(String[] args) {
/*静态方法 static
调用: 类名.方法名
非静态方法
1.实例化这个类 new+类名+.方法名
2.对象类型 对象名 = 对象值 ;
对象.方法名
*/
//同一包下不同类中静态方法的调用,直接对象名.方法名
Student.say();//静态方法直接 类名.方法名
new Student().hello();//非静态方法
//真实开发中都是这样的非静态的方法调用,需要创建一个新的对象
//同一包下不同类中的方法调用,需要new一个该类的对象,通过对象名.方法名来调用非静态方法。
Student student = new Student();//非静态方法
student.hello();
}
}
package oopdemo01.demo01;
public class Student {
// 静态方法 say
public static void say(){
System.out.println("学生说话了");
}
//非静态方法 hello
public void hello(){
System.out.println("你好美女");
}
//同一类下的非静态方法可以相互调用
public void a(){
b();
}
public void b(){
}
//static 方法不能调用不是静态方法的方法
//同一类下的静态方法不可以调用非静态方法,因为静态方法随着类加载,而非静态方法只有实例化,即new出一个对象之后才能被加载
public static void c(){
//d(); 会报错 由于被static 修饰和会和类一起加载 而没被static 修饰 对象实例化之后才存在 没New时,d方法还不存在
}
public void d(){
c();// 可以调用C 方法
}
}
运行结果
学生说话了
你好美女
你好美女
3.2 形参和实参代码演示
package oopdemo01.demo01;
public class Demo03 {
public static void main(String[] args) {
Demo03 demo03 = new Demo03();
//实际参数和形式参数的类型要对应
int print = demo03.maxPrint(2, 3);//实际参数
System.out.println("print = " + print);
}
// 返回值为int 类型
public int maxPrint(int a,int b){//形式参数
return a+b;
}
}
运行结果
print = 5
3.3 值传递和引用传递代码演示
package oopdemo01.demo01;
public class Demo04 {
//值传递
public static void main(String[] args) {
int a=10;
System.out.println(a);//10
Demo04.chang(a);
System.out.println(a);//10 这里两次a输出的值都为10;因为main方法中的a是实参,change中的num是形参,实参并没有改变。
}
//返回值为空
public static void chang(int num){
num=11;
}
}
运行结果
10
10
package oopdemo01.demo01;
//引用传递:引用传递的对象是对象,本质还是值传递。
//引用本来就不是一种基本数据类型,new出的一个对象,将对象名作为参数传入方法,会改变其下的某些属性值,person是一个引用,其代表了创建对象的存储在堆中的位置,该对象的所有属性,方法都存在堆中,通过对象名对其进行索引,直接把对象名这种引用数据类型当成参数,就是直接对堆中的数据(属性)进行操作,直接更改了属性值
public class Demo05 {
public static void main(String[] args) {
Person person = new Person();
System.out.println(person.name);//null
Demo05.chang(person);
System.out.println(person.name);//an
}
//定义了一个person类,有个属性:name
public static void chang(Person person){
//person是一个对象:指向的--->Person person = new Person();这是一个具体的人可以改变属性
person.name="an";
}
}
//一个.java文件下可以有多个class类,但是只能有一个public class公共类
class Person{
String name;
}
运行结果
null
an