《第七天总结》 张伦琦
《封装,构造,this,static》
1.面向对象的回顾
这个不再详细的总结了,给自己的建议是,
放弃之前写C语言程序的思维,要用面向对象的思维去思考,
写程序的时候学会做“大爷”!让别人做事!
2.封装
A.封装的引入(通过写class Student的例子)
1.因为age=-18居然通过了,不让通过。
办法是加private,私有的,只有本类有效,类外无效。
你不让通过,我student类外面无法访问age;
2.现在的问题是学生没有年龄,咋办?
在Student类中定义方法来访问age;一个用来赋值。一个用来取值。
3. 一开始的问题(age=-18),转了一大圈,没有解决.咋办?
在堆age赋值时加判断。保证数据的安全
4.方法名称比较恶心,我要弄一个有规范的方法名字。
赋值setAge():变异器:有参数,无返回,有输入,无输出。
取值getAge():取值器:无参数,有返回,无输入,有输出。
举例:如果你的变量名称是xxxYyyZzz
赋值:setXxxYyyZzz()
取值:getXxxYyyZzz()
B.写程序的正确步骤
1.对变量加private ,为了控制变量的访问,保证数据的安全。
2.提供方法来访问private变量,对外提供访问接口。
3.设计getter,setter。就是访问接口的具体体现
4.创建对象,使用getter,setter对对象中的属性进行操作。
访问接口的具体操作。
D.封装总结:
A.封装定义:是指隐藏对象的属性(加private)和实现细节(private方法,还没学),
仅对外提供公共访问方式(public getter和setter)。
B.封装分类;
1.类封装:封装了属性和方法。因为他们属于创建对象的类。
2.方法封装:将代码,功能封装到方法中,为了便于复用。
3.数据封装:将数据加private,对外提供 public setter和getter
C.封装好处:
将变化隔离。(代码各司其职,相互关系不大,一旦一个对象的功能发改变,不影响其他对象)
(扩展:高内聚,相关的东西定义到一起,低耦合,你别影响我,我别影响你)
便于使用。 (方法和属性都有所属,只要找到所属的对象就能找到方法和属性。)
提高重用性。(功能封装到方法中,一次定义多次调用。属性和方法封装到对象中,一次创建对象多次使用对象)
提高安全性。(数据不让直接访问,通过方法来访问,方法中可以有安全性控制)
D.private关键字:
1.是一个访问权限修饰符。
2.用于修饰成员(成员变量和成员函数)
3.被私有化的成员只在本类中有效。
4.应用场景:
将成员变量私有化,对外提供对应的set ,get方法对其进行访问。
提高对数据访问的安全性。
3.构造方法
3.1构造方法概述
A.构造方法的默认情况:
如果你不写,系统将默认提供一个。javac 编译的时候提供
如果你写了,系统将不在提供默认构造方法。javac 编译的时候不提供
默认构造,无参构造,建议手动写出。
为啥要自己写?
盖楼房
1.如果业主不给图纸,按照一个默认的图纸进行盖房。
2.如果业主给出图纸,按照业主给出的图纸进行盖房。
3.建议业主给出默认图纸,
B.构造方法作用:创建对象,初始化对象。
C. 构造方法的特殊:(构造方法和普通方法的区别)(重要!)
1.名称特殊:和类名一样。
2.返回特殊:你不需要给它任何返回值,void也不写。
3.作用特殊:成员方法代表对象的能力。构造方法,用于创建对象。
4.调用特殊:成员方法是创建对象后多次调用,构造方法是创建对象的时一次调用。
D. 构造放的注意(重要!)
1.构造方法可以重载吗?可以!为啥要让构造方法重载呢?
构造方法代表创建对象的一种方式,允许创建对象有多种方式。
2.构造方法可以使用private吗?可以,如果有那么一种创建对象的方式,不想让外界使用可以加private
3.构造方法没有void,那它可以有return语句吗?可以。为啥允许加return呢?
如果你给的构造对象的条件非法,提前结束对象的构造
3.2构造方法内存图解(很重要,很详细的^-^)
4.This和this()
4.1this
A.this引入
1.因为 int a 意义不明确 ,将a该成age
2.问题成员变量age =0,没赋值成功
3.因为成员变量和局部变量重名,局部变量把成员变量屏蔽了。
4.对成员变量使用this
B.啥时候用this.
成员变量被同名的局部变量屏蔽的时候,我要用成员变量,必须用this指明。
成员变量和局部变量不发生屏蔽的时候,就不需要用this来指明成员变量。
stu的地址居然和this代表的地址一模一样,是咋过去的呢?
我们 系统
定义getAge() 定义getAge(Student this)
调用stu.getAge() 调用getAge(stu);
C.this的注意
1.this是一个隐式参数。
2.代表当前对象。
3.在定义对象的类中使用。
4.2this练习---判定同龄人
class Person{
//属性 name age
private String name;
private int age;
public void setAge(int age){
this.age=age;
}
//方法 introduce()
public void introduce(){
System.out.println("name="+name+", age="+age);
}
public boolean isEqualAge(Person p){
/*
//1.是不是同一个人,
if (this==p){
return true;
}else{
//2.如果不是同一个人,判定年龄
//如果年龄相同就true
if (this.age==p.age){
return true;
}else{
//否则就false
return false;
}
}
*/
return this==p?true:this.age==p.age?true:false;
}
}
class PersonDemo
{
public static void main(String[] args)
{
Person p1=new Person();
p1.setAge(18);
Person p2=new Person();
p2.setAge(19);
boolean b=p1.isEqualAge(p1);
//b=p1.isEqualAge(p2);
//b=p2.isEqualAge(p1);
System.out.println(b);
//System.out.println(p1);
//System.out.println(p2);
}
}
4.3this()
A.this()引入
学生的年龄不能为负数和0
应该在构造学生对象的时候加控制语句
问题:控制语句重复。怎去去掉重复。
构造方法去调用构造方法。不能直接叫构造方法的名称
只好用this();
B.this()本质:
代表本类的一个构造方法。
C.this()注意
1.只能用于构造方法中。
2.只能是第一个语句。
3.只能调用一次。
4.不能存在循环的构造方法调用。
4.4封装,构造,this,this()代码模板
/*
学生
成员属性:id name age
构造方法:Student() Student(String name) Student(String name , int age)
Student(String name , int age ,String id)
成员方法:study() sleep()
:getter() setter()
*/
class Student{
//成员属性:id name age
private String id;
private String name;
private int age;
/*
构造方法:
Student() Student(String name) Student(String name , int age)
Student(String name , int age ,String id)
*/
public Student(){
}
public Student(String name){
if (name==null){
name="";
}
this.name=name;
}
public Student(String name , int age){
this(name);
//this.name=name;
this.age=age;
}
public Student(String name , int age ,String id){
this(name,age);
// this.name=name;
// this.age=age;
this.id=id;
}
//:getter() setter()
public String getId(){
return id;//this可以不加
}
public void setId(String id){
this.id=id;
}
public String getName(){
return name;//this可以不加
}
public void setName(String name){
this.name=name;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age=age;
}
public void study(String kecheng){
System.out.println("正在学校"+kecheng);
}
public void sleep(){
System.out.println("学生正在休息");
}
}
class StudentZhongJieDemo
{
public static void main(String[] args)
{
System.out.println("Hello World!");
}
}
《封装,构造,this,static》
1.面向对象的回顾
这个不再详细的总结了,给自己的建议是,
放弃之前写C语言程序的思维,要用面向对象的思维去思考,
写程序的时候学会做“大爷”!让别人做事!
2.封装
A.封装的引入(通过写class Student的例子)
1.因为age=-18居然通过了,不让通过。
办法是加private,私有的,只有本类有效,类外无效。
你不让通过,我student类外面无法访问age;
2.现在的问题是学生没有年龄,咋办?
在Student类中定义方法来访问age;一个用来赋值。一个用来取值。
3. 一开始的问题(age=-18),转了一大圈,没有解决.咋办?
在堆age赋值时加判断。保证数据的安全
4.方法名称比较恶心,我要弄一个有规范的方法名字。
赋值setAge():变异器:有参数,无返回,有输入,无输出。
取值getAge():取值器:无参数,有返回,无输入,有输出。
举例:如果你的变量名称是xxxYyyZzz
赋值:setXxxYyyZzz()
取值:getXxxYyyZzz()
B.写程序的正确步骤
1.对变量加private ,为了控制变量的访问,保证数据的安全。
2.提供方法来访问private变量,对外提供访问接口。
3.设计getter,setter。就是访问接口的具体体现
4.创建对象,使用getter,setter对对象中的属性进行操作。
访问接口的具体操作。
C.内存图解:(见图)
D.封装总结:
A.封装定义:是指隐藏对象的属性(加private)和实现细节(private方法,还没学),
仅对外提供公共访问方式(public getter和setter)。
B.封装分类;
1.类封装:封装了属性和方法。因为他们属于创建对象的类。
2.方法封装:将代码,功能封装到方法中,为了便于复用。
3.数据封装:将数据加private,对外提供 public setter和getter
C.封装好处:
将变化隔离。(代码各司其职,相互关系不大,一旦一个对象的功能发改变,不影响其他对象)
(扩展:高内聚,相关的东西定义到一起,低耦合,你别影响我,我别影响你)
便于使用。 (方法和属性都有所属,只要找到所属的对象就能找到方法和属性。)
提高重用性。(功能封装到方法中,一次定义多次调用。属性和方法封装到对象中,一次创建对象多次使用对象)
提高安全性。(数据不让直接访问,通过方法来访问,方法中可以有安全性控制)
D.private关键字:
1.是一个访问权限修饰符。
2.用于修饰成员(成员变量和成员函数)
3.被私有化的成员只在本类中有效。
4.应用场景:
将成员变量私有化,对外提供对应的set ,get方法对其进行访问。
提高对数据访问的安全性。
3.构造方法
3.1构造方法概述
A.构造方法的默认情况:
如果你不写,系统将默认提供一个。javac 编译的时候提供
如果你写了,系统将不在提供默认构造方法。javac 编译的时候不提供
默认构造,无参构造,建议手动写出。
为啥要自己写?
盖楼房
1.如果业主不给图纸,按照一个默认的图纸进行盖房。
2.如果业主给出图纸,按照业主给出的图纸进行盖房。
3.建议业主给出默认图纸,
B.构造方法作用:创建对象,初始化对象。
C. 构造方法的特殊:(构造方法和普通方法的区别)(重要!)
1.名称特殊:和类名一样。
2.返回特殊:你不需要给它任何返回值,void也不写。
3.作用特殊:成员方法代表对象的能力。构造方法,用于创建对象。
4.调用特殊:成员方法是创建对象后多次调用,构造方法是创建对象的时一次调用。
D. 构造放的注意(重要!)
1.构造方法可以重载吗?可以!为啥要让构造方法重载呢?
构造方法代表创建对象的一种方式,允许创建对象有多种方式。
2.构造方法可以使用private吗?可以,如果有那么一种创建对象的方式,不想让外界使用可以加private
3.构造方法没有void,那它可以有return语句吗?可以。为啥允许加return呢?
如果你给的构造对象的条件非法,提前结束对象的构造
3.2构造方法内存图解(很重要,很详细的^-^)
4.This和this()
4.1this
A.this引入
1.因为 int a 意义不明确 ,将a该成age
2.问题成员变量age =0,没赋值成功
3.因为成员变量和局部变量重名,局部变量把成员变量屏蔽了。
4.对成员变量使用this
B.啥时候用this.
成员变量被同名的局部变量屏蔽的时候,我要用成员变量,必须用this指明。
成员变量和局部变量不发生屏蔽的时候,就不需要用this来指明成员变量。
stu的地址居然和this代表的地址一模一样,是咋过去的呢?
我们 系统
定义getAge() 定义getAge(Student this)
调用stu.getAge() 调用getAge(stu);
C.this的注意
1.this是一个隐式参数。
2.代表当前对象。
3.在定义对象的类中使用。
4.2this练习---判定同龄人
class Person{
//属性 name age
private String name;
private int age;
public void setAge(int age){
this.age=age;
}
//方法 introduce()
public void introduce(){
System.out.println("name="+name+", age="+age);
}
public boolean isEqualAge(Person p){
/*
//1.是不是同一个人,
if (this==p){
return true;
}else{
//2.如果不是同一个人,判定年龄
//如果年龄相同就true
if (this.age==p.age){
return true;
}else{
//否则就false
return false;
}
}
*/
return this==p?true:this.age==p.age?true:false;
}
}
class PersonDemo
{
public static void main(String[] args)
{
Person p1=new Person();
p1.setAge(18);
Person p2=new Person();
p2.setAge(19);
boolean b=p1.isEqualAge(p1);
//b=p1.isEqualAge(p2);
//b=p2.isEqualAge(p1);
System.out.println(b);
//System.out.println(p1);
//System.out.println(p2);
}
}
4.3this()
A.this()引入
学生的年龄不能为负数和0
应该在构造学生对象的时候加控制语句
问题:控制语句重复。怎去去掉重复。
构造方法去调用构造方法。不能直接叫构造方法的名称
只好用this();
B.this()本质:
代表本类的一个构造方法。
C.this()注意
1.只能用于构造方法中。
2.只能是第一个语句。
3.只能调用一次。
4.不能存在循环的构造方法调用。
4.4封装,构造,this,this()代码模板
/*
学生
成员属性:id name age
构造方法:Student() Student(String name) Student(String name , int age)
Student(String name , int age ,String id)
成员方法:study() sleep()
:getter() setter()
*/
class Student{
//成员属性:id name age
private String id;
private String name;
private int age;
/*
构造方法:
Student() Student(String name) Student(String name , int age)
Student(String name , int age ,String id)
*/
public Student(){
}
public Student(String name){
if (name==null){
name="";
}
this.name=name;
}
public Student(String name , int age){
this(name);
//this.name=name;
this.age=age;
}
public Student(String name , int age ,String id){
this(name,age);
// this.name=name;
// this.age=age;
this.id=id;
}
//:getter() setter()
public String getId(){
return id;//this可以不加
}
public void setId(String id){
this.id=id;
}
public String getName(){
return name;//this可以不加
}
public void setName(String name){
this.name=name;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age=age;
}
public void study(String kecheng){
System.out.println("正在学校"+kecheng);
}
public void sleep(){
System.out.println("学生正在休息");
}
}
class StudentZhongJieDemo
{
public static void main(String[] args)
{
System.out.println("Hello World!");
}
}