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

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


相关文章
|
2月前
|
Java 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
160 57
|
10天前
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
|
2月前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
65 8
|
2月前
|
安全 Java 编译器
Java对象一定分配在堆上吗?
本文探讨了Java对象的内存分配问题,重点介绍了JVM的逃逸分析技术及其优化策略。逃逸分析能判断对象是否会在作用域外被访问,从而决定对象是否需要分配到堆上。文章详细讲解了栈上分配、标量替换和同步消除三种优化策略,并通过示例代码说明了这些技术的应用场景。
Java对象一定分配在堆上吗?
|
2月前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
76 17
|
2月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
3月前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
56 17
|
2月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
137 4
|
2月前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
84 2
|
2月前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
66 4