面向对象程序设计思想

一、思想

处处皆对象。

当提到某一功能时,首先应该想有没有实现该功能的对象,有则调用,没有则创建类。当提到数据时,应该想到属于哪个对象。

1.求1~n的累加和

public class Sum {
int n;
public int getSum(){
int s=0;
for(int i=1;i<=n;i++)
s=s+i;
return s;
}
}
public class Demo1 {
public static void main(String[] args) {
Sum sum=new Sum();
sum.n=10;
System.out.println(sum.getSum());
}
}

2.设计步骤

提炼、描述、创建、调用

3.类和对象

类是对同一类事物的抽象描述。抓住两点:属性和行为;

对象是类的一个实体、实例。

格式:

[访问控制符] class 类名{

​ 变量的声明;

​ 方法的声明;

}

类体中只包含:变量的声明方法的定义

4.对象的创建

类名 对象名;//声明对象

对象名=new 类名();//创建对象

Sum sum=new Sum();

new运算符的作用是调用类的构造方法,实例化(创建)对象,对类中的成员(变量)分配内存空间,并对其进行初始化(赋初值)。

5.对象的使用

访问属性:对象名. 属性名

调用方法:对象名.方法名(参数列表)

二、构造方法

特殊的一个方法:

1.作用

实例化(创建)对象,对类中的成员(变量)分配内存空间,并对其进行初始化(赋初值)

2.特殊

  • 方法名与类名相同
  • 无返回值(void)
  • 只能通过new运算调用
  • 一个类不能没有构造方法(无显式声明,系统自动创建)
  • 构造方法可以重载

三、this关键字

变量的作用范围:类级、对象级、方法级、块级。

如果在方法内部声明的方法级变量与对象级(成员变量)同名,方法内部,成员变量将被隐藏(方法内部无法直接访问成员变量)。

this关键字代表当前对象。

四、static关键字

1.静态变量

用static修饰的成员变量,称为静态变量(类变量)。未修饰的变量称为成员变量(实例变量)。

  • 不同对象的实例变量(成员变量)互不相同
  • 所有对象共享静态变量(类变量)
  • 类变量属于该类对象共有,因此可以通过类名或对象名访问;而实例变量属于对象所私有,只能通过对象名访问。
p1.country="古人";//对象名.属性名
Person.country="中原人氏";//类名.属性名

2.static方法

用static修饰的方法,称为类方法(静态方法)。它不需要创建对象即可访问。通过类名访问。

当类的字节码文件被加载到内存时,类的实例方法不会被分配入口地址,只有该类创建对象后,类中的实例方法才分配入口地址,从而实例方法可以被类创建的任何对象调用。需要注意的是,当我们创建第一个对象时,类中的实例方法就分配了入口地址,当再创建对象时,不再分配入口地址,也就是说,方法的入口地址被所有的对象共享,当所有的对象都不存在时,方法的入口地址才被取消。

类方法可以通过类名或对象名调用;而实例方法只能通过对象名调用。

3.练习

统计用该类产生了多少个对象

学生的学号自动编号。当用学生类创建对象时,其学号自动生成。1、2、3、4、5、6

public class Student {
static int id;
String number;
String name; public Student(String name) {
this.id++;
this.name = name;
}
public void printInfo(){
System.out.println(this.name+" "+this.id);
}
}

五、封装性

就是把对象的成员属性和成员方法结合成一个独立的相同单位,并尽可能隐藏对象的内部细节。包含两个含义:

  • 把对象的全部成员属性和方法结合在一起,形成一个不可分割的独立单位(对象)
  • 信息隐藏,即尽可能隐藏对象的内部细节,对外形成一个边界,只保留有限的对外接口(与外部发生联系)。

1.访问权限

当用一个类创建了一个对象之后,该对象可以通过"."运算符操作自己的变量,使用类中的方法。

public class Dog {
String name;
public Dog(String name){
this.name=name;
}
public void shout(){
System.out.println("汪汪");
}
}
public class Demo1 {
public static void main(String[] args) {
Dog dog=new Dog("小强");//使用Dog类创建该类对象,对象名为dog
System.out.println(dog.name);//通过"."操作自己的变量
dog.shout();//通过"."使用类中的方法
}
}

但对象操作自己的变量和使用类中的方法是有一定限制的。

访问权限是指对象是否可以通过“."运算符操作自己的变量或通过"."运算符调用类中的方法。用来控制对象内部变量和方法在外界(类的外部)的可见性。

public、protected、default、private

2.public

用public修饰的成员变量和成员方法,称为公有变量和公有方法。对外界是公开的。公共变量和方法除了在类内部可以访问外,还可以在类的个部进行访问

3.private

用private修饰的成员变量和成员方法,称为私有变量和私有方法。对外界不公开。私有变量和私有方法只能在类内部访问

public class Dog {
String name;
public Dog(String name){
this.name=name;
}
public void shout(){
System.out.println("汪汪");
f();//在类的内部访问private方法
}
private void f(){
System.out.println("会看家");
}
}
public class Demo1 {
public static void main(String[] args) {
Dog dog=new Dog("小强");//使用Dog类创建该类对象,对象名为dog
System.out.println(dog.name);//通过"."操作自己的变量
dog.shout();//通过"."使用类中的方法
//dog.f();//不能在类的外部访问private方法
}
}

4.default、protected

包访问权限。后面讲继承时再讲。

5.为什么要进行封装

对象中的成员属性如果没有被封装,一旦对象创建完成,就可以通过对象的引用获取任意的成员属性和值。并能够给所有的成员属性任意赋值。对象的成员属性属于对象私有。与其它对象区别的特征。

对象中的成员方法如果没有被封装,也可以在对象的外部随意调用,因为对象中的成员方法只有部分是给外部提供的。

封装的最根本目的:保护内部。

6.封装的原则

要求对象以外的部分不能随意的存取对象的内部数据(成员属性和成员方法),从而有效的避免了外部错误对它的”交叉感染“,是软件错误能够局部化,大大减少差错和排错的难度。

封装的方法就是在声明成员变量或成员方法时,使用private关键字修饰就实现了对成员的封装。通过这种方式实现对内部成员变量和成员方法的保护。

public class Person {
private String name;
private String sex;
private int age;
private String address;
private void f(){ }
}

对象中的成员变量和成员方法一旦私有后,就只能在对象的内部使用了,外部将不能使用。此时,如果需要在对象的外部对成员变量进行赋值、取值,给它们写一个公共的setter、getter方法。通过这两个方法来设置、获取对象成员变量的值。setter、getter方法是否添加取决于需要。

public class Person {
private String name;
private String sex;
private int age;
private String address;
public String getName(){
return this.name;
}
public void setName(String name){
this.name=name;
}
}

六、作业

ATM取款机重构。采用面向对象的程序设计思想。

Facetoobject_encapsulation的更多相关文章

随机推荐

  1. Asp.net core中RedisMQ的简单应用

    最近一个外部的项目,使用到了消息队列,本来是用rabbitmq实现的,但是由于是部署到别人家的服务器上,想尽量简化一些,项目中本来也要接入了redis缓存,就尝试使用redis来实现简单的消息队列. ...

  2. 博客中css样式的正确设置

    一.简介 博客园的文章是支持html代码和css样式的,即使是markdown写作.当某个标签需要特制样式时,我们可以自定义样式来覆盖掉原本的样式. 二.css样式优先级 参考至>>菜鸟教 ...

  3. 团队作业part1--团队展示&选题

    一.团队展示 1.队名 DiligentVegetableChicken 2.队员信息 纪昂学(组长):3118005053 廖业成:3118005060 蔡越:3118005086 周梓波:3118 ...

  4. 【Alpha冲刺阶段】Day 7

    [Alpha冲刺阶段]Scrum Meeting Daily7 1.会议简述 会议开展时间 2020/5/28   8:00-8:30 PM 会议基本内容摘要 讨论合并测试问题 参与讨论人员 项目全体 ...

  5. 基于gin的golang web开发:服务间调用

    微服务开发中服务间调用的主流方式有两种HTTP.RPC,HTTP相对来说比较简单.本文将使用 Resty 包来实现基于HTTP的微服务调用. Resty简介 Resty 是一个简单的HTTP和REST ...

  6. 百度前端技术学院-基础-day2

    2020.9.15 今天是学习前端基础技术的第二天,今天制作了一个在线简历,纯html的那种.帮助我复习了以前的基础知识,也增加了新的知识点,比如制作列表可以用fieldset来整合数据. 我的在线简 ...

  7. typora字体与字体颜色

    字体 基本格式:\字体信息{内容} 罗马体\rm \rm{罗马体abc}>>\(\rm{罗马体abc}\) 意大利体\it \it{意大利体}>>\(\it{意大利体}\) 等 ...

  8. WebFlux中thymeleaf视图找不到的问题解决

    由于在weblux临时增加一个H5的页面,发生如下错误 Whitelabel Error Page This application has no configured error view, so ...

  9. emca配置EM

    EM DC(Enterprise Manager Database Control)是 web 界面的数据库管理工具, 可用于配置 EM DC环境的工具包括: Oracle Universal In ...

  10. mysqldump备份数据

    create database test; use test; create table test(id int,name char(8)); insert into test values(1,'p ...