我们都知道java是一门面向对象的一门语言,在这里就要说下面向过程了,它们有什么不同呢?
这是一个值得思考的问题!
面向过程 (POP) 与 面向对象 (OOP)
二者都是一种思想,面向对象是相对于面向过程而言的。面向过程, 强调的 是功能行为,以函数为最小单位,考虑怎么做 。面向对象,将功能封装进对 象, 强调具备了功能的对象,以类 / 对象为最小单位,考虑谁来做。
面向对象更加强调运用人类在日常的思维逻辑中采用的思想方法与原则,如
抽象、分类、继承、聚合、多态等。
面向对象的三大特征
封装 (Encapsulation)
继承 (Inheritance)
多态 (Polymorphism)
面向对象的思想概述
类 (Class) 和 对象 (Object) 是面向对象的核心概念。
类是对一类事物的描述,是 抽象的 、概念上的定义
对象是 实际存在 的该类事物的每个个体,因而也称为 实例 (instance) 。
“万事万物皆对象
类的成员有很多的,我们今天先介绍属性和函数吧!
现实世界的生物体,大到鲸鱼,小到蚂蚁,都是由最基本的 细胞 构成的。同 理,Java 代码世界是由诸多个不同功能的 类 构成的。
现实生物世界中的细胞又是由什么构成的呢?细胞核、细胞质、 … 那么, Java中用类 class 来描述事物也是如此。
常见的类的成员有:
属 性 :对应类中的成员变量
行 为 :对应类中的成员方法
类的成员之一:属性
类的成员之二:方 法(method)
注 意:
方法被调用一次,就会执行一次
没有具体返回值的情况,返回值类型用关键字void表示,那么方法体中可
以不必使用return语句。如果使用,仅用来结束方法。
定义方法时,方法的结果应该返回给调用者,交由调用者处理。
方法中只能调用方法或属性,不可以在方法内部定义方法
方法的重载(overload)
重载的概念:
在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数 类型不同即可。
重载的特点:
与返回值类型无关,只看参数列表,且参数列表必须不同。(参数个数或参数类 型)。调用时,根据方法参数列表的不同 来
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
说明:
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 里方法的参数传递方式只有一种: 值传递 。 即将实际参数值的副本 (复制品)传入方法内,而参数本身不受影响。
形参是基本数据类型:将实参基本数据类型变量的“数据值”传递给形参
形参是引用数据类型:将实参引用数据类型变量的“地址值”传递给形参
还有一些题目,操练一波?
第一道.......开胃:
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
第二道:
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
第三道:
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
那么怎么自定义类呢?有以下几个步骤
创建Java自定义类
步骤:
1. 定义类(考虑修饰符、类名)
2. 编写类的属性(考虑修饰符、属性类型、属性名、初始化值)
3. 编写类的方法(考虑修饰符、返回值类型、方法名、形参等)
定义好一个类,我们可以创建和使用它,以下是具体步骤
(静态属性除外!!!)
类的访问机制:
在一个类中的访问机制:类中的方法可以直接访问类中的成员变量。
(例外: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(); } } //程序运行的内存布局如下图
说到这我们可以先接触一波内存解析扩展:
堆( Heap ), 此内存区域的唯一目的 就是 存放对象实例 ,几乎所有的对象 实例都在这里分配内存。这一点在 Java虚拟机规范中的描述是:所有的 对象实例以及数组都要在堆上分配。
通常所说的 栈( Stack ) ,是指虚拟机 栈。虚拟机栈用于 存储局部变量 等。
局部变量表存放了编译期可知长度的 各种基本数据类型(boolean 、 byte 、 char 、 short 、 int 、 float 、 long 、 double)、对象引用( reference 类型, 它不等同于对象本身,是对象在堆内 存的首地址)。 方法执行完,自动释 放
方法区( Method Area ), 用于存储已 被虚拟机加载的 类信息、常量、静态 变量、即时编译器编译后的代码 等数 据。
今天就介绍到这里吧,谢谢你观看!!