目录
封装
原则:对象代表什么,就得封装对应的数据,并提供数据对应的行为。
封装的好处:
private关键字
举例:
this关键字
成员变量和局部变量
举例:
构造方法
空参构造方法
带参构造方法
注意事项
封装是面向对象三大特征之一,其他两大特征分别为:继承、多态。
封装告诉我们如何正确设计对象的属性和方法。
举例:
1.
Q:人画圆,圆是自己画的还是人画的?
A:圆自己画的
所以画圆这个方法应该在圆这个对象里
2.
Q:人关门,门是自己关的还是人关的?
A:门自己关的
所以关门这个方法应该在门这个对象里
Java中有已经写好的一些对象以及他们的方法,可以直接用。
比如:
public class StringTest {
public static void main(String[] args) {
//先定义一个字符串
String s = "woshiyigebianchengxinshou";
//调用方法
int len = s.length();
System.out.println(len);
String ss = s.toUpperCase();
System.out.println(ss);
}
}
public的值可以更改,不太安全,而且没有对输入做规定,可能有奇怪的值。可以用private修饰。
针对每一个私有化的变量成员,如果需要被其他类使用,都要提供get 和 set 方法
GirlFriend类:
public class GirlFriend {
//属性
private String name;
private int age;
private String gender;
//作用:给成员变量那么进行赋值
public void setName(String n){
name = n;
}
//作用:对外提供name属性,不用接收数据,直接把name给外面。
public String getName(){
return name;
}
//age
//setAge:给成员变量age进行赋值的。
//getAge:对外提供成员变量age的值
public void setAge(int a){
int i = 50;
if(a >= 18 && a<=50){
age = a;
}else{
System.out.println("非法参数");
}
}
public int getAge(){
return age;
}
//gender
public void setGender(String g){
gender = g;
}
public String getGender(){
return gender;
}
//行为
public void sleep(){
System.out.println("牛朋友在睡觉");
}
public void eat(){
System.out.println("女朋友在吃饭");
}
}
GirlFriendTest类:
package com.test1;
public class GirlFriendTest {
public static void main(String[] args) {
//创建女朋友的对象
GirlFriend gf1 = new GirlFriend();
//赋值
gf1.setName("小红");
gf1.setAge(18);
gf1.setGender("女");
// String name = gf1.getName();
// int age = gf1.getAge();
// String gender = gf1.getGender();
System.out.println(gf1.getName());
System.out.println(gf1.getAge());
System.out.println(gf1.getGender());
gf1.eat();
gf1.sleep();
}
}
两个地方用同一个单词表示时,会发生一些问题,但是换个名字又不合适,这种情况应该怎么办呢?
当成员变量和局部变量重复时,无特殊说明, 采用就近原则,用距离近的那个。
如果局部变量距离近,但是想要用成员变量可以用this关键字来区分。
package com.test1;
public class GirlFriend {
//属性
private String name;
private int age;
private String gender;
//作用:给成员变量那么进行赋值
public void setName(String name){
//局部变量表示测试类中调用方法传递过来的数据
//等号左边则表示成员位置的name
this.name = name;
}
//作用:对外提供name属性,不用接收数据,直接把name给外面。
public String getName(){
return name;
}
//age
//setAge:给成员变量age进行赋值的。
//getAge:对外提供成员变量age的值
public void setAge(int age){
int i = 50;
if(age >= 18 && age<=50){
this.age = age;
}else{
System.out.println("非法参数");
}
}
public int getAge(){
return age;
}
//gender
public void setGender(String gender){
this.gender = gender;
}
public String getGender(){
return gender;
}
//行为
public void sleep(){
System.out.println("牛朋友在睡觉");
}
public void eat(){
System.out.println("女朋友在吃饭");
}
}
作用:在创建变量时,由虚拟机自动调用的,给成员变量初始化进行赋值。
一般用于写代码时属性已知的情况
格式:
public class student {
修饰符 类名(参数) {
方法体;
}
}
特点:
如果自己没写任何构造方法,虚拟机会自动帮我们加一个空参构造方法
public Student(){
System.out.println("看看我执行了没");
}
用以下代码调用:
Student s = new Student();
public Student(String name, int age){
this.name = name;
this.age = age;
}
用以下代码调用:
Student s = new Student("zhangsan",23);
执行时机:
1.构造方法的定义
2.构造方法的重载
3.使用方式
4.误区