(Java基础)面向对象——属性、方法、方法参数

目录

属性

声明

初始化

作用域

方法

声明

调用方式​​​​​​​

方法参数

方法参数——传值方式

第一个例子:基本数据类型

第二个例子:字符串拼接

第三个例子:新建对象
​​​​​​​

属性

声明

属性是类的对象的相同特征,语法和变量的声明很像,即

  • 属性类型 属性名称 = 属性值
初始化

如果在声明属性的同时进行了初始化赋值,那么所有对象的属性就完全相同。如果希望每个对象的属性不一致,那么不用在声明属性的时候进行初始化,属性会在构造对象的时候默认初始化,默认初始化的值取决于属性的类型:

  • byte, shout, int, long =>0; 
  • float, double =>0.0;
  • boolen flg = false;
  • char = 空字符;
  • 引用数据类型 => null;
作用域

变量的作用域非常小,只在当前的大括号内有效;属性不仅仅在当前类中有效,而且可以随着对象在其他地方使用。变量使用前必须初始化,否则会出现错误;属性可以不用初始化,因为JVM会会帮助我们自动完成初始化。

方法

声明

方法是对象的行为和功能,声明语法是

  • [方法的返回值类型][void]   方法名() { 逻辑代码 };//void 表示方法的返回结果:没有结果
调用方式​​​​​​​

方法的调用方式是

  • 对象.方法名();

方法和属性的区分:从多个对象中提炼出共通的特征和行为,特征作为类的属性声明,行为作为类的方法声明。简单提炼方法:根据语言描述中的词性来简单区分,名词 or 动词。

如,使用用户账号和密码进行登录;

  • 用户(独立的名词,可抽取为类),
  • 账号、密码(名词,是用户的两个特征,从属于用户,作为属性),
  • 登录(动词,用户登录是行为,从属于用户,作为方法).
package chapter04;

public class Object05_Method {
	public static void main(String[] args) {
		//面向对象——方法
		//练习:使用用户账号和密码进行登录
		User user = new User();
		boolean registerResult = user.register();
		if(registerResult) {
			System.out.println("注册成功");
			
			boolean loginResult = user.login();
			if(loginResult) {
				System.out.println("登录成功");
			}else {
				System.out.println("登录失败");
			}
			
		}else {
			System.out.println("注册失败");
		}
	}
}

class User {
	String account;
	String password;
	boolean register() {
		System.out.println("用户注册");
		return true;//假定值
	}
	boolean login() {
		System.out.println("用户登录");
		return false;//假定值
	}
}

方法参数

使用外部数据控制方法内部实现的操作,使用的是参数语法实现。从外部获取数据控制方法的内容逻辑实现的语法操作,我们称之为参数,也叫方法参数。方法的参数语法类似于变量(类型  名称),但是需要在方法后面的小括号中使用。参数可以有多个,多个参数用逗号隔开,小括号中的所有参数称为参数列表。如果方法声明了参数,那么调用时必须传递参数,否则会发生错误。形式如下:

  • 返回值类型 [void]   方法名( 参数类型  参数名称);
  • 返回值类型 [void]   方法名( 参数类型1  参数名称1,参数类型2  参数名称2 );

当方法名有多个参数时,需要注意:参数个数、类型、顺序要匹配;当参数类型(含义)相同,但是个数不确定时,可以采用特殊的参数语法声明,即可变参数。如果参数中还包含其他含义的参数,那么可变参数应该声明在最后。语法:

  • 参数类型 . . . 参数名称
package chapter04;

public class Object05_Method_Param {
	public static void main(String[] args) {
		//方法参数
		Hello h = new Hello();
		String name = "zhangsan";
		int age = 30;
		//传递参数
		h.sayHello(name,age);
		
		//可变参数
		h.test();
		h.test("zhangsan");
		h.test("zhangsan" + "lisi" + "wangwu");
		
		h.test1(30);
		h.test1(30,"zhangsan");
		h.test1(30,"zhangsan" + "lisi" + "wangwu");
	}
}

class Hello {
	void sayHello(String name,int age) {
		//使用参数
		System.out.println("Hello " + name + "," + age);
	}
	void test(String...name) {
		System.out.println(name);
	}
	void test1(int age,String...name) {
		System.out.println(name);
	}
}

但是结果跟预期不一样,除去第一行,打印出来的都是地址值,为什么呢?

因为此处 name 可变参数是数组,直接输出是地址值,因此需要循环取值打印

采用for循环,格式:

  • for (参数类型  参数名 :可变参数名){ 打印(参数名) }
    void test(String...name) {
		for(String str: name) {
			System.out.println(str);
		}
	}
	void test1(int age,String...name) {
		for(String str: name) {
			System.out.print(age + ",");
			System.out.println(str);
		}
	}

方法参数——传值方式

看例子预期输出结果,与运行后的结果相比较。

第一个例子:基本数据类型
package chapter04;

public class Object05_Method_Param1 {
	public static void main(String[] args) {
		//方法参数——传值方式
		int i = 10;
		test(i);//test方法中的i是main方法中i的复制品,二者在不同的内存位置
		//改变test中的i后,test方法弹栈,main方法中的i没有改变
		System.out.println(i);
	}
	public static void test(int i) {
		i = i + 10;
	}
}

可以看到输出结果是10,而不是20,为什么呢?这里要了解Java虚拟机的执行过程:

Java虚拟机在执行任意一个方法时都会在栈内存中开辟出一小块内存空间,用于存储方法内部的参数、变量、执行逻辑等,称为栈帧。而CPU指向固定的位置,并执行这个位置的栈帧。因此在创建新方法时会对栈帧进行压栈操作,在执行完一个方法后会对栈帧进行弹栈操作。

对例子中的两个方法画图分析:

在test方法执行完毕后,对应test栈帧被弹出,CPU继续执行main方法。两个方法中的 i 存储在不同的内存区域,后续main方法中打印的仍然是main中 i 的值,因此仍为10。

第二个例子:字符串拼接
package chapter04;

public class Object05_Method_Param1 {
	public static void main(String[] args) {
		//方法参数——传值方式
		String s = "abc";
		test(s);
		System.out.println(s);
	}
	public static void test(String s) {
		s = s + 10;
	}
}

可以看到输出结果是abc,而不是abc10。接下来解释为什么:

字符串 "abc" 是引用数据类型,放在堆中,s 存储字符串的地址。test方法中 s 传递的是引用变量的地址,开始时同样指向"abc",但在拼接字符串后会指向产生的新地址,新地址中是"abc10"。test 方法执行完毕后弹栈,接着执行main方法,打印的是main中 s 的指向的字符串,因此仍为abc。

第三个例子:新建对象
package chapter04;

public class Object05_Method_Param1 {
	public static void main(String[] args) {
		//方法参数——传值方式
		User1 user1 = new User1();
		user1.name = "zhangsan";
		test(user1);
		System.out.println(user1.name);
	}
	public static void test(User1 user1) {
		user1.name = "lisi";
	}
}
class User1{
	String name;
}

可以看到这次打印的结果改变了,使用同样的分析方式:

首先main方法创建了一个对象,放在堆中,属性为name,然后给name赋值为"zhangsan"。接下来执行test方法,其中的user指向同一个位置,把属性name的值改为"lisi"。接下来继续执行main方法,于是打印name值为"lisi"。

总结:Java中方法参数的传递为值传递。如果是基本数据类型,传递的是数值;如果是引用数据类型,传递的是引用地址。

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
第4章 Java面向对象程序设计 第4章-Java面向对象程序设计-Java语言GUI程序设计-赵满来-清华大学出版社全文共51页,当前为第1页。 本章学习Java语言面向对象程序设计方法。 4.1 类的方法 4.2 类封装与访问控制 4.3 类的继承 4.4 多态性 4.5 接口 4.6 Java的内部类 4.7 Lambda表达式初步 第4章-Java面向对象程序设计-Java语言GUI程序设计-赵满来-清华大学出版社全文共51页,当前为第2页。 4.1 类的方法 4.1.1 方法的定义 [修饰符] 返回值类型 方法名(类型 参数名1, 类型 参数名2, ……) { // 这对大括号内是方法体 一些变量声明语句 一些执行语句 return 表达式; } 第4章-Java面向对象程序设计-Java语言GUI程序设计-赵满来-清华大学出版社全文共51页,当前为第3页。 第4章-Java面向对象程序设计-Java语言GUI程序设计-赵满来-清华大学出版社全文共51页,当前为第4页。 4.1.2 方法的调用及参数传递 对象名.方法名(参数表); Java程序中方法的调用是按值调用,即调用者将实参的值传递给被调方法对应的形参。 实参与形参的类型、次序和个数一一对应。 基本数据类型参数,形参复制了实参的值,在方法中对形参的改变不会影响实参。 例4.1 编写方法swap交换两个int型变量的值,并显示交换前后形参和实参的值。 第4章-Java面向对象程序设计-Java语言GUI程序设计-赵满来-清华大学出版社全文共51页,当前为第5页。 引用类型参数,相对应的实参和形参链接到同一个对象,在方法中改变了形参引用对象时,其实就是改变了实参引用的对象。 例4.2 TwoInt类中有两个int类型的属性,编写方法swap交换该类对象的两个属性的值,并显示交换前后形参引用对象和实参引用对象的属性值。 第4章-Java面向对象程序设计-Java语言GUI程序设计-赵满来-清华大学出版社全文共51页,当前为第6页。 4.1.3 方法的重载 Java语言提供了方法重载机制,可以定义多个具有相同方法名但参数表不同的方法——可以是参数个数相同但类型不同,也可以是参数个数不同。 重载的方法应该有相同的返回值类型。 1.参数个数相同类型不同的重载方法 public static String valueOf(boolean b) public static String valueOf(char c) public static String valueOf(int i) 第4章-Java面向对象程序设计-Java语言GUI程序设计-赵满来-清华大学出版社全文共51页,当前为第7页。 2.参数个数不同的重载方法 public String substring(int beginIndex) public String substring(int beginIndex, int endIndex) JTextArea findPrime(JTextArea jTextAreaNums, int n) { …… } // 计算 2——n区间素数 JTextArea findPrime(JTextArea jTextAreaNums, int m, int n) {……}// 计算 m——n区间素数 第4章-Java面向对象程序设计-Java语言GUI程序设计-赵满来-清华大学出版社全文共51页,当前为第8页。 4.1.4 构造方法 为类定义构造方法实现对类对象的初始化。 构造方法名与类名相同,不能有返回值,也无返回值类型声明,参数表可以为空或定义多个参数。 创建类的对象时自动调用它的构造方法。 例4.3为例2.7完成的用户登录程序界面(见图2.58)编写用户信息类,其中用户信息包括用户名、密码和用户身份三个方面的内容。 第4章-Java面向对象程序设计-Java语言GUI程序设计-赵满来-清华大学出版社全文共51页,当前为第9页。 public class User { private String name; private String password; private int job; public User(String name, String password, int job) { this.name = name; this.password = password; this.job = job; } // …… public User(String name) { this.name = name; } } 第4章-Java面向对象程序设计-Java语言GUI程序设计-赵满来-清华大学出版社全文共51页,当前为第10页。 4.2 类封装与访问控
面向对象程序设计与实践 第五章 Java抽象类和接口 面向对象程序设计与实践课程组 面向对象程序设计与实践-Java抽象类和接口[33页]全文共33页,当前为第1页。 教学目标 教学方式 重点知识 学习目标 1.熟悉抽象类的基本含义以及Java中的语法规则 2.熟悉接口基本含义以及实现规则 3.掌握抽象类定义方法,并能根据需要进行抽象类设计 4.掌握接口定义以及实现方法 1.抽象类的语法规则 2.接口类的定义及实现规则 3.使用接口实现多态 本章以理论讲解、案例演示、代码分析为主。学习本章内容之前,建议同学们先了解"案例描述",带着设计要求学习案例中涉及的知识点,然后动手进行编码实现,需要注意的是: 1.案例5-1的重点在于抽象类的抽象方法的设计 2.案例5-2的重点在于接口的定义及设计 面向对象程序设计与实践-Java抽象类和接口[33页]全文共33页,当前为第2页。 目录 CONTENTS 01 5-1 简易公司人事管理 02 5-2 家电产品类设计 面向对象程序设计与实践-Java抽象类和接口[33页]全文共33页,当前为第3页。 01 简易公司人事管理 案例描述 案例分析 关联知识 案例实现 案例小结 案例拓展 面向对象程序设计与实践-Java抽象类和接口[33页]全文共33页,当前为第4页。 5-1案例描述 现有一软件公司,公司中有开发人员若干、项目经理若干、地区经理若干。已知开发人员有姓名、工号和薪水的属性,并为公司进行工作。项目经理除了有姓名、工号和薪水还有奖金,并为公司进行工作。地区经理除了有姓名、工号和薪水还有奖金和公司的股票分红,也为公司进行工作。现要求根据给出的需求进行公司人员管理。 面向对象程序设计与实践-Java抽象类和接口[33页]全文共33页,当前为第5页。 抽象方法 5-1关联知识 抽象方法只有声明没有方法体,不需要具体实现 abstract 返回值数据类型 抽象方法名(); 抽象方法必须用abstract关键字进行修饰,且不能同时使用final或static进行修饰。如果一个类含有抽象方法,则这个类也必须定义为抽象类,抽象类必须在类前用abstract关键字修饰。 例如,将Pet类中的两个方法定义为抽象方法 public abstract void enjoy(); //将enjoy定义为抽象方法 public abstract void move(); //将move定义为抽象方法 抽象方法目的就是为了实现一个接口多种方法的原理,即所有的子类对外都呈现一个相同名字的方法,抽象方法必须被重写,且构造方法、类方法不能声明为抽象方法面向对象程序设计与实践-Java抽象类和接口[33页]全文共33页,当前为第6页。 抽象类 5-1关联知识 抽象类在类层次结构中代表一般性概念,规定必须实现方法的统一接口,子类将基于此概念来定义方法,定义方法如下: abstract class 类名{ 数据成员; //定义抽象方法,没有方法体实现 abstract 返回值数据类型 抽象方法名(); 访问权限 返回值数据类型 成员方法名(形式参数列表){ …方法实现 } } 面向对象程序设计与实践-Java抽象类和接口[33页]全文共33页,当前为第7页。 抽象类的特点 5-1关联知识 (1)抽象类中可以有抽象方法,也可以有非抽象方法 (2)抽象类必须被继承 (3)抽象类本身不能实例化,即不能使用new运算创建对象。只有它的非抽象子类可以创建对象,而抽象类定义的对象可以用于指向子类对象。例如, Pet p = new Pet("小白","白色",2,12,2000);//错误,抽象类不能实例化 Pet p = new Cat("咪咪","灰色",1,8,3000,"波斯猫");//正确,可以指向子类对象 (4)由抽象类派生的子类必须实现所有父类的抽象方法,否则,该子类仍然是抽象类。 面向对象程序设计与实践-Java抽象类和接口[33页]全文共33页,当前为第8页。 抽象类 5-1关联知识 PupilStu p = new PupilStu(); p.pay(); MiddleStu m = new MiddleStu(); m.pay(); HighStu h = new HighStu();h.pay(); ColgStu c = new ColgStu();c.pay(); 面向对象程序设计与实践-Java抽象类和接口[33页]全文共33页,当前为第9页。 5-1案例分析 交流与讨论 结合案例分析,思考一下几个问题: 开发人员——静态属性为姓名、工号、薪水,动态行为为工作 项目经理——静态属性为姓名、工号、薪水,奖金;行为为工作 地区经理——静态属性为姓名、工号、薪水,奖金、股票分红;行为为工作 父类——共性内
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料 杨教授大学堂,版权所有,盗版必究。 1/7 页 《面向对象编程与设计(Java) 》课后作业及参考解答 1.1.1 第一周 课程(9 月 4 日)的课后作业及参考解答 1、 请用 Java 程序示例说明什么是面向过程的程序设计方法、什么是面向对象的程序 设计方法? 面向过程就是分析出所需要开发的应用的系统在解决某个问题时所需要的步骤和工 作流程,然后用代码(当然应该把这些代码设计为各个函数或者过程)来表示这些步骤 的具体实现——面向过程是以过程为中心的编程思想。 而面向对象是把构成问题的各个方面分解成各个对象,并用代码来实现对象之间的 交互——面向对象是以事物为中心的编程思想。 (1)面向过程程序设计方法的示例 #include "stdio.h" int add(int a, int b){ //对数据的操作(方法或者函数) return a+b; } int main(){ //数据(属性或者状态) int x=1, y=1; int sum=add(x,y); print("Sum=%d",sum); } 面向过程程序的程序中的数据与方法是相互分离的!而面向对象程序中的数据与方 法是相互组合在一起的。 当数据(也就是问题的属性或者状态)发生变化,需要修改大量的关联的方法的程 序模块。 (2)面向对象程序设计方法的示例 import java.io.*; public class Add{ 杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料 杨教授大学堂,版权所有,盗版必究。 2/7 页 //数据(属性或者状态) private int sum; public int add(int a, int b){ //对数据的操作(方法或者函数) sum=a+b; return sum; } public void showSum() { //对数据的操作(方法或者函数) System.out.println("Sum="+sum); } public static void main(String args[]){ Add oneAdd=new Add(); oneAdd.add(1,2); oneAdd.showSum(); } } 2、谈谈你对开源的理解(可以是任何方面的主题) ,你熟悉 J2EE 平台中的哪些开源框 架、对这些开源框架的熟悉程度怎样(包括在项目中的具体应用) (1)开源软件 1) 开源软件一定是源代码开放,任何人可以免费使用,任何人可以再开发; 2) 开源同时也是一种商业运营手段,软件免费提供但服务收费。 3) 开源软件有别于自由软件——自由、免费、公开与分享,许多开源软件有"许 可证"的限制。 (2)J2EE 平台中的哪些开源框架 S2SH——Struts2、Spring 和 Hibernate 等表现层框架、应用层框架和持久层框架。 1.1.2 第二周 课程(9 月 11 日)的课后作业及参考解答 1、请用 Java 程序示例说明什么是 Java 中的静态多态性和动态多态性? (1)静态多态性是指在编译程序代码时,编译器就会根据参数的不同而调用不同的方 杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料 杨教授大学堂,版权所有,盗版必究。 3/7 页 法,并且跟具体的方法体结合起来,生成最终的程序代码。 实现的具体手段是应用方法重载。 (2)动态多态性是指在编译程序代码时,编译器不会将某一方法体的调用和方法体结 合起来,而是在程序执行过程中根据对象的实际类型选择相应的方法体,再最终生成对 应的程序代码。 实现的具体手段是应用方法重写。 2、软件业一直在探讨,如何使软件实现如同传统产业一样的大规模生产。软件工程的 提出,便是为了实现这个愿望。然而,虽然软件工程至今已经有了很大的发展,软件的 大规模工业化生产仍然没有实现。您认为原因何在? (1)张三同学的解答 软件业不是一个孤立的行业,它具有很大的依附性。它必须依附在计算机硬件上 才能生存,否则无影无踪;它必须依附在各行各业的业务需求中才能发展,否则无人问 津。这种独一无二的依附性决定了软件产业的发展步伐:既不能超前,也不能落伍。 随着计算机硬件技术呈摩尔定律向前发展,以及计算机应用向社会生产和社会生 活的广泛渗透,计算机软件技术必须迎头赶上。为了解决生产率问题,人们提出了面向 对象技术和构件生产;为了解决质量问题,人们提出了软件过程控制和 CMM;为了解决 成本问题,人们提出了软件复用技术。这些原理的提出和技术的应用,极大提高了软件 开发的效率。 但令人遗憾的是软件工程的实践非常令人失望。大量的软件项目不能按照人们的 计划实施和完成,持续了二三十年的软件危机变得更加突出。暮然回首,人们
Java电力面向对象(Java Power Object-oriented)是依据中国电力装备行业统一技术规范(Guobiao Standard)GB/Z 698.2-2010《电力装置的绑定数据解析规范》来进行设计和开发的一种面向对象的编程语言。该规范定义了电力装备的数据解析方法和标准。 在Java电力面向对象编程中,首先需要按照GB/Z 698.2-2010规范来进行数据解析。该规范主要包括数据项的定义、数据格式的约定和数据解析方法的规定。通过遵循该规范,可以确保电力装备的数据在Java程序中能够正确解析和处理。 解析方法Java电力面向对象中的核心内容之一。在解析数据时,需要根据规范中定义的数据项和格式进行解析。首先需要读取原始数据,然后按照标准的数据格式进行解析,从而获取到对应的数据项。解析方法通常包括数据校验、数据截取、数据转换等步骤,以确保解析结果的准确性和完整性。 Java电力面向对象的目标是实现电力装备的数据解析和处理的高效、可靠和可重复使用。通过采用面向对象的编程思想,在Java程序中可以定义电力装备的数据模型和数据解析方法,从而实现对电力装备数据的一致性管理和易于维护。 总之,Java电力面向对象是一种根据中国电力装备行业技术规范设计和开发面向对象编程语言。在开发过程中,需要遵循GB/Z 698.2-2010规范,并采用规范定义的解析方法来处理电力装备数据。这种编程语言的应用可以提高电力装备数据的解析效率和准确性,为电力行业的数据管理和应用提供了良好的支持。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

多多想

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值