一、什么是封装?
封装,顾名思义,在硬件中如同将数字线路隐藏在一个盒子里,只通过IO接口与外界进行数据交互,你可以隐藏内面内容,也可以公开里面内容。经过封装,外部权限被控制,数据被有效的隐藏在类的内部,用户可以通过一些接口对里面的数据进行访问。用户所能访问的权限的控制靠访问权限修饰符(private、public等)来控制。这里介绍private和public中的区别。
验证时出现的问题和解决方法:一个pakeage包里面只能有一个公共类,如果想验证public和private需要从两个类入手。解决方法:在一个public class类里面建立两个子类。
- private:修饰的属性或方法只能在本类中调用 。在其他类中,对象不能直接调用属性。
- public:修饰的属性或方法可以在不同类中使用,甚至不同包(同一个项目)也可以使用。
- 默认修饰符:默认修饰符指的是声明时没有前缀。只能在同一个包中使用。
package com.zp1102;
public class user {
public String name;//权限最宽,可以在不同包中使用
private int age;//权限最窄,只能在此类中使用
int score;//权限一般,可以在此包中使用
public void printUserInfo1(){
// 输出打印语句
System.out.println ("虚拟货币名称:"+name);
System.out.println ("虚拟货币年龄:"+age);
System.out.println ("虚拟货币得分:"+score);
}
public void main(String[] args) {
//对象属性
user b = new user();
b.age = 11;
b.name = "以太坊";
b.score = 100;
b.printUserInfo1 ();
}
}
class user2{
public void main(String[] args) {
//对象属性
user c = new user();
c.age = 11;
// c.name = "以太坊";不可使用,因为在public类中,name属性为 private,只能在同一个类中使用。
c.score = 100; //可以使用,不会标红,而另一个包中会出红
c.printUserInfo1 ();
}
}
我将所有权限标识符赋予不同的类、对象属性、方法,对应不同环境测试,对其权限得到相关认识。
二、构造方法
使用构造方法,创建初始化对象时比较方便,不需要一步一步赋予对象属性,一行代码就可以解决。创建对象的同时直接将属性传入值给对象。
public user(String name, int score, int age){
this.name = name;
this.score = score;
this.age = age;
}
public void main(String[] args) {
//对象属性
user b = new user("以太坊",100,10);
}
三、set、get用法
set、get可以说是访问封装数据的一个借口,当满足条件时,可以向封装内部传输数据或者获取数据。
代码如下(示例):
package com.zp1103a;
public class testa {
private String name;
private int age;
public void setName(String name){
this.name=name;
}
public void printtestcinfo(){
// 输出打印语句
System.out.println ("名字:"+name);
System.out.println ("年龄:"+age);
}
public String getName(){
return this.name;
}
public void setAge(int age){
if(age>=0){
this.age=age;
}else if(age<0){
System.out.println ("年龄不能为负数!!");
}
}
public int getAge(){
return this.age;
}
}
在相同包中的另一个class中:
package com.zp1103a;
public class testc {
public static void main(String[] args) {
testa t1 = new testa();
//不能直接给name和age赋值,因为private 可以通过set和get赋值
t1.setName("bitcoin");
t1.setAge(-1);
t1.printtestcinfo();
}
}
最后显示结果为:
年龄不能为负数!!
名字:bitcoin
年龄:0
三、方法重载
定义:如果有两个方法的方法名相同,但参数不一致,哪么可以说一个方法是另一个方法的重载。 相当于方法的扩容,对不同类型的输入,产生不同的输出。如布尔型输入,返回ture or false。
把setAge和setName合并为setChara
public void setChara(String name){
this.name=name;
}
public void setChara(int age){
if(age>=0){
this.age=age;
}else if(age<0){
System.out.println ("年龄不能为负数!!");
}
}
以上就是方法重组。
实现结果与使用两个方法相同。
四、思考题
所有的构造方法都是私有的话? 在类的外面还能创建对象吗?
通过代码来测试,初步判断不行。
private user(String name, int score, int age){
this.name = name;
this.score = score;
this.age = age;
}
在idea中出现红色标识问题,指向另一个类中的创造对象语句,所以得到以下结论:
如果构造方法为私有,则不能在类外创造对象。