打怪升级之小白的大数据之旅(九)<Java基础语法之面向对象>

打怪升级之小白的大数据之旅(九)

Java基础语法之面向对象

上次回顾

上一章,我对数组中的最后一个,二维数组进行了分享,理解了二维数组,就能更加清晰地了解多维数组,大数据面对的数据是各种各样的,提前理解这块的内容,会对之后多维度数据的合并,整理有所帮助。

面向对象

面向对象基本概述

引言:把大象装进冰箱

面向对象案例
当我们遇到这个问题,应该怎么做呢?下面,我来介绍一下下面的成员:面向对象和面向过程,帮助大家理解

面向过程 POP (Process-Oriented Programming)

  • 面向过程考虑的是事情实现的过程
  • 那么,装大象问题,在面向过程中,就是这么做的
    面向过程

面向对象 OOP(Object Oriented Programming)

  • 面向对象只关心结果,并不关心过程
  • 装大象的问题,在面向过程中,就是这么做的
    面向对象

面向对象与面向过程的区别

面向对象面向过程
以类/对象为最小单位,类包括:数据+方法以函数(方法)为最小单位
把软件系统看成各种对象的集合数据独立于函数之外
面向对象仍然包含面向过程,只不过关注点变了,关注谁来做面向功能划分软件结构
以对象(谁)为主,考虑谁来做,谁能做以过程,步骤为主,考虑怎么做
程序员是指挥者程序员是具体执行者
软件可重用性、可维护性和可扩展性强制约了软件的可维护性和可扩展性

注 面向对象思想是一种更符合我们思考习惯的思想,它可以将复杂的事情简单化,并将我们从执行者变成了指挥者。

补充知识点:

  • 面向切面编程 AOP (Aspect Oriented Programming)
    ○ 也叫做面向方法编程,是通过预编译方式和运行期动态代理的方式实现不修改源代码的情况下给程序动态统一添加功能的技术
    ○面向切面编程就是提一下,有个印象~

面向对象的三大特征

  • 封装(Encapsulation)
    把方法和属性打包起来(下面会具体讲属性和方法是什么)
    封装

  • 继承(inheritance)
    从已有的类中派生出新的类,新的类具有原来类的属性和行为
    继承

  • 多态(Polymorphism)
    同一个行为具有多种不同表现形式或形态的能力
    多态就是同一个接口,使用不同的实例而执行不同操作
    多态
    面向对象的三大特性,我会在后面慢慢分享给大家,就先提前做个铺垫

类和对象

类与对象的概念及关系

万物皆对象,环顾周围,你会发现很多对象,比如桌子,椅子,同学,老师,顾客,收银员等
类与对象的关系
类和对象由上图就可以完美的诠释:

  • 上图中,顾客收银员就是类,是一类具有相同特征的事物的抽象描述,比如他们都有姓名,年龄,体重这些属性特征,他们都有购买商品的行为特征
  • 张三和李四就是对象,是一个具有特定属性和行为特征的具体事物,张三就是一个具体的顾客(类)的对象,李四就是一个具体收银员(类)的对象

类的定义

  • Java中类的定义,就是把现实中类的概念用Java语言描述。
  • Java中用class关键字定义一个类,并定义类的成员:成员变量(属性)和成员方法(行为)
  • 创建类的语法格式:
    public class 类名 {
    //成员变量,描述这类事物的属性
    //成员方法,描述这类事物的行为
    }
    
  • 类的属性和行为
    – 成员变量:和以前定义变量几乎是一样的。只不过位置发生了改变。在类中,方法外,用于描述对象的属性特征。
    – 成员方法:和以前写的main方法格式类似。只不过功能和形式更丰富了。在类中,方法外,用于描述对象的行为特征。
  • 定义类的案例:
    //定义顾客类
    public class Customer {
      	//成员变量,描述属性特征
      	String name;//姓名
        int age;//年龄
        int weight;//体重
        
        //成员方法,描述行为特征
        public void shopping(){
            System.out.println("购物...");
        }
    }
    

对象的定义

  • 类是对象的模板,所以通过类创建这个类的对象,或者说创建这个类的一个实例,这个过程称为类的实例化

  • 创建对象的语法格式:

    类名 对象名= new 类名 ();
    
    //创建顾客对象
    Customer c=new Customer();
    
  • 对象的属性:姓名,年龄,体重,员工编号,部门等对象的静态特征

  • 对象的行为:购买商品,收款,打印账单等对象的动态特征或行为特征或者功能

  • 使用对象的成员,使用“. ”操作**
    操作对象属性,行为的语法格式:

    使用成员变量:对象名.属性
    使用成员方法:对象名.方法名()
    示例代码:
    c.name="张三"; //访问对象的属性,赋值
    c.age=18;
    System.out.println(c.name+"--"+c.age); //访问对象的属性,获取值
    c.shopping();  //访问对象的方法
    

类与对象的关系

  • 类是对一类事物的描述,是抽象的。
  • 对象是一类事物的实例,是具体的。
  • 类是对象的模板,对象是类的实体

对象的内存分析

对象内存分析图
内存结构图解:

区域名称作用
虚拟机栈,用于存储正在执行的每个Java方法的局部变量表等。局部变量表存放了编译期可知长度的各种基本数据类型、对象引用,方法执行完,自动释放。
存储对象(包括数组对象),new来创建的,都存储在堆内存。
方法区存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
程序计数器程序计数器是CPU中的寄存器,它包含每一个线程下一条要执行的指令的地址
本地方法栈当程序中调用了native的本地方法时,本地方法执行期间的内存区域

我又把这张图拿出来了,别慌,慢慢就会了
对象名中存储的是什么呢?它存储的是对象地址
示例代码:

	//Student和TestStudent没有位置要求,谁在上面谁在下面都可以
	//但是如果TestStudent类的main中使用了Student类,那么要求编译时,这个Student已经写好了,不写是不行的
	//如果两个类都在一个.java源文件中,只能有一个类是public的
	class Student{
	    
	}
	public class TestStudent{
	    //Java程序的入口
	    public static void main(String[] args){
	        System.out.println(new Student());//Student@7852e922
	        Student stu = new Student();
	        System.out.println(stu);//Student@4e25154f
	        
	        int[] arr = new int[5];
			System.out.println(arr);
	        }
	}
  • 学生对象和数组对象类似,直接打印对象名和数组名都是显示“类型@对象的hashCode值"
  • 类、数组都是引用数据类型,引用数据类型的变量中存储的是对象的地址,或者说指向堆中对象的首地址
  • 像“Student@4e25154f”是对象的地址吗?不是,因为Java是对程序员隐藏内存地址的,不暴露内存地址信息,所以打印对象时不直接显示内存地址,而是JVM提取了对象描述信息给你现在,默认提取的是对象的运行时类型@代表对象唯一编码的hashCode值
  • 这下知道我为什么把内存地址称之为伪地址了吧~(又填补了一个坑)
    对象的内存存储逻辑
  • 下面这个图就是代码在内存中的具体存储位置以及过程
    一个对象的内存存储逻辑

包的作用

  • 可以避免类重名:有了包之后,类的全名称就变为:包.类名
  • . 分类组织管理众多的类
  • 示例:
    – java.lang----包含一些Java语言的核心类,如String、Math、Integer、 System和Thread等,提供常用功能
    – java.net----包含执行与网络相关的操作的类和接口。
    – java.io ----包含能提供多种输入/输出功能的类。
    – java.util----包含一些实用工具类,如集合框架类、日期时间、数组工具类Arrays,文本扫描仪Scanner,随机值产生工具Random
    – java.text----包含了一些java格式化相关的类
    – java.sql和javax.sql----包含了java进行JDBC数据库编程的相关类/接口
    – java.awt和java.swing----包含了构成抽象窗口工具集(abstract window toolkits)的多个类,这些类被用来构建和管理应用程序的图形用户界面(GUI)。
  • 可以控制某些类型或成员的可见范围
  • 注意事项
    如果某个类型或者成员的权限修饰缺省的话,那么就仅限于本包使用

声明包

  • 包的语法格式
package 包名
  • 注意事项:
    – 必须在源文件的代码首行
    – 一个源文件只能有一个声明包的语句
    – 包的命名规范
    – 所有单词都小写,每一个单词之间使用.分割
    – 习惯用公司的域名倒置
    – 例如:com.公司域名.xxx;
    – 建议大家取包名时不要使用“java.xx"包

挎包使用类

  • 前提:被使用的类或成员的权限修饰符是>缺省的,即可见的
  • 使用类型的全名称
    例如:java.util.Scanner input = new java.util.Scanner(System.in);
  • 使用import 语句之后,代码中使用简名称
    – import语句告诉编译器到哪里去寻找类。
    – import语句的语法格式:
    java import 包.类名;
    import 包.*;
    import static 包.类名.静态成员; //后面再讲
    
  • 注意事项
    – 使用java.lang包下的类,不需要import语句,就直接可以使用简名称
    – import语句必须在package下面,class的上面
    – 当使用两个不同包的同名类时,例如:java.util.Date和java.sql.Date。一个使用全名称,一个使用简名称
  • 示例代码1
package com.公司域名.bean;
public class Student {
	// 成员变量
	private String name;
	private int age;
// 构造方法
	public Student() {
	}
public Student(String name, int age) {
		this.name = name;
		this.age = age;
	}
// 成员方法
	public void setName(String name) {
		this.name = name;
	}
public String getName() {
		return name;
	}
public void setAge(int age) {
		this.age = age;
	}
public int getAge() {
		return age;
	}
}

  • 示例代码2
package com.公司域名.test;
import java.util.Scanner;
import java.util.Date;
import com.公司域名.项目名称.Student;
public class Test{
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        Student stu = new Student();
        String str = "hello";
        
        Date now = new Date();
        java.sql.Date d = new java.sql.Date(346724566);        
    }
}

一般来说,包名的定义都是使用所在公司的域名倒叙和项目名称进行建立,这样方便统一管理

成员变量

变量的分类

  • 根据定义位置不同划分
    • 局部变量:定义在方法体内或其他局部区域内的变量(之前所使用的都是main方法中定义的变量,为局部变量)。
    • 成员变量:定义在类的成员位置,在方法体外,与方法(例如main方法)平行的位置。并且有修饰符修饰。
  • 根据修饰的不同成员划分
    • 类变量:或叫静态变量,有static修饰的成员变量。(上例中的country为类变量)
    • 实例变量:没有static修饰的成员变量。

成员变量的声明

  • 语法格式
class 类名{
    【修饰符】 数据类型  属性名;    //属性有默认值
    【修饰符】 数据类型  属性名 =; //属性有初始值
}
  • 说明:
    – 常用修饰符有public、缺省、private、protected、final、static
    – 数据类型可以是任意基本数据类型和引用数据类型
    – 属性名即变量名,符合标识符的命名规则和规范。
  • 示例代码:
    //定义一个中国人类
    class Chinese{
        public static String country;
    	public String name;
        char gender = '男';//显式赋值
        private int age;
    }
    
    

成员变量的访问

  • 实例变量的访问
    java 对象名.静态成员变量
  • 类变量的访问
    类名.静态成员变量
    对象名.静态成员变量(不推荐)
    
  • 示例代码
    public class TestChinese {
    	public static void main(String[] args) {
    		//类名.静态成员变量
    		System.out.println(Chinese.country);
    		//错误,非静态成员变量必须通过对象.进行访问
                         //System.out.println(Chinese.name);
    		
    		Chinese c1 = new Chinese();
    		//对象名.非静态成员变量
    		System.out.println(c1.name);
    		//静态的成员变量也可以通过对象.进行访问
    		//对象名.非静态成员变量
    		System.out.println(c1.country);
            System.out.println(c1.gender);
    	}
    }
    class Chinese{
    	static String country;
    	String name;
        char gender = '男';
    }
    

成员变量的特点

  • 成员变量有默认初始值(同数组元素默认初始值)
数据类型默认值
byte,short,int,long0
float,doub0.0
char0或\u0000表现为空
bolleanalse
数组,类,接口等引用类型null
  • 类变量的值是所有对象共享的,而实例变量的值是每个对象独立的
  • 示例代码:
    public class TestChinese {
    	public static void main(String[] args) {
    		Chinese c1 = new Chinese();
    		Chinese c2 = new Chinese();
    		
    		c1.name = "张三";
    		c2.name = "李四";
            c2.gender = '女';
    		
    //		c1.country = "中国";
    		Chinese.country = "中国";//推荐
    		
    		System.out.println("c1.country = " + c1.country + ",c1.name = " + c1.name + ",c1.gender = " + c1.gender);
    		System.out.println("c2.country = " + c2.country + ",c2.name = " + c2.name + ",c2.gender = " + c2.gender);
    	}	
    }
    class Chinese{
    	static String country;
    	String name;
        char gender = '男';
    }
    

成员变量的内存分析

  • 从内存分析看类变量与实例变量如何呈现的以上特点
  • 示例代码
    class Test08FieldSave{
    	public static void main(String[] args){
    		Chinese c1 = new Chinese();
            Chinese c2 = new Chinese();
    		c1.name = "张三";
    		c2.name = "李四";
    		System.out.println(c1.country+--+c1.name);
            System.out.println(c2.country+--+c2.name);
    		System.out.println("-------------------------");
    		//修改类变量值
    		c1.country = "中华人民共和国";
            //修改实例变量
            c1.name="张三丰";
    		System.out.println(c1.country+--+c1.name);
            System.out.println(c2.country+--+c2.name);
    		System.out.println(Chinese.country);
    	}
    }
    class Chinese{
    	static String country = "中国";
    	String name;
    }
    
  • 成员变量内存分析图
    成员变量内存分析图

成员变量与局部变量的区别

\成员变量局部变量
声明位置直接声明在类的成员位置声明在方法体中或其他局部区域内(方法声明上,构造方法,代码块等)
修饰符public\private\static\final等不能使用访问权限修饰符,可以使用null
内存加载位置堆或方法区(static修饰时)
初始化值有默认初始化值无默认初始化值
生命周期同对象或类(static时)的生命周期随着方法的调用而存在,方法调用完毕消失

总结

本章就是面向对象的第一章知识分享,面向对象这个概念比较抽象,里面细节点很多,没关系,我们有度娘~个人总结了一下对面向对象这个思想的理解:

  • 我在放假的时候比较喜欢向奶奶学习做菜,比如我最拿手的酸辣土豆丝
  • 做酸辣土豆丝---->吃土豆丝 这个就是面向对象
  • 买食材–>切土豆丝—>倒油—>放干调料—>炒土豆丝—>放剩下调料—>出锅—>装盘—>开吃,这个就是面向过程
  • 菜系/土豆都可以理解为类,比如炒菜这个类,它有炒土豆丝这个具体的对象(我通常管它叫实例)
  • 土豆大部分都是黄色(我管它叫土色),它的大小都没有超过100cm的,这个就是土豆类的成员变量
  • 买土豆需要看土豆有没有坏掉,大小,有没有发芽,这个就是具体我要买的土豆的实例变量
  • 土豆的做法有很多,可以炒,可以烤…这个就是土豆类的成员方法
  • 我炒土豆丝的时候,需要拿出一个进行切丝,这个就是这个具体实例土豆的实例方法…
  • 好了,就说这么多,重在理解~下一章,我会详细介绍一下方法,以及方法的用法
posted @ 2021-04-01 19:47  数据民工  阅读(17)  评论(0)    收藏  举报