目录
一、什么是面向对象
面向对象编程(OOP);
本质就是:以类的方式组织代码,以对象的组织(封装)数据。
面向对象有三大特性:封装,继承,多态
从认识论角度考虑是先有对象后有类。对象,是具体的事物。类,是抽象的,是对对象的抽象
从代码运行角度考虑是先有类后有对象。类是对象的模板
二、方法的调用补充
1.静态方法
static:
可以直接调用
例如:在Student类中定会一个静态方法
public class Student { //静态方法 public static void say(){ System.out.println("学生说话了"); } }
在main方法中能够直接调用
Student.say();
2.非静态方法
对于非静态方法,main方法不能直接调用,需要先实例化类(new)
对象类型 对象名 = 对象值 ;
例如:在Student类中定会一个非静态方法
public class Student { //非静态方法 public void say(){ System.out.println("学生说话了"); } }
需要先实例化类(new) 对象类型 对象名 = 对象值 ;然后才可以调用
Student student = new Student(); student.say();
3.值传递与引用传递
值传递比较常见好理解,这块主要说一下引用传递
引用传递:对象,本质还是值传递
例如:
首先先创建一个类Person
//定义了一个Person类,有一个属性:name class Person{ String name;//null }
正常的值传递如果方法没有返回值的话,是不会改变属性的
引用传递中 person是一个对象:指向的是 Person person = new Person();这是一个具体的人,可以改变属性!(他是一个具体的对象)
public class Demo05 { public static void main(String[] args) { Person person = new Person(); System.out.println(person.name);//null Demo05.change(person); System.out.println(person.name);//xiaoyi } public static void change(Person person){ //person是一个对象:指向的是 Person person = new Person();这是一个具体的人,可以改变属性! person.name="xiaoyi"; } }
4.注意点
首先在一个类中写两个方法 a , b
如果方法a和方法b都为非静态方法,那么a可以直接调用b
如果方法a为静态方法,b为非静态方法,那么a不能直接调用b
static 修饰的方法是随着类一起加载的
非静态方法是类实例化后才存在的
public class Demo02 {
public void a(){
b();
}
//类实例化 之后才存在
public void b(){}
}
三、类和对象
1.类和对象的关系
类是一种抽象的数据类型,它是对某一类事物整体描述/定义,但不能代表某一个具体的食物
对象是抽象概念的具体实例
2.创建和初始化对象
使用new关键字创建对象
使用new关键字创建的时候,除了分配内存空间外,还会给创建好的对象进行默认的初始化以及对类中构造器的调用(构造器在面向对象02中详细说明)
3.创建和初始化对象举例
先创建一个学生类,其中属性有name(初始化为null) age(初始化为0)
//学生类 public class Student { //属性:字段 String name;//默认null int age;//0 //方法 public void study(){ System.out.println(this.name+"在学习"); } }
主方法如下:
public static void main(String[] args) { //类:抽象的 ,实例化 //类实例化后会返回一个自己的对象 //student对象就是一个Student类的具体实例! Student xiaoyi = new Student(); Student hanfei = new Student(); xiaoyi.name="小仪"; xiaoyi.age=22; hanfei.name="悍匪"; hanfei.age=21; xiaoyi.study(); System.out.println(xiaoyi.name); System.out.println(xiaoyi.age); System.out.println(hanfei.name); System.out.println(hanfei.age); }