Java面向对象详解

面向对象

什么是面向对象

  • 面向过程思想(线性思维)

    • 步骤清晰简单,每一步去指定计算机做什么
    • 面向过程适合处理一些比较底层的问题(C语言,汇编等)
  • 面向对象思想(分类思维)

    • 物以类聚,分类的思想模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考。最后,才对某个分类下的细节进行面向过程的思索
    • 面向对象适合处理复杂的问题,适合处理需要多人协作的问题!
  • 抽象——对于描述复杂的食物,为了从宏观上把握、从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。但是,具体到微观操作,仍然需要面向过程的思路去处理。

  • 面向对象编程(OOP,Object-Oriented Programming)

  • 面向对象编程的本质:以类的方式组织代码,以对象组织(封装)数据

  • 三大特性:

    • 封装
    • 继承
    • 多态
  • 从认识论角度考虑是 先有对象后有类。对象,是具体的事物;类,是抽象的,是对对象的抽象

  • 从代码运行的角度考虑是先有类后有对象。类是对象的模板

回顾方法的定义

方法的定义:

  • 修饰符
  • 返回类型
  • 方法名
  • 参数列表(参数类型 参数名)以及…可变长参数
  • 异常抛出

方法的调用:

  • 静态方法(类方法,静态方法和类一起加载,类存在静态方法便存在)
  • 非静态方法(类实例化之后才存在,new之后)
  • 形参和实参(实际参数的类型和形式参数的类型要一致)
  • 值传递和引用传递
  • this关键字
package com.oop.demo01;
//引用传递:对象,本质还是值传递
public class Demo04 {
   
    public static void main(String[] args) {
   
        Person person = new Person();
        System.out.println(person.name);//null
        //类的hashcode,可以看成是对象的地址
        System.out.println("对象的地址:"+person);
        Demo04.change(person);//改变对象中的属性
        //还会是原来类的hashcode吗?
        System.out.println("改变对象属性后的对象地址:"+person);
        System.out.println(person.name);//Leo
        //改变传入的对象的具体地址
        //还会是原来类的hashcode吗?
        Demo04.change2(person);
        System.out.println("改变对象后对象地址:"+person);
        System.out.println(person.name);//Leo
    }
    public static void change(Person person){
   
        //person是一个对象:指向-->Person person = new Person();这是一个具体的人,可以改变属性
        person.name="Leo";
    }
    public static void change2(Person person){
   
        //重新具体化这个对象,是否会改变实参的hashcode
        person = new Person();
        person.name = "Sven";
    }
}
//定义一个Person类,有一个属性:name
class Person{
   
    String name;
}

null
对象的地址:com.oop.demo01.Person@1b6d3586
改变对象属性后的对象地址:com.oop.demo01.Person@1b6d3586
Leo
改变对象后对象地址:com.oop.demo01.Person@1b6d3586
Leo

总结:因此我们可以看到,如果传入的形参后,方法中改变了对象的某个熟悉,那么看起来好似引用传递,其实改变的并不是对象,而是对象的属性;而我们改变对象后,在改变改变后对象的属性,可以看到,实参的对象并没有改变,而属性也没有改变。所以Java的本质一直都是值传递,而非引用传递

类与对象的创建

类与对象的关系
  • 类是一种抽象的数据类型,它是对某一类事物整体描述/定义,但是并不能代表某一个具体的事物

  • 对象是抽象概念的具体实例

创建与初始化对象
  • 使用new关键字创建对象
  • 使用new关键字创建的时候,除了分配内存空间之外,还会给创建好的对象进行默认的初始化以及对类中构造器的调用
  • 类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的,并且构造器有一下两个特点:
    • 必须和类的名字相同
    • 必须没有返回类型,也不能写void
  • 构造器必须要掌握

构造器详解

package com.oop.demo01;
//java——>class
public class Person {
//一个类即使什么都不写,它也会存在一个方法
//显示的定义构造器
String name;
int age;

package com.oop.demo02;
//java——>class
public class Person {
   
//一个类即使什么都不写,它也会存在一个方法
    //显示的定义构造器
    String name;
    int age;

    public Person(String name, int age) {
   
        this.name = name;
        this.age = age;
    }

    //实例化初始值
    //1、使用new关键字,本质是在调用构造器
    //2、用来初始化属性值
    public Person(){
   

    }
    //有参构造:一旦定义了有参构造,无参构造就必须显示定义
    public Person(String name){
   
        this.name=name;
    }
    //alt + insert快捷键,可快速生成构造器
}
/*
//new 实例化了一个对象
        Person person = new Person("Leo",29);
        System.out.println(person.name);
        System.out.println(person.age);
 */

创建对象内存分析

package com.oop;

import com.oop.demo03.Pet;

public class Application {
   
    public static void main(String[] args) {
   
        Pet dog = new Pet();
        dog.name = "旺财";
        dog.age = 3;
        dog.shout();
        System.out.println(dog.name);
        System.out.println(dog.age);
        Pet cat = new Pet();
    }
}
package com.oop.demo03;

public class Pet {
   
    public String name;
    public int age;
    public void shout(){
   
        System.out.println("叫了一声");
    }
}

Java面向对象详解_第1张图片

类与对象小结

  1. 类与对象的关系——类是一个模板,对象是一个具体的实例

  2. 方法——定义在类中,定义格式以及如何调用,可见方法部分笔记

  3. 引用类型和8大基本类型,对象是通过引用来操作的:栈->堆

  4. 属性,即字段Field,默认初始化

    ​ 数字: 0/0.0

    ​ char:u0000

    ​ boolean: false

    ​ 引用:null

  5. 对象的创建和使用

    new关键字和构造器需要掌握,Person leoDolphin = new Person();

    对象的属性leoDolphin.name

    对象的方法leoDolphin.speak()

  6. 类里面包括属性和方法

封装详解

  • 该露的露,该藏的藏——程序设计要追求“高内聚,低耦合”。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合就是仅暴露少量的方法给外部使用
  • 封装(数据的隐藏)——通常,应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,我们称信息隐藏
  • 属性私有,一般通过get/set方法操作
package com.oop.demo04;
//类,属性私有private
/*封装的意义
1、提高程序的安全性,保护数据
2、隐藏代码的实现细节
3、统一接口
4、提升系统的可维护性
 */
public class Student {
   
    //属性私有
    private String name;//姓名
    private int id;//学号
    private char sex;//性别
    private int age;
    //提供一些可以操作这个属性的方法
    //提供public的get/set方法
    //get获得
    //set设置,可以在方法中加入对属性赋值时的一些校验
    //使用alt+insert快捷键快速生成get/set方法
    public String getName() {
   
        return name;
    }

    public void setName(String name) {
   
        this.name = name;
    }

    public int getId() {
   
        return id;
    }

    public void setId(int id) {
   
        this.id = id;
    }

    public char getSex() {
   
        return sex;
    }

    public void setSex(char sex) {
   
        this.sex = sex;
    }

    public int getAge() {
   
        ret

你可能感兴趣的:(Java,java,多态,抽象类,面向对象编程,封装)