java的类和对象(上.1)

简介: 我们都知道java是一门面向对象的一门语言,在这里就要说下面向过程了,它们有什么不同呢?这是一个值得思考的问题!

我们都知道java是一门面向对象的一门语言,在这里就要说下面向过程了,它们有什么不同呢?


这是一个值得思考的问题!


面向过程 (POP) 与 面向对象 (OOP)



二者都是一种思想,面向对象是相对于面向过程而言的。面向过程, 强调的 是功能行为,以函数为最小单位,考虑怎么做 。面向对象,将功能封装进对 象, 强调具备了功能的对象,以类 / 对象为最小单位,考虑谁来做。

面向对象更加强调运用人类在日常的思维逻辑中采用的思想方法与原则,如

抽象、分类、继承、聚合、多态等。


面向对象的三大特征


 封装 (Encapsulation)

 继承 (Inheritance)

 多态 (Polymorphism)

fd0f26a8144548059508221abec98fb2.png


面向对象的思想概述


 类 (Class) 和 对象 (Object) 是面向对象的核心概念。

 类是对一类事物的描述,是 抽象的 、概念上的定义

 对象是 实际存在 的该类事物的每个个体,因而也称为 实例 (instance) 。

 “万事万物皆对象

77d0d5dee19c464c8acb6ded6f59c3b7.png31d7ff74a2a243179854c13e56375bce.png66ca8aeff4e04b39957a9e5a2952de5c.png


类的成员有很多的,我们今天先介绍属性和函数吧!


 现实世界的生物体,大到鲸鱼,小到蚂蚁,都是由最基本的 细胞 构成的。同 理,Java 代码世界是由诸多个不同功能的 类 构成的。

 现实生物世界中的细胞又是由什么构成的呢?细胞核、细胞质、 … 那么, Java中用类 class 来描述事物也是如此。


常见的类的成员有:


属 性 :对应类中的成员变量

行 为 :对应类中的成员方法

类的成员之一:属性

2667286d72894509b017856e6c8c3d28.png1df760220e1745c1afc2387a491949b6.png

3fc946f1d9ae48d8ba205962ce5338a6.png4dd8bb0026d6418c95e09e628fc7e6fb.pngb9e13f6400e14d21a9dfbb05e51a3908.png


类的成员之二:方 法(method)


54a3c8e5117e4a1dad7748ce34ae303a.png33feafc93f9e4e59bd1ee75b0f838502.pnga0231974fcd24a18bcb7a45ecc92f664.png


注 意:


方法被调用一次,就会执行一次

没有具体返回值的情况,返回值类型用关键字void表示,那么方法体中可

以不必使用return语句。如果使用,仅用来结束方法。

定义方法时,方法的结果应该返回给调用者,交由调用者处理。

方法中只能调用方法或属性,不可以在方法内部定义方法


方法的重载(overload)


重载的概念:


在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数 类型不同即可。


重载的特点:


与返回值类型无关,只看参数列表,且参数列表必须不同。(参数个数或参数类 型)。调用时,根据方法参数列表的不同 来

1e478c8cf9704aa98b7b62d74940cb60.png

6fd3f106e5524b7ca90de07f76b976e8.png

1.判 断:
与void show(int a,char b,double c){}构成重载的有:
a) void show(int x,char y,double z){} // no
b) int show(int a,double c,char b){} // yes
c) void show(int a,double c,char b){} // yes
d) boolean show(int c,char b){} // yes
e) void show(double c){} // yes
f) double show(int x,char y,double z){} // no
g) void shows(){double c} // no
cd3efd0968f243609734656fa187fc3d.png

说明:

1. 声明格式:方法名(参数的类型名 ...参数名)

2. 可变参数:方法参数部分指定类型的参数个数是可变多个:0个,1个或多个

3. 可变个数形参的方法与同名的方法之间,彼此构成重载

4. 可变参数方法的使用与方法参数部分使用数组是一致的

5. 方法的参数部分有可变形参,需要放在形参声明的最后

6. 在一个方法的形参位置,最多只能声明一个可变个数形参

public class text{
  public static void main(String[] args){
    Overload to = new Overload();
    //下面两次调用将执行第二个test1方法
    to.test1();
    to.test1("aa" , "bb");
    //下面将执行test方法
    to.test(new String[]{"aa"});
}
}
class Overload {
   public void test(String[] msg){
    System.out.println("含字符串数组参数的test方法 ");
    }
  public void test1(String book){
    System.out.println("****与可变形参方法构成重载的test1方法****");
    }
  public void test1(String ... books){
    System.out.println("****形参长度可变的test1方法****");
    }
}

方法,必须由其所在类或对象调用才有意义。若方法含有参数:

形参 :方法声明时的参数

实参: 方法调用时实际传给形参的参数值


Java 的实参值如何传入方法呢?




Java 里方法的参数传递方式只有一种: 值传递 。 即将实际参数值的副本 (复制品)传入方法内,而参数本身不受影响。


形参是基本数据类型:将实参基本数据类型变量的“数据值”传递给形参

形参是引用数据类型:将实参引用数据类型变量的“地址值”传递给形参

21ba2deeb38e45559cca3f135b132178.png6a70c37396ae4d57bba23cd34e43aa39.pngefecac59d16d4cbdb1daf9bb7479debd.png74ebc26277014898ab71175323bdf8fb.png305e259bc854433ea6ac8161c69dea0a.png


还有一些题目,操练一波?


第一道.......开胃:

public class TransferTest1 {
public void swap(int a, int b) {
int tmp = a; a = b; b = tmp;
System.out.println("swap方法里,a的值是" + a + ";b的值是" + b);
}
public static void main(String[] args) {
TransferTest1 test = new TransferTest1();
int a = 5;
int b = 10;
test.swap(a, b);
System.out.println("交换结束后,变量a的值是" + a + ";变量b的值是" + b);
} }

swap方法里,a的值是10;b的值是5

交换结束后,变量a的值是5;变量b的值是10


fc230310ba104007b5bf61dc5e797ddc.png

第二道:

class DataSwap {
  public int a;
  public int b; 
}
public class text {
public static void swap(DataSwap ds) {
  int temp = ds.a;
  ds.a = ds.b;
  ds.b = temp;
System.out.println("swap方法里,a Field的值是" + ds.a + ";b Field的值是" + ds.b);
}
public static void main(String[] args) {
  DataSwap ds = new DataSwap();
  ds.a = 5;
  ds.b = 10;
  swap(ds);
  System.out.println("交换结束后,a Field的值是" + ds.a + ";b Field的值是" + ds.b);
} }

swap方法里,a Field的值是10;b Field的值是5

交换结束后,a Field的值是10;b Field的值是5

66b126a8c35540c4a3d2c4f1a0f73602.png

第三道:

public class text {
public static void main(String args[]) {
  text test = new text();
  test.first();
}
public void first() {
  int i = 5;
  Value v = new Value();
  v.i = 25;
  second(v, i);
  System.out.println("经second后的 "+"v.i="+v.i);
}
public void second(Value v, int i) {
  i = 0;
  v.i = 20;
  Value val = new Value();
  v = val;
System.out.println("second:  "+ "v.i="+v.i + " i=" + i);
}
  }
class Value
{
  int i = 15;
}

second:  v.i=15 i=0

经second后的 v.i=20

7085e15db88d4afbb725312968296b66.png

那么怎么自定义类呢?有以下几个步骤


创建Java自定义类



步骤:

1. 定义类(考虑修饰符、类名)

2. 编写类的属性(考虑修饰符、属性类型、属性名、初始化值)

3. 编写类的方法(考虑修饰符、返回值类型、方法名、形参等)

定义好一个类,我们可以创建和使用它,以下是具体步骤

c890c56ea67648b9a4ea842c934afd98.png972f66d8b8754b59a8ef9942b6c0bdb4.png

(静态属性除外!!!)


类的访问机制:

在一个类中的访问机制:类中的方法可以直接访问类中的成员变量。

(例外:static方法访问非static,编译不通过。)

在不同类中的访问机制:先创建要访问类的对象,再用对象访问类中

定义的成员。

讲完上面你也该对类有了一定认识了,那么接下我们来理解下其内存解析:

class PersonTest{
public static void main(String[] args) { //程序运行的内存布局如下图
Person p1 = new Person();
Person p2 =new Person();
p1.age = -30;
p1.shout();
p2.shout();
} 
}
 //程序运行的内存布局如下图

2db5602926354dfd93fb34a0149d109a.png17dfa30980354504b76f5d8cbf2a44b2.pngdb8207fa6b944cad96a5a7f967132088.png614fbe06606b42b3a2dcca2695549329.png22b29aba561647b0a31cf9ebf203ce24.png7412efb4795b4b6a9eeae0a07a44af97.png


说到这我们可以先接触一波内存解析扩展:


 堆( Heap ), 此内存区域的唯一目的 就是 存放对象实例 ,几乎所有的对象 实例都在这里分配内存。这一点在 Java虚拟机规范中的描述是:所有的 对象实例以及数组都要在堆上分配。


 通常所说的 栈( Stack ) ,是指虚拟机 栈。虚拟机栈用于 存储局部变量 等。

局部变量表存放了编译期可知长度的 各种基本数据类型(boolean 、 byte 、 char 、 short 、 int 、 float 、 long 、 double)、对象引用( reference 类型, 它不等同于对象本身,是对象在堆内 存的首地址)。 方法执行完,自动释 放


 方法区( Method Area ), 用于存储已 被虚拟机加载的 类信息、常量、静态 变量、即时编译器编译后的代码 等数 据。


5f993a8c86784529a0700ca3e46428c6.png

今天就介绍到这里吧,谢谢你观看!!


相关文章
|
7天前
|
Java 开发者
奇迹时刻!探索 Java 多线程的奇幻之旅:Thread 类和 Runnable 接口的惊人对决
【8月更文挑战第13天】Java的多线程特性能显著提升程序性能与响应性。本文通过示例代码详细解析了两种核心实现方式:Thread类与Runnable接口。Thread类适用于简单场景,直接定义线程行为;Runnable接口则更适合复杂的项目结构,尤其在需要继承其他类时,能保持代码的清晰与模块化。理解两者差异有助于开发者在实际应用中做出合理选择,构建高效稳定的多线程程序。
30 7
|
6天前
|
Java
【Java】Math、System、RunTime、BigDecimal类常用方法
【Java】Math、System、RunTime、BigDecimal类常用方法
|
4天前
|
安全 Java API
16 个最常用的 Java 实用程序类
【8月更文挑战第16天】
16 1
16 个最常用的 Java 实用程序类
|
5天前
|
缓存 前端开发 Java
【前端学java】复习巩固-Java中的对象比较(15)
【8月更文挑战第11天】Java中的对象比较
16 1
【前端学java】复习巩固-Java中的对象比较(15)
|
7天前
|
存储 Java 数据库连接
Java类文件结构及类加载机制
该文章主要讨论了Java类文件的结构以及Java类的加载机制,并提到了双亲委派模型的相关内容。
Java类文件结构及类加载机制
|
12天前
|
存储 算法 Java
14 Java集合(集合框架+泛型+ArrayList类+LinkedList类+Vector类+HashSet类等)
14 Java集合(集合框架+泛型+ArrayList类+LinkedList类+Vector类+HashSet类等)
31 2
14 Java集合(集合框架+泛型+ArrayList类+LinkedList类+Vector类+HashSet类等)
|
2天前
|
SQL Java Apache
实时计算 Flink版操作报错合集之使用parquet时,怎么解决报错:无法访问到java.uti.Arrays$ArrayList类的私有字段
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
4天前
|
Java API 开发者
|
5天前
|
Oracle 安全 Java
JDK8到JDK28版本升级的新特性问题之在Java 15及以后的版本中,密封类和密封接口是怎么工作的
JDK8到JDK28版本升级的新特性问题之在Java 15及以后的版本中,密封类和密封接口是怎么工作的
|
6天前
|
设计模式 人工智能 Java
Java 如何使用单例类
Java 如何使用单例类
6 1