java基础-封装
一.封装由来:
继上篇java基础-面向对象文章来说,当定义一个Person类,类中有姓名,年龄,身高,肤色这几个静态特征(成员属性,就是成员变量),在使用创建出来的对象.成员属性赋值时,会出现不合常理的情况,比如说创建Person类对象,对象的年龄为-10或者200,这种情况便不符合现实生活人类寿命的合理范围,便需要封装,对不合理的操作进行提示
代码演示:
1.首先创建一个Person类,类中有姓名,年龄,身高,肤色这几个静态特征(成员属性,就是成员变量)
public class Person{
//姓名
String name;
//年龄
int age;
//身高
String height;
//肤色
String colour;
}
2.再定义一个测试类
public class Test {
public static void main(String[] args){
//再main方法中创建Person类对象
Person p=new Person();
//给person类对象中的属性赋值
p.name="李四";
p.age=-10;
p.height="178";
p.colour="white";
System.out.println(p.name); //李四
System.out.println(p.age); //-10
System.out.println(p.height); //178
System.out.println(p.colour); //white
System.out.println("================================================");
p.age=200;
System.out.println(p.age); //200
}
}
3.思考:
年龄为-10或者200是不是不合常理,对于这种情况可以使用private修饰符解决,将类中的成员属性私有,不让外界随意创建对象访问属性赋值
3.1 代码如下图:
到此在测试类中会发现新的问题,就是在测试类Test类中无法对Person类的成员属性进行赋值以及获取属性值的操作
3.2 代码如下图:
4. 为防止外界随意创建对象随意赋值,已经将类中的成员属性进行私有化,就是使用private修饰符将成员属性私有化, 例如:( private 数据类型 成员属性名; ),故而需要给外界提供可以访问Person类内部属性的方法,set方法和get方法,set方法用于给类对象内部的成员属性赋值,get方法用于获取类内部的成员属性值,
注意:set和get方法无需static关键字(静态修饰符)去修饰
代码如下 :
public class Person{
//姓名
private String name;
//年龄
private int age;
//身高
private String height;
//肤色
private String colour;
//对name赋值的set方法
public void setName(String n){
name=n;
}
//获取name属性值的get方法
public String getName(){
return name;
}
//对age赋值的set方法
public void setAge(int a){
//对年龄的赋值加一个判断
if (a<=0||a>100){
System.out.println("年龄有误");
return;
}
age=a;
}
//获取age属性值的get方法
public int getAge(){
return age;
}
//对height属性赋值的set方法
public void setHeight(String h){
height=h;
}
//获取height属性值的get方法
public String getHeight(){
return height;
}
//对colour属性赋值的set方法
public void setColour(String c){
colour=c;
}
//获取colour属性值的get方法
public String getColour(){
return colour;
}
}
5. 测试类对age属性赋值操作:
测试1:对age的正常赋值
public class Test {
public static void main(String[] args){
//在main方法中创建Person类对象
Person p=new Person();
/* //给person类对象中的属性赋值
p.name="李四";
p.age=-10;
p.height="178";
p.colour="white";
System.out.println(p.name); //李四
System.out.println(p.age); //-10
System.out.println(p.height); //178
System.out.println(p.colour); //white
System.out.println("================================================");
p.age=200;
System.out.println(p.age); //200*/
//通过set方法赋值
p.setName("aaa");
p.setAge(12);
p.setHeight("180");
p.setColour("black");
//通过get方法获取属性值
System.out.println(p.getName()); //aaa
System.out.println(p.getAge()); //12
System.out.println(p.getHeight()); //180
System.out.println(p.getColour()); //black
}
}
控制台:
测试2: 对age的非正常赋值
public class Test {
public static void main(String[] args){
//在main方法中创建Person类对象
Person p=new Person();
/* //给person类对象中的属性赋值
p.name="李四";
p.age=-10;
p.height="178";
p.colour="white";
System.out.println(p.name); //李四
System.out.println(p.age); //-10
System.out.println(p.height); //178
System.out.println(p.colour); //white
System.out.println("================================================");
p.age=200;
System.out.println(p.age); //200*/
//通过set方法赋值
p.setName("aaa");
p.setAge(-30);
p.setHeight("180");
p.setColour("black");
//通过get方法获取属性值
System.out.println(p.getName()); //aaa
System.out.println(p.getAge()); //0
System.out.println(p.getHeight()); //180
System.out.println(p.getColour()); //black
}
}
控制台:
二. this关键字
this关键字表示当前类对象的引用,谁访问类中的属性,this就是谁
代码如下:
1. 修改Person类中的name属性的set方法和get方法
2.测试类中对Person类中的name属性进行赋值操作
3.注意:
导致的原因是Person类中name属性的set方法无法区分成员变量和局部变量,并没有将方法上的局部变量值传给成员变量,所以使用get方法获取成员属性值,name属性依旧是将成员变量初始化值
解决办法: 使用this关键字区分属性set方法中的成员变量和局部变量
修改代码如下:
4. 补充:打印输出this和类对象,比较地址值
三. 类中成员属性的set方法和get方法的快捷键生成
1. alt+insert或者Fn+Alt+i
2.选中要生成set,get方法的属性,点击ok
四. 构造函数
1.概念:
构造函数分为有参构造方法和无参构造方法,主要用于创建对象(new一个类对象),默认会提供一个无参构造,当我们自定义有参构造方法后,类便不再会提供默认的无参构造方法,也就是无参构造方法会失效,因此我们创建有参构造方法的同时也应该创建无参构造方法
2.区别:
无参构造方法:
先创建类对象,再对类对象中的成员属性进行赋值
有参构造方法:
创建类对象的同时,就对类对象中的成员属性进行赋值
3.代码如下
无参构造方法:
有参构造方法:
4.构造方法快捷键
1. alt+insert或者Fn+Alt+i
CSDN-Ada助手: 恭喜您在第19篇博客中分享了有关Java Stream的顶级技巧!您的持续创作精神令人钦佩。通过这篇博客,您展示了如何利用Java Stream来简化代码,这对于我们这些热衷于提高代码效率的开发者来说是非常有价值的。我非常期待您下一步的创作,希望您可以继续分享关于Java Stream和其他相关主题的技巧和经验,让我们共同进步。谦虚地说,我相信您一定还有更多的知识和见解可以与我们分享。加油!
CSDN-Ada助手: 恭喜您撰写了第20篇博客!标题“JAVA之Stream流详解”听起来非常有趣。您对于Stream流的详细解析一定会给读者带来很多收获。在接下来的创作中,或许您可以考虑分享一些实际应用场景,以及如何优化Stream流的使用。谦虚地说,我相信您的经验和深入研究一定会为我们带来更多精彩的文章。期待您的下一篇作品!
CSDN-Ada助手: 推荐 Java 技能树:https://edu.csdn.net/skill/java?utm_source=AI_act_java