Java学习-面向对象01初识面向对象
初识面向对象
Java的核心思想就是面向对象编程(OOP)
面向过程和面向对象
- 面向过程思想
- 步骤清晰简单,第一步做什么,第二步做什么......
- 面向过程适合处理一些较为简单的问题
- 面向对象思想
- 物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考。最后,才对某个分类下的细节进行面向过程的思索。(面向对象的具体实现是需要面向过程的)
- 面向对象适合处理复杂的问题,适合处理需要多人协作的问题!
- 对于描述复杂的事物,为了从宏观上把握,从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。但是,具体到微观操作,仍然需要面向过程的思路去处理。
什么是面向对象
-
面向对象编程(简称OOP)
-
面向对象编程的本质就是:以类的方式组织代码,以对象的组织(封装)数据。
-
抽象
-
三大核心特征
- 封装
- 继承
- 多态
-
从认识论角度考虑是先有对象后有类。对象是具体的事物,类是抽象的,是对对象的抽象。
-
从代码运行的角度考虑是先有类后有对象。类是对象的设计模板,或者可以理解成设计图。
回顾方法以及加深对方法的理解
我们在正式学习面向对象之前先来回顾一下方法
-
方法的定义
- 修饰符
- 返回类型
- break和return的区别
- 方法名:注意命名规范,要见名知意
- 参数列表:包括参数个数,类型和排列顺序
- 异常抛出:后面讲解
-
方法的调用:递归(重点)
- 静态方法
- 非静态方法
- 形参和实参
- 值传递和引用传递
- this关键字:表示当前对象
代码示例(1)
package com.oop.www.demo01;
import java.io.IOException;
//Demo01类
public class Demo01 {
//main方法
public static void main(String[] args) {
}
/*
参数可有可无,还有可变参数形式为(int ... a)
修饰符 返回值类型 方法名(参数类型 参数名...){
方法体
return 返回值;
}
*/
//return结束方法,返回结果,而break是跳出switch语句和结束循环
public String sayHello(){
return "Hello,World!";
//return表示方法结束,后面不能再跟其它语句
//System.out.println(1);
}
public void print(){
return;//单独使用,卫语句结构,直接结束方法
}
public int max(int a,int b){
return a>b ? a:b;//三元运算符
}
//异常抛出
//例如:数组下标越界(Arrayindexoutofbounds)
public void readFile(String file) throws IOException {
//throws表示方法可能抛出异常,异常处理交给调用者处理
}
}
代码示例(2)
package com.oop.www.demo01;
public class Demo02 {
public static void main(String[] args) {
//实例化学生类,创建学生对象
//对象类型 对象名 = 对象值;
// Student student = new Student();
// student.say();
}
//静态方法,与类一起加载
public static void a(){
//报错
//b();
}
//类实例化创建对象后才存在(非静态方法)
public void b(){
}
}
Student.java
package com.oop.www.demo01;
//学生类
public class Student {
//非静态方法
public void say() {
System.out.println("学生说话了");
}
}
代码示例(3)
package com.oop.www.demo01;
public class Demo03 {
public static void main(String[] args) {
//实参和形参类型要对应!
int add = Demo03.add(1,2);
System.out.println(add);
}
public static int add(int a,int b)
{
return a+b;
}
}
代码示例(4)
package com.oop.www.demo01;
//值传递:Java属于值传递,值传递是指方法调用时,传递给方法的参数值会被复制一份给方法的参数变量,方法对参数变量的修改不会影响到调用者。
public class Demo04 {
public static void main(String[] args) {
int a = 1;
System.out.println(a);//1
Demo04.change(a);
System.out.println(a);//1
}
//无返回值,返回值为空
public static void change(int a) {
a = 10;
}
}
与前面代码做对比
package com.oop.www.demo01;
//引用传递:跟对象有关,本质上还是值传递(记住Java是值传递,不是引用传递!)
public class Demo05 {
public static void main(String[] args) {
Person p = new Person();
System.out.println(p.name);//null
Demo05.change(p);
System.out.println(p.name);//张三
}
//Person是一个对象:指向-->Person p = new Person();这是一个具体的人(具体的个体),可以改变属性!
public static void change(Person p){
p.name = "张三";
}
}
//定义一个Person类,有一个属性:name
class Person{
String name;//null
}
类与对象的关系
-
类是一种抽象的数据类型,它是对某一类事物整体描述/定义,但是并不能代表某一个具体的事物。
- 动物、植物、手机、电脑......(抽象类)
- Person类,Pet类等,这些类里面包括一些就是用来描述/定义某一类具体的事物应该具备的特征和行为
-
对象是抽象概念(抽象类)的具体实例
-
张三就是人的一个具体实例,张三家里的旺财就是一个狗的一个具体实例。
-
能够体现出特点,展现出功能的是具体的实例,而不是一个抽象的概念。
-
我们可以将以上的思想转换为代码实现!
创建与初始化对象
-
使用new关键字创建对象。
-
使用new关键字创建的时候,除了分配内存空间之外,还会给创建好的对象进行默认的初始化以及对类中构造器的调用。
-
类中的构造器也被称作构造方法,是在进行创建对象的时候必须要调用的,并且构造器有以下两个特点。
- 必须和类的名称相同。
- 必须没有返回值类型,也不能写void。
-
构造器必须要掌握(重点)
这里说个题外话,有很多人会问学编程究竟有什么好处?我个人认为最大的好处就是可以对世界进行很好的建模!因为程序本身来源于生活,我们学习程序又可以进一步让我们以更为宏观以及微观的角度去理解世界!
代码示例
Application.java
package com.oop.www.demo02;
//一个项目应该只存有一个main方法
public class Application {
public static void main(String[] args) {
//类:抽象的
//类实例化后会返回一个自己的对象!
//Student对象就是一个Student类的具体实例!
Student xiaoming = new Student();
Student xiaohong = new Student();
xiaohong.name = "小红";
xiaohong.age = 18;
System.out.println(xiaoming.name);//null
System.out.println(xiaoming.age);//0
System.out.println(xiaohong.name);//小红
System.out.println(xiaohong.age);//18
}
}
Student.java
package com.oop.www.demo02;
//学生类
public class Student {
//属性:字段,或者叫成员变量,本质上就是变量
String name;
int age;
//方法
public void study() {
//this:当前对象,当前对象就是Student对象
System.out.println(this.name + "在学习");
}
}
构造器
Application.java
package com.oop.www.demo02;
//一个项目应该只存有一个main方法
public class Application {
public static void main(String[] args) {
//new实例化类,创建了一个对象
//Person p = new Person();
Person p = new Person("小明");
//无参构造器里面什么都不写
//System.out.println(p.name);//null
//无参构造器里面写 this.name = "张三";
//System.out.println(p.name);//张三
//调用有参构造器
System.out.println(p.name);//小明
}
}
Person.java
package com.oop.www.demo02;
public class Person {
//一个类即使什么都不写,也会默认存在一个构造器(构造方法)
String name;
//显示的定义构造器
//实例化初始值
//构造器作用:
//1.创建对象(使用new关键字本质是在调用构造器)
//2.用来初始化值
//无参构造器
public Person(){
this.name = "张三";
}
//有参构造器:一旦定义了有参,无参必须显示定义
public Person(String name){
this.name = name;
}
//快捷键 Alt+Insert(记住,后面都会用到!)
//选择Constructor,无参下面选择Select None,有参选OK
//有了有参,无参需要手动添加上!
/*
总结:
构造器
1.与类名相同
2.没有返回值,也不能写void
作用:
1.创建对象(使用new关键字本质是在调用构造器)
2.初始化对象的值(属性)
注意点:
定义有参构造器后,无参构造器就没有了,需要显示定义上!
*/
}