07-面向对象基础 (抽象)

image.png

引言

面向对象是一种编程思想,是程序员思考问题的思维方式,以此为编程思想指导的程序设计,又称为面向对象程序设计( Object-Oriented Programing ,OOP,OOD,OOA ),面向对象设计思想,关注点为对象( 任何事物,万事万物 ),而非具体过程。

面向过程编程思想:也是一种编程思维,它关注的就是问题解决的步骤和实现过程,这种编程思维往往涉及到细节数据结构和算法本身。

对于不同编程思想,有不同的语言,C语言就是典型面向过程的设计语言,Java 就是面向对象的程序设计语言。

自我理解:

面向过程设计:事物的表现形式,我们只是把表现出来的形式,转化成 程序代码。(它 当事物发生的时候,我们才去想办法解决)
面向对象设计:根据事物的表现形式,透过表现看事物的本质, 预判事物未来的发展趋势。

事物表现形式:属性和行为(面向对象的必要条件)

一. 面向对象中的类【重点】

面向对象关注的是对象,需要先理解类是什么。

1.1 类的阐述

类,是指具有相同属性和行为的一类事物的统称,相同类型事物,都具有相同属性和行为,通过类可以来把事物进行有效划分。

1.2 类的定义

在编程实践中,类通过 class 关键字定义,通常类也是面向对象程序设计的一个单元,我们在思考问题的时候,通常也是编写一个类,通过在类中抽取这类事物的属性和行为

//定义一个类
[修饰符] class Coder{

}

1.3 类的成分

1.3.1 概括

类的抽取,往往通过属性和行为两个维度来提取。这两个维度恰好也从静态和动态两个方面对事物进行概括,属性往往描述的是事物静态的信息,行为往往就是动态方面的信息,比如描述一个人,姓名 性别 年龄等这些都是静态的信息。而看书 ,读报,撩妹 都是动态的信息,一个事物通过这方面描述几乎就可以很全面的勾勒出事物的轮廓。

  1. 属性 :存储状态,本质就是一个变量
  2. 行为 : 存储功能 ,本质就是一个方法/函数

1.3.2 属性定义语法
[修饰符] 数据类型  属性名
          String    name;
 public   String    name;

对于一个事物它的属性是非常非常多的,并不需要写完,只写你关注的,业务需要属性。

1.3.3 方法定义语法

此部分内容,在《函数》章节提过,这里定义的方法为实例方法也就是没有static

public  dataType|void method_name([ dataType var1, ...., ]){
    语句;
    [return value]
}

1.3.4 一个类的示例
class Coder{
   String name;
   int age;
   // 其他属性 .....
    
   public void sayHello(){
      System.out.println("hello");
   } 
   // 其他行为 ...... 
}
package com.qf;

/**
 * @author :_my
 * @date :Created in 2022/1/14 10:10
 * @description:类的定义
 * @modified By:`
 * @version: 1.0
 */

/**
 * [修饰符]+class+[标识符]+{}
 * 修饰符:保护的我类  访问层级(通俗讲:class 作用域不同,也权限)[public  默认  protected  private]
 * class 关键字: 定义我们的类  if 肯定条件
 * 标识符 :由我们自己定义(驼峰命名)
 * {} 一个类的作用域范围[ 我们变量和方法]
 */


public class MyObject {

// 属性----> 变量(全局变量和局部变量)
// 全局变量:放在类中,方法外 称为:全局变量
//局部边框:放在方法内或者方法的参数 称为:局部变量

    //变量的定义:[修饰符]+数据类型+标识符 +赋值符号+值(修饰符可以用class 修饰符)
    //修饰符:[public  默认  protected  private]
    //全局变量[成员变量]  “可以省略” 赋值符号 和值
     int age;
// 行为-----> 方法  [修饰符 ] +[static]+数据类型(所有类型|void) +标识符 +([参数类型])+{ [return]}
    //修饰符:[public  默认  protected  private],如果没有static 关键字 叫实例方法
    //static:如果加上static 这个方法叫 静态方法
    //返回值:数据类型(所有类型|void),如果没有返回值 你必须加上void关键字(不需要return),如果有返回值,必须和return使用;
    //标识符:看我的方法定义章节
    //([参数类型]): 传参(形参)
    //{} :代码块

    public static void main(String[] args) {


    }

    public  void myMethod(){

    }


}

二. 面向对象中的对象【重点】

2.1 对象的阐述
对象,是一类事物的具体实例,所以对象也称为类的实例,类只是描述了该类事物具有哪些属性和行为,只是一个模板,编程中,需要通过这个类模板,刻画出一个具体实例,比如,有一个Coder类它描述的是程序员类,它虽然记录了有哪些属性和方法,但是,具体的属性值是多少需要存在一个真是的载体,这个载体就是对象。比如这个程序员对象就是 张三 年龄 20 会打招呼。
对象是类的实例 类是对象的模板。 一个类可以实例化无数个对象。

2.2 对象创建
对象的创建需要通过 new 关键字来实现。

Java
复制代码

1
// 对象创建语法
2
类名 对象名 = new 类名();
3

需要 思想提升的是 ,** 咱们自己定义的类,它也是一种数据类型,且是一种自定义类型**,当然也可以完成 其他类型完成的事情,比如定义变量 ,定义参数, 作为返回值类型
只不过,使用自定义类型声明的变量,咱们通常把它叫做对象名。

class TestCoder{
   public static void main(String[] args){
      
       int    a    = 10;
       coder.name = "张三";
       coder.age = 30;
       coder.sayHello();
   }
}

2.3 对象内存分布

对象是自定义类的实例,自定义类是一种引用数据类型,所以这里和前面章节学的数组一样,对象也是一种引用数据类型,它的存储必然也分堆栈,对象本质在堆内申请空间,对象引用被存在栈里面。
图:
image.png

2.4 类与对象的关系

类和对象的关系就是,抽象与实体的关系,图纸与实物的关系,一个类可以实例化出多个对象,每个对象拥有独立的内存空间,尤其是实例属性,各自有一份。
图:
image.png

一个类可以 实例化出 N 个 多个对象

 public static void main(String[] args) {
        // 创建对象的规则:[自定义数据类型]+标识 + 赋值符号 +方法
        // 对象的组成:变量和方法,(new 关键);赋值符号左边就是变量,右边就是对象关键字和方法
        //Person xl  自定义变量(类的名字+标识符) ,它其实就一个 引用变量  int 【】 xx = new int[]
        //new 关键字 是创建对象的关键字
        //Person();方法(构造方法) //初始化我们的对象


        Person xl3 = new Person();
        Person xl = new Person("name"); //创建我实体对象 ,小李
        Person xl2 = new Person("name","sex");


        //Person xl = new Person(); //创建我实体对象 ,小李
//        Person lw = new Person(); //创建我实体对象 ,老王
//        Person xlxf = new Person(); //创建我实体对象 ,小李媳妇

//        xl.name = "小李";
//        xl.sex="男";
//
//        String msg = xl.fight("小李", "打老王");
//
//        String msg2 = xlxf.help("小李媳妇帮忙去打小李");
//
//        System.out.println(msg+","+msg2);


    }

2.5 自定义类型可以做什么?

1 定义数组
public class Dog {
    String name;
    int age;
    char gender;
    public void  bark(){
        System.out.println("一条"+age+"岁的"+gender+"狗"+name+"狂吠...");
    }
}
public class Main {

    public static void main(String[] args) {

        Dog[] dogs = new Dog[3];

        Dog d1 = new Dog();
        d1.name = "旺财";
        d1.gender ='公';
        d1.age = 3;

        Dog d2 = new Dog();
        d2.name = "来福";
        d2.gender ='公';
        d2.age = 4;

        Dog d3 = new Dog();
        d3.name = "馒头";
        d3.gender ='母';
        d3.age = 5;

        dogs[0] = d1;
        dogs[1] = d2;
        dogs[2] = d3;

        for(int i=0; i<dogs.length; i++){
            dogs[i].bark();
        }

    }
}

2 作为参数类型
/**
 * 光碟
 */
public class CD {
    //定义名字
    String movie ;
    //时长
    int time;
    //类型
    String type;

    //这里不写方法,我们认为它只是数据载体,不具备功能。
}
/**
 * DVD播放器
 * 1. 自定义类型做参数
 */
public class DVD {

    //品牌
    String brand;

    //纠错等级
    int repairLevel;

    public void play( CD cd ){
        System.out.println("影碟机:"+brand+":"+repairLevel+"级纠错功能");
        System.out.println("读碟中...请稍后..");
        try{  Thread.sleep(2000);  }catch (Exception e){   };
        System.out.println("影片:"+cd.movie);
        System.out.println("时长:"+cd.time+"分钟");
        System.out.println("类型:"+cd.type);
    }
}

3 作为返回值类型
/**
 * 自定义一个类
 * 奖品
 */
public class Prize {
       //名字
      String name;
      //加载
      double price;
}

/**
 * 人
 */
public class Person {

    String name;

    public Prize lottery(){
        //声明一个用于返回的对象
        Prize obj = null;
        Random random = new Random();
        int code =   random.nextInt(4);
        switch (code){
            case 0:
                obj = new Prize();
                obj.name = "卫生纸";
                obj.price = 4;
                break;
            case 1:
                obj = new Prize();
                obj.name = "电冰箱";
                obj.price = 4000;
                break;
            case 2:
                obj = new Prize();
                obj.name = "电饭锅";
                obj.price = 500;
                break;
            case 3:
                obj = new Prize();
                obj.name = "烧水壶";
                obj.price = 100;
                break;
        }
        return obj;
    }
}

**体会: 自定义类型 就是一种数据类型和其他类型具有相同的合法地位 , 可以定义变量 作为参数类型 返回值类型 **

demo 登录和注册

package com.qf.fq;

/**
 * @author :zgz
 * @date :Created in 2022/1/14 14:07
 * @description:用户对象
 * @modified By:`
 * @version: 1.0
 */
public class User {
    String userName;
    String passWord;

    public User(){}

    //注册
    public User(String userName,String passWord){
        //this 指定就是我们的当前对象
        this.userName = userName;
        this.passWord = passWord;
    }

    /**
     * 注册
     * @param user
     * @return
     */
    public String res(User user){
        this.userName = user.userName;
        this.passWord = user.passWord;

        return "注册成功";
    }

    public User login(String userName,String passWord){
        User user = new User();
        if(!this.userName.equals(userName)
                || !this.passWord.equals(passWord)){
            System.out.println("登录失败");
            user.userName = userName;
            user.passWord = passWord;

            return user;
        }

        user.userName = userName;
        user.passWord = passWord;

        return user;

    }

}


    public static void main(String[] args) {
        // 创建对象的规则:[自定义数据类型]+标识 + 赋值符号 +方法
        // 对象的组成:变量和方法,(new 关键);赋值符号左边就是变量,右边就是对象关键字和方法
        //Person xl  自定义变量(类的名字+标识符) ,它其实就一个 引用变量  int 【】 xx = new int[]
        //new 关键字 是创建对象的关键字
        //Person();方法(构造方法) //初始化我们的对象

        //这是第一种操作方式
        User user = new User("zs","123456");//注册信息

        user = user.login("zs","123456");//登录信息

        System.out.println(user.userName+"=="+user.passWord);

        //第二种 操作方式

        User user1 = new User();
        user1.userName = "ls";
        user1.passWord = "111111";
        user1.res(user1);   //这里也是一种注册


        user1.login("ls","111");
        System.out.println(user1.userName+"=="+user1.passWord);


    }

三. 方法重载【重点】

3.1 方法重载概念
在本节中,咱们主要讨论的是实例属性和实例方法,实例属性和实例方法指的是对象调用的属性和方法。
方法的重载指的是,在一个类中,多个方法名字相同,但是参数( 参数的个数, 参数类型,参数顺序 )不同, 与返回值类型无关。

3.2 为什么要重载呢?
因为这些方法,功能本就类似,而方法名本身就代表功能的意义,所以这些方法同名是有基础条件的,这是重情理上说的。从理性的方式上看,可以用同相同的名字来记住这个功能,同时通过不同的参数,来使用差异化的功能,说简单点就是少记忆方法名字。

//定义一个类 演员
public class Player {

    //实例属性
    String name;

    int age;

    //实例方法
    public void  play(){
        System.out.println("大家好我是"+name+"正在拍摄电视剧,我今年"+age+"岁了");
    }
 

    public void play(String movie ){
        System.out.println("大家好我是"+name+"正在拍摄"+movie+",我今年"+age+"岁了");
    }

    public void paly( double money   ){
        System.out.println("大家好我是"+name+"正在拍摄电视剧,我今年"+age+"岁了"+"我要的片酬是"+money);
    }

}

方法重载,是中现象,同一个方法名参数情况不同,方法是否构成重载与返回无关。方法重载实际上是一种多态,这种多态称为静态多态,编译时就可以确定最终调用方法

总结:方法重载要素
1、方法名相同
2、参数列表数量不同
3、参数数据类型不同

优点:方便代码维护

四.构造器【重点】

4.1 构造器作用
构造器,又叫构造方法,是类中定义的一种特殊方法,通过构造方法来实例化该类对象,也就是该类实例。

class Foo{
    String name;
    int age;
    public Foo(){
      System.out.println("Foo()");
    }
    public Foo(String name , int age){
        this.name = name;
        this.age = age;
    }
}

总结 构造器作用 **1. 创建对象 ** 2.为对象属性赋值

4.2 构造方法特点

构造方法有一下特点,需要背。

  1. 构造方法与类同名
  2. 构造方法 没有返回值类型 ,也不可写void 。
  3. 构造方法 通过 **new **调用
  4. 如果没有显示定义构造器,系统提供一个默认的无参构造,反之,一旦编写,系统不再提供。
class Coder{
   String name;
   int age;
   // 其他属性 .....
    
   public void sayHello(){
      System.out.println("hello");
   } 
   // 其他行为 ...... 
}

class TestCoder{
   public static void main(String[] args){
       Coder coder = new Coder();
       coder.name = "张三";
       coder.age = 30;
       coder.sayHello();
   }
}

4.3 构造方法重载

构造方法本质是方法,是方法就可以具备重载的特性, 一个类中之所以存在多个版本的构造器,是为了满足不同人对 对象属性初始化的要求

/**
 * 定义一个Java程序员类
 */
public class JavaCoder {
    //实例属性
    String name  ;
    int age ;
    //构造方法,也是一个方法,和实例方法一样定义在类中,通常情况大部分人的习惯,定义在属性后
    //无参数构造器
    public  JavaCoder(){
        System.out.println("构造器执行");
    }
    //有参数构造器
    public JavaCoder( String coderName  ){
        name=coderName;
    }
    //全参构造
    public JavaCoder( String coderName, int coderAge ){
        name = coderName;
        age = coderAge;
    }
    //实例方法
    public void writeCode(){
        System.out.println( "我是"+name+"今年" +age+"岁,正在写hello world  ");
    }
}

五.对象创建过程[了解]

image.png

六. this关键字【了解】

this 是一个java关键字

5.1 理解this 关键字

this 它是一个引用,这引用只能在类的内部使用,无需声明,直接使用,它指向(代表)的是当前对象,如何理解当前对象呢?当前对象指的是谁调用就指谁。

/**
 * 定义一个Java程序员类
 */
public class JavaCoder {

    //实例属性
    String name  ;
    int age ;
    
    //全参构造
    public JavaCoder(String name, int age ){
        this.name = name;
        this.age = age;
    }
    //实例方法
    public void writeCode(){
        System.out.println( "我是"+this.name+"今年" +this.age+"岁,正在写hello world  ");
    }
 
}

public class TestCoder {

    public static void main(String[] args) {

        JavaCoder coder = new JavaCoder("雷军",40);
        coder.writeCode();
        System.out.println("-----------------------");
        JavaCoder coder2 = new JavaCoder("比尔盖茨",50);
        coder2.writeCode();
    }
}

this 它的指向是变化的,不同时刻,它代表的对象是不同,也正是如此,才可以有效区分不同对象的属性。

5.2 this 的作用

通常 this 作用有两个 :

  • 第一个作用就是作为一个引用,可以访问当前对象的实例变量,和实例方法。

     比如在构造器中和方法中使用this.xxx的方式。
    
/**
 * 定义一个Java程序员类
 */
public class JavaCoder {

    //实例属性
    String name  ;
    int age ;
    
    //实例方法
    public void writeCode(){
        System.out.println( "我是"+this.name+"今年" +this.age+"岁,正在写hello world  ");
    }

}


  • 第二个作用可以指代本类中的其他构造器

代码示例

public class Car {

    String brand;
    double pl;
    double price;

    public Car( String brand ){
        this.brand = brand;
    }
    public Car( String brand ,double pl){
        //Car(brand);//报错,想法很美好,构造器不可显示调用 ,只能 new调用
        this(brand); //为了解决这个问题 this(xx)代指构造器,必须出现在构造器中的第一行
        this.pl = pl;
        //this(brand); 只能是构造器的第一行语句
    }
    public Car( String brand ,double pl,double price){
        this(brand,pl);
        this.price = price;
    }

}

七.面向对象思想实践【熟练】

案例1:志东开凯迪拉克去王朝洗浴中心

/**
 * 编写汽车类
 */
public class Car {

    String carName; //目的地

    public Car(String carName){
        this.carName = carName;
    }

    public void run(String place ){
        System.out.println(carName+"行驶到"+place);
    }
}

/**
 * 编写人类
 */
public class Person {

    String name;

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

    //驾驶行为,需要提供 必要的车  和 目的地
    public void drive( Car car , String target ){
        //开车是人的行为
        System.out.println(this.name+"开");
        //行驶时车的行为,目的地是给车使用用
        car.run( target );
    }

}

public class TestDemo {

    public static void main(String[] args) {

        //面向对象编程 对象
        // 1.创建车对象
        Car car = new Car("凯迪拉克");

        // 2.创建人对象
        Person person = new Person("志东");

        // 3.对象调用方法
        person.drive(  car, "洗浴中心");

    }
}

总结: 这个案例想要说明的是, 自定义类型也是一个类型,可以作为方法的参数类型

案例2: 张飞 用 丈八蛇矛 打 关羽

分析:这里涉及到的事物类型有 人(Hero) 武器( Weapon ) 两个类 打是人的行为方法。

Weapon.java

/**
 * 武器
 */
public class Weapon {

    //名字
    String name;

    //攻击力
    int power;

    public Weapon() {
    }

    public Weapon(String name, int power) {
        this.name = name;
        this.power = power;
    }
}

Hero.java

/**
 * 英雄类
 */
public class Hero {

    //属性
    String name;

    //这里很重要,属性既可以是基本类型,当然也可以是自定义类型。并且我们可以把武器也作为人的必要属性。
    Weapon wq;

    public Hero() {
    }

    public Hero(String name, Weapon wq) {
        this.name = name;
        this.wq = wq;
    }

    //打实例方法,接受被打的人物对象
    public void attack(  Hero  dr  ){
        //这里由于把 被打的敌人 传进来了 , dr就是被打的对象,那么可以从它身上获取名字 dr.name
        System.out.println(this.name+"使用杀伤力为"+this.wq.power+ "的"+ this.wq.name + "打" + dr.name );
    }

}

总结: 这个案例想要说明的是, 自定义类型也是一个类型,可以作为属性的类型
**Main.java**** **

public class Main {

    public static void main(String[] args) {

        //实例化武器对象
        Weapon wq1 = new Weapon("丈八蛇矛枪",1200);
        Weapon wq2 = new Weapon("青龙偃月刀",1800);

        //实例化张飞对象
        Hero zf = new Hero("张飞", wq1 );
        //实例化关羽对象
        Hero gy = new Hero("关羽", wq2 );

        //实例化刘备对象,注意 与前面两个不同,这里使用了 匿名对象,就是没有名字的对象,效果相同,主要是简化。
        Hero lb = new Hero( "刘备",    new Weapon("雌雄双剑",800) );

        //人调用打的方法传入被打的人。
        zf.attack( gy );
    }
}

案例3:小明 去动物园 看 猴子爬树 熊猫打滚

分析:此案例 涉及的事物类型 有 人(Person) 熊猫(Panda) 猴子(Monkey) 动物园(Zoo)

**Panda.java**** **

/**
 * 熊猫类
 */
public class Panda {
    String name;
    public Panda() {
    }
    public Panda(String name) {
        this.name = name;
    }
    public void gun(){
        System.out.println(name+"打滚....");
    }
}

**Monkey.java**** **

/**
 * 猴子类
 */
public class Monkey {
    String name;
    public Monkey() {
    }
    public Monkey(String name) {
        this.name = name;
    }
    public void climbTree(){
        System.out.println(this.name+"爬树...");
    }
}

**Zoo.java**** **

/**
 * 动物园
 * 动物园提供各式各样的动物对象
 */
public class Zoo {
    public Panda getPanda(){
        Panda tt = new Panda("团团");
        return tt;
    }
    public Monkey  getMonkey(){
        Monkey mm = new Monkey("悟空");
        return mm;
    }
}

Person.java

/**
 * 人看动物
 * look 方法重载,实现接受不同类型的动物
 */
public class Person {
    String name;
    public Person(String name) {
        this.name = name;
    }
    public Person() {
    }
    public void look(Panda panda  ){
        System.out.println(this.name+"看");
        //打滚是熊猫的行为,直接熊猫调用
        panda.gun();
    }
    public void look( Monkey monkey ){
        System.out.println(this.name+"看");
        //爬树是猴子的行为,直接猴子调用
        monkey.climbTree();
    }
}

总结: 这个案例突出** 方法重载的灵活性**

**Main.java**** **

public class Main {
    public static void main(String[] args) {

        //实例化动物园
        Zoo zoo = new Zoo();
        //从动物园中获得熊猫和猴子
        Panda panda = zoo.getPanda();
        Monkey monkey = zoo.getMonkey();
        //实例化人
        Person person = new Person( "小明" );
        //人看不同的动物
        person.look(panda);
        person.look(monkey);
    }
}

作业:

1、表述  什么是类  什么是对象  举例

类:是一类事物具有相同属性和行为抽象
对象:是类的实体

2、电脑  怎么概况类 什么是对象;
答:
类:是一类事物具有相同属性和行为抽象
对象:是类的实体

电脑他是所有计算机的一个抽象出来词语,根据类定义,它就是一个类
根据对象定义,笔记本电脑,台式电脑 就一个电脑实体



3、小李去打老王,媳妇出来帮忙老王  里面哪些是类  哪些是对象   哪些是属性 哪些是行为

4、李杰去洗脚 被公安局抓住,关进少年看管所,请问 里面哪些是对象 哪些是类 哪些是行为 哪些是属性;

5、用面向对象 编写 请假流程

课前复习:
1、什么是面向对象设计?
就把一类具有公共属性和行为的事务,抽象出来,被称为:面向对象(事务:主要从属性和行为);
2、把面向对象设计传化成 java类
class 就是java体现出来,面向对象,属性->变量,行为-方法
3、类的实例化成对象
class 实例化成对象,我们用的就是这个对象 去处理我的业务逻辑;

类名(数据类型) 对象名(标识符) = new 类名();//才是对象

4、类里面 方法重载 和 this classloader
构造方法:类加载器 加载我们自定义数据型(对象)时候,它自动回去调用 的构造方法,进行初始化;
定义构造方法:【修饰符】+类名(【参数列表】){ //构造方法不需要返回值,连void关键字都不能加
}

a、每个类 必须至少有一个构造方法
b、如果我们没有写构造方法,系统默认都会给我们提供一个public 不带参的构造方法;
c、如果我们之间编写了构造方法,系统优先调用我们的构造方法,默认的方法不在提供;

this 制定就是当前对象,这个“当前”就是你现在用这个对象;
1、作业我们的方法引用,:this.xxx
2、构造方法之间的调用:要把this 放在第一行;this.类名();

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值