day06 方法
- 访问权限
- 方法
- setter getter this
- 构造方法
- 方法的重载
访问权限
面向对象编程三大特征之一 封装
什么是封装?
对象的一种保护机制,隐藏对象的属性和实现细节,仅对外提供公共访问方式。
白话: 该露的露,该藏的藏
专业: 我们程序设计要追求“高内聚,低耦合”。高内聚:就是类的内部数据操作细节自己完成,不允许外部干涉;
低耦合:仅暴露少量的方法给外部使用
耦合: 程序的一部分对另一部分的依赖关系目的:
隐藏一个类的实现细节, 便于调用者调用
防止对封装数据的未经授权的访问,有利于保证数据的完整性
便于修改,增强代码的可维护性封装原则:
将不需要对外提供的内容都隐藏起来。
把属性都隐藏,提供公共方法对其访问示例:
/* 人: 属性: 年龄。 行为: 说话。 */ class Person { int age; void speak() { System.out.println("age="+age); } } class PersonDemo { public static void main(String[] args) { Person p = new Person(); // p.age = 20; //可以 p.age = -20; //??? } }
p.age = -20;这个是不是不太合适啊。
我们在对事物进行描述的时候,要符合事物的特点?年龄没有负数的啊
那为什么会发生这种现象?我们只用到了这种类型中的一部分。
那么该怎么办?
我们要对这样的数据进行控制?
出现这种现象是因为,这个age在被其他程序创建对象后,直接访问了,这样造成了安全隐患。
那么就不让他访问?我们使用private(私有的意思)关键字进行限定class Person { private /*私有*/int age; public void live(int a) { if(a>0 && a<130) { age = a; speak(); } else System.out.println("错误的数据"); } void speak() { System.out.println("age="+age); } } class Person { private /*私有*/int age; public void setAge(int a)//setXxx getXxx { age = a; } public int getAge() { return age; } void speak() { System.out.println("age="+age); } }
- private:私有,是一个权限修饰符。用于修饰成员。
- 私有的内容只在本类中有效。
- 注意:私有仅仅是封装的一种体现而已。
修饰符(modifier)
- 在类、类的属性以及类的方法前面加修饰符可限定其访问权限,实现其在一定范围内的信息隐藏。
default不是一个修饰符,而是表示一种不加任何修饰符时的状态
Protected
同一个包的正常类,可以直接用他的实例进行访问
不同包的正常类,无法访问任何属性和方法
不同包的子类,不能使用父类实例的属性和方法
不同包的子类,不能使用其它包的子类实例的属性和方法
不同包的子类,可以直接使用父类的属性和方法
总之,不同包的子类就规规矩矩的在自己的代码里用父类的属性就行了。其它的使用都是不允许的。
方法
什么是函数?
函数就是定义在类中的具有特定功能的一段独立小程序。
函数也称为方法。函数的格式:
饰符 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,) { 执行语句; return 返回值; }
返回值类型:函数运行后的结果的数据类型。跟返回值的数据类型有关系。 如果没有返回值的话,则使用void
- 方法名称:其实就是功能的名称, 那么名称可以根据功能来定义。不要使用aaa、bbb等不明确的名称
- 参数类型:是形式参数的数据类型。
- 形式参数:是一个变量,用于存储调用函数时传递给函数的实际参数。
当在逻辑中 含有未知的数据参与 运算的时候 才需要参数列表
(实际参数:传递给形式参数的具体数值。) - return:用于结束函数, 将返回值 返回给调用者。
当没有返回值的时候 ,我们可以直接写 return ; 即可,但是此种情况 通常可以省略不写。 - 返回值:该值会返回给调用者。
- 案例:
- 用于计算两数之和,两个数是否相等,乘法表
- 定义方法用于输出换行
需求1: 定义一个功能,完成两个整数的和的获取。
思路:既然定义功能,就是可以用函数来体现。
如何定义一个函数呢?
通过两个明确来完成。
明确一:这个功能的结果是什么?
是和。是功能的结果,所以该功能的返回值类型是int 。
其实就是在明确函数的返回值类型。
明确二:这个功能实现过程中是否需要未知内容参与运算?
有,加数和被加数。这就是函数的参数列表(参数的个数,参数的类型)
其实就是在明确参数列表。
注意:返回值类型和参数类型没有直接关系。
*/
public static int add(int a,int b)
{
int sum = a+b;
return sum;
}
需求2: 定义一个功能,比较两个数是否相等。
明确一:这个功能的结果是什么?
有,boolean.
明确二:这个功能实现过程中是否需要未知内容参与运算?
有,两个整数。
public static boolean equals(int a,int b)
{
/*
if(a==b)
return true;
else
return false;
boolean x ;
if(a==b)
x = true;
else
x = false;
return x;
*/
// return (a==b)?true:false;
return a==b;
}
需求3: 定义功能,打印99乘法表。
public static void print99()
{
for(int x=1; x<=9; x++)
{
for(int y=1; y<=x; y++)
{
System.out.print(y+"*"+x+"="+y*x+"\t");
}
System.out.println();
}
}
注意问题:
1、方法要定义在类中
2、和顺序无关
3、不可以在方法里 再定义方法
4、可以在方法里 调用其他的方法
局部变量与全局变量,this关键字的作用
局部变量
- 定义在类的方法内或代码块内的变量
- 局部变量只在定义它的方法体内或代码块内有效
- 局部变量在使用之前,必须先初始化
全局变量(成员变量)
- 一个类中既不在方法体内也不在程序块内定义的变量
- 类中所有的方法和代码块都可以访问成员变量
- 对于没有初始化的成员变量,系统会指定默认的值
成员变量的默认初值
this关键字
当成员变量和局部变量重名,可以用关键字this来区分。//仅仅是this的一个表现形式
this : 代表对象。代表哪个对象呢?当前对象。
this就是所在函数所属对象的引用。
简单说:哪个对象调用了this所在的函数,this就代表哪个对象this也可以用于在构造函数中调用其他构造函数。
注意:只能定义在构造函数的第一行。因为初始化动作要先执行。凡是被对象调用的东西 比如属性或函数 它们都持有一个this引用
重载(overload)
- 重载的概念
在同一个类中,允许存在一个以上的同名函数,只要它们的参数个数或者参数类型不同即可。 - 重载的特点:
与返回值类型无关,只看参数列表。 - 重载的好处:
方便于阅读,优化了程序设计。 重载示例:
//返回两个整数的和 int add(int x,int y){return x+y;} //返回三个整数的和 int add(int x,int y,int z){return x+y+z;} //返回两个小数的和 double add(double x,double y){return x+y;}
总结:重载特点,两同三不同
构造器(构造方法)
通过构造器用于构造该类的对象。Java通过new关键字来调用构造器,从而返回该类的对象。是一种特殊的方法:
[修饰符] 类名 (参数列表){ //n条语句 }
1、构造器没有返回值类型
- 2、方法名称要和类名保持一致
- 3、一个类中可以有多个构造器,但是参数列表不同:参数的顺序不同、参数的类型不同、参数的个数不同
- 4、构建类的对象 通过new关键字 例:Mobile stu=new Mobile();
- 5、系统会自动添加一个无参的构造器
- 6、当含有有参的构造器时 会把默认的无参的构造器干掉