一,封装
1,概述
-指的就是把对象的属性细节隐藏起来,外部通过共有的方式来访问。
2,好处
-提高了代码复用性
-提高了安全性
3,原则
-把不需要对外提供的内容都隐藏起来,根据需求提供对应的共有的访问方式。
package com.momo.demo;
/*
- 我们在使用这个案例的过程中,发现了问题:
- 通过对象给成员变量赋值的时候,可以赋值一些非法数据,这不合理
- 应该是在夫之前,先对数据进行判断,符合要求才能赋值。
- 需要判断,判断要写在哪里?
- 经过简单分析判断要写在 Stu类中。
- 在成员变量位置不能直接判断,因为判断需要一些逻辑语句,
- 逻辑语句应该在方法中,所以我们应该在Stu类中提供判断方法来验证数据
- 提供了验证方法后,通过方法赋值,就可以避免非法数据。
- 但是,我依然可以不使用方法来赋值,依然可以赋值非法数据。
- 这样我们的方法就起不到作用。
- 应该是,强制要求必须使用方法来赋值。
- 如何强制要求必须使用方法赋值?
- 为了实现这样的效果,java给我们提供了一个关键字 private
- private:私有的,可以修饰成员变量和成员方法
- 特点:被private修饰的成员只能在本类中直接访问。
- 上面所讲的内容就是一个封装思想。
- 封装:指的就是把对象的属性细节隐藏起来,对外提供共有的访问方式。
- */
//测试类,作用:创建对象,调用方法,进行测试
public class Demo1 {
public static void main(String[] args) {
Stu stu = new Stu();
stu.name = "钢弹";
// stu.age = 11;
// stu.age = 1111;//数据不合理
//stu.gender = "男";
// stu.gender = "鬼";//不符合现实,不合理
//stu.setAge(1111);
//stu.setGender("仙人");
stu.setAge(22);
stu.setGender("男");
stu.show();
//stu.study();
}
}
class Stu{
String name;
//int age;
//String gender;
private int age;
private String gender;
//判断数据的方法,符合要求的时候在赋值 public void setAge(int a){ if(a>=0&&a<=150){ age = a; }else{ System.out.println("数据不合法。。。"); } } public void setGender(String g){ if(g.equals("男")||g.equals("女")){ gender = g; }else{ System.out.println("数据不合法"); } } public void study(){ System.out.println("学习。。。"); } public void show(){ System.out.println("我叫:"+name+",今年:"+age+"岁,性别:"+gender); }
}
4,private关键字
-是一个权限修饰符
-可以修饰成员变量和成员方法
-被private修饰的内容只能在本类中直接访问
-常见用法:
把成员变量用private修饰
提供对应的get和set方法
-标准的private应用案例
package com.momo.demo;
public class Demo2 {
public static void main(String[] args) {
Aaa a = new Aaa();
System.out.println(a.a);
//System.out.println(a.b); b 在 com.momo.demo.Aaa 中是 private 访问控制
a.show();
// a.fun();在 com.momo.demo.Aaa 中是 private 访问控制
a.method();
}
}
class Aaa{
int a = 5;
private int b = 6;
public void show(){ System.out.println(b); System.out.println("aaa"); } private void fun(){ System.out.println("fun...."); } public void method(){ fun(); }
}
package com.momo.demo;
public class Demo3 {
public static void main(String[] args) {
Student s = new Student();
s.setName("默默");
s.setAge(11);
s.setGender("男");
System.out.println(s.getName()); System.out.println(s.getAge()); System.out.println(s.getGender()); }
}
class Student{
private String name;
private int age;
private String gender;
public String getName() { return name; } public void setName(String n) { name = n; } public int getAge() { return age; } public void setAge(int a) { age = a; } public String getGender() { return gender; } public void setGender(String g) { gender = g; }
}
5,this关键字
package com.momo.demo;
/*
- 我们说过要见名知意,如果做到见名知意后,局部变量名和成员变量名就一样了
- 但是会导致值付不上,因为当名字一样时,在方法中默认采用就近原则。
- 为了解决这个问题,java就提供了关键字 this
- 通过this区分成员变量和局部变量
- this:表示当前对象的引用,它表示当前调用方法的对象,哪个对象调用这个方法
- 这个方法中的this就表示那个对象,不是固定的。
- this的其他用法后面和super一样讲
- */
public class Demo3 {
public static void main(String[] args) {
Student s = new Student();
s.setName("默默");
s.setAge(11);
s.setGender("男");
System.out.println(s.getName()); System.out.println(s.getAge()); System.out.println(s.getGender()); Student s2 = new Student(); s2.setName("默默2"); s2.setAge(112); s2.setGender("男2");
}
}
//标准代码的改进版,加入this
class Student{
private String name;
private int age;
private String gender;
public String getName() { return name; } public void setName(String name) { //String name = "默默"; //name = name; 自己又赋值给了自己 this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; }
}
-练习:定义各种类,练习标准代码写法,创建对象测试
6,构造方法
package com.momo.demo;
public class Demo4 {
public static void main(String[] args) {
/*
* 我们说过只有方法才有(),而我们在创建对象的时候,格式中
* 也有一个(),说明创建对象的时候其实调用了一个方法
* 但是我们在定义类的时候没有定义过这样的方法,
* 这个方法哪里来的?是什么?
* 这个方法其实就是构造方法。
* 作用:给对象的数据进行构造初始化的
* 构造方法的格式:
* 方法名和类名相同,
* 没有返回值类型,连void都没有
* 也没有具体的返回值
* 构造方法也可以重载
* 注意事项:
* 如果我们定义类的时候没有定义构造方法,那么系统
* 会自动提供一个无参构造方法
* 如果我们定义类的时候定义了构造方法,系统就不会提供默认的
* 无参构造方法
* */
Tea t = new Tea();
}
}
class Tea{
public Tea(){}
private String name;
private int age;
private String gender;
public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; }
}
package com.momo.demo;
public class Demo4 {
public static void main(String[] args) {
/*
* 我们说过只有方法才有(),而我们在创建对象的时候,格式中
* 也有一个(),说明创建对象的时候其实调用了一个方法
* 但是我们在定义类的时候没有定义过这样的方法,
* 这个方法哪里来的?是什么?
* 这个方法其实就是构造方法。
* 作用:给对象的数据进行构造初始化的
* 构造方法的格式:
* 方法名和类名相同,
* 没有返回值类型,连void都没有
* 也没有具体的返回值
* 构造方法也可以重载
* 注意事项:
* 如果我们定义类的时候没有定义构造方法,那么系统
* 会自动提供一个无参构造方法
* 如果我们定义类的时候定义了构造方法,系统就不会提供默认的
* 无参构造方法
* */
//无参+set
Tea t = new Tea();
t.setName("aa");
t.setAge(11);
t.setGender("ad");
System.out.println(t.getName());
System.out.println(t.getAge());
System.out.println(t.getGender());
/* Tea t2 = new Tea(33); System.out.println(t2);
//
System.out.println(t3);/System.out.println("---------------------------");//带参构造Tea t3 = new Tea("aaa",11,"nan");System.out.println(t3.getName());System.out.println(t3.getAge());System.out.println(t3.getGender());}}-给成员变量赋值的2种方式无参构造+set方法带参构造class Tea{public Tea(){System.out.println("无参构造");}/
System.out.println("带name的构造");
}//
System.out.println("带age的构造");
}//
System.out.println("带name,age的构造");
}
*/
public Tea(String name,int age,String gender){
this.name = name;
this.age = age;
this.gender = gender;
System.out.println("带name,age,gender的构造");
}
private String name; private int age; private String gender; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; }
}
7,类的组成
-成员变量
-成员方法
-构造方法
package com.momo.demo;
/*
- 标准类的写法
- 无参,带参
- 私有成员变量
- 共有的get和set方法
- */
public class Demo5 {
public static void main(String[] args) {
//无参+set
Phone p1 = new Phone();
p1.setBrand("dsf");
p1.setPrice(111);
p1.show();
System.out.println("----------");
//带参
Phone p2 = new Phone("dff",111);
p2.show();
}
}
class Phone{
private String brand;
private int price;
public Phone() { } public Phone(String brand, int price) { this.brand = brand; this.price = price; } public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } public void show(){ System.out.println(brand+","+price); }
}
-多练习标准类的写法即可
8,类的初始化过程
- Phone p1 = new Phone(); 在内存中都干了什么事情?
加载 Phone.class 文件进内存
在栈内存中给p1开辟空间
在堆内存中给Phone类型对象开辟空间
对对象的成员变量进行 默认初始化
对对象的成员变量进行 显示初始化
对对象的成员变量进行 构造初始化
对象初始化完成,把对象地址值赋值给变量p1
package com.momo.demo;
/*
- 标准类的写法
- 无参,带参
- 私有成员变量
- 共有的get和set方法
- /
public class Demo5 {public static void main(String[] args) {//无参+setPhone p1 = new Phone();/
p1.setPrice(111);*/
p1.show();
System.out.println("----------");
//带参
Phone p2 = new Phone("dff",111);
p2.show();
}
}
class Phone{
// private String brand;
private String brand = "小米";
private int price;
public Phone() { } public Phone(String brand, int price) { this.brand = brand; this.price = price; } public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } public void show(){ System.out.println(brand+","+price); }
}
9,变量到底什么时候应该定义为成员变量,什么时候又该定义为局部变量
-如果这个变量是用来描述这个类的信息的,那么这个变量就应该是成员变量
否则就是局部变量
package com.momo.demo;
/*
- 写一个求和方法(2个int的)
- 我们讲了面向对象思想,我们就像能不能用面向对象的方式来写这个方法?
- 我们把方法封装到MyMath类中
- */
public class Demo6 {
public static void main(String[] args) {
// System.out.println(sum(3,4));
// MyMath mm = new MyMath();
// System.out.println(mm.sum(3, 4));
MyMath mm = new MyMath(); mm.a = 5; mm.b = 6; System.out.println(mm.sum());
}
/* public static int sum(int a,int b){
return a+b;
}*/
}
class MyMath{
//能不能把a和b定义成成员变量?
/public int sum(int a,int b){return a+b;}/
/*
* 这种方式虽然可以,感觉好像也符合面向对象思想,但是这样不好
* 我们说过类是一组相关属性和行为的集合
* 类是通过现实事物转换而来的
* 类中成员变量是描述事物属性的(描述类的信息)
* 类中成员方法是描述事物功能的(描述类的功能)
* 所以这个方法中的a和b,其实不应该定义成成员变量
* */
int a;
int b;
public int sum(){
return a+b;
}
}
-练习:定义一个矩形,提供求周长和面积的方法,进行测试
-练习:定义一个员工类,自己分析成员,按照标准代码编写,进行测试
-练习:定义一个类,提供2个数的加减乘除方法
标签:封装,String,int,void,System,关键字,println,java,public From: https://blog.51cto.com/u_16230968/7240761