JavaOOP以及接口

JavaOOP以及接口

一、封装

面向对象设计的过程就是抽象的过程,根据业务需求,关注与业务相关的属性和行为,忽略不
必要的属性和行为,由现实世界中的对象” 抽象出软件开发中的 “对象” 如下图:

在这里插入图片描述

在这里插入图片描述

1、寻找类的方法

下面按照发现类,发现类的属性和发现类的方法这三个步骤完成设计,
通过在需求中找出名词的方式确定类和属性,通过找出动词的方式确定方法,并根据需要实现
业务的相关程度进行筛选。
第一步: 发现类。
需求中的名词有控制台.宠物,昵称.狗狗.企鹅、类型,品种、聪明的拉布拉多大。 酷酷的
纳瑞,性别,Q仔. Q妹.健康值亲密度和主人等。
经过仔细筛选,发现可以作为类的名词有宠物、 狗狗。企鹅和主人。本章要实现领养宠物功能,
主要用到两个类狗狗(Dog) 和企鹅(Penguin,
宠物类和主人类在后面完善设计和增加功能时再
使用,

第二步,发现类的属性。
可作为属性的名词有呢称,健康值。亲密度。品种和性别,还有一些名词是作为属性值存在的
如明的拉布拉多犬,酷酷的雪纳瑞是品种的属性值,Q仔和Q妹是性别的属性值。
根据业务需求,可以定义狗狗类的属性有呢称(name). 健康值(health), 亲密度(love) 和品祥
(strain)。
企鹅类的属性有呢称(name). 健康值(heath. 亲密度(love) 和性别(sex)L 狗狗和企!
的某些属性,如年龄。体重,颜色等与领养业务需求无关,不予设置。

第三步:发现类的方法。
需求中的动词主要有输入,选择,领养,打印等。剔除和设计无关,不重要的词语,类的方
主要是打印宠物信息,取名为print()。 至于狗狗睡觉,洗澡等行为,企鹅吃饭、游泳等行为,与
养业务需求无关,现在先不为其设定方法,在后续业务中若有需求再添加。

2、创建类和对象

➢通过构造方法来创建对象, 如

Penguin p=new Penguin( ):

➢通过对象名.属性名的方式调用属性,如:

p.name= "qq”;

➢通过对象名.方法名的方式调用方法,如:

p. print( );

类(Class) 和对象(Object) 是面向对象中的两个核心概念。类是对某一类事物的描述, 是抽象的、
概念上的定义。对象是实际存在的.具体的事物个体。类和对象就好比模具和铸件的关系,建筑物
I图样和建筑物实物的关系。我们可以由一.个类创建多个对象。

3、构造方法及其重载

在Penguin类中增加-一个无参的构造方法,如下:

public Penguin(){}

其中,Penguin( )方法就是Penguin类的构造方法,当执行语句pgn=new Penguin( )方法时,就会执行构造方法Penguin( )方法中的代码。构造方法是一- 个特殊的方法,当没有Penguin( )方法时,系统会提供一个空的Penguin( )方法。构造方法的名称和类名相同,没有返回值类型。构造方法的主要作用就是在创建对象时执行-些初始化操作。如给成员属性赋初值。

publie Penguin() (
name . "楠楠”;
love - 20;
sex 
-”Q妹”;
System. out .println("执行构造方法");

重载

//无参构造方法

public Penguin() {
name = "楠楠";
love = 20;
sex = "Q妹";
System.out.print1n("执行构造方法") ;
}
/**
*两个参数的构造方法
*/
public Penguin (String name, String sex){
this . name = name ;
this.sex = sex;
}
/**
*四个参数的构造方法
*/
public Penguin (String name, int health, int love, String sex) {
this . name = name ;
this. health = health;
this.love = love ;
this.sex = sex;
}

共有三个构造方法,方法名相同,参数列表不同,这称为构造方法的重载。可以通过
构造方法的重载来实现多种初始化行为,在创建对象时可以根据需要选择合适的构造方法。

如果同一个类中包含了两个或两个以上的方法,它们的方法名相同,方法参数的个数或参数类
型不同,则称该方法被重载了,这个过程称为方法重载。成员方法和构造方法都可以进行重载。

4、static修饰符

static可以用来修饰属性、方法和代码块。static 修饰的变量属于这个类所有,即由这个类创建
所有对象共用同一个static变量。通常把static修饰的属性和方法称为**类属性(类变量)和类方法。
不使用static 修饰的属性和方法属于单个对象,通常称为
实例属性(实例变量)**和实例方法。

4.1、注意事项

➢在加载类的过程中, 完成静态变量的内存分配,再执行静态块,两者是在创建对象之前执
行的。
➢类属性和类方法可以通过类名和对象名访问,实例属性和实例方法只能通过对象名访问。
➢类方法只能访问类属性和其他类方法。

5、封装

封装是面向对象的三大特性之-.就是将类的状态信息隐藏在类内部,不允许外部程序直接访
问,而通过该类提供的方法来实现对隐藏信息的操作和访问。
封装的具体步骤:修改属性的可见性来限制对属性的访问:为每个属性创建-对赋值 (ette 方法
和取值(ette方法,用于对这些属性的存取:在赋值方法中,加入对属性的存取控制语句。
封装的好处:隐藏类的实现细节:让使用者只能通过程序规定的方法来访问数据:可以愣便地
访问数据

访问修饰符说明
private成员变量和方法只能在其定义的类中被访问,具有类可见性。
默认成员变量和方法只能被同一个包里的类访问,具有包可见性。
protected可以被同一个包中的类访问,被同- -个项目中不同包中的子类访问(父类、子类
public可以被同一个项目中的所有类访问,具有项目可见性,这是最大的访问权限。
5.1、this关键字

this关键字是对一个对象的默认引用。在每个实例方法内部,都有一个this引用变量,指向调用
这个方法的对象。

二、继承

继承是面向对象的三大特性之-. 是Java中实现代码重用的重要手段之一。 Java中只支持单继如Dog is a per
每个类只能有一个直接父类。继承表达的是isa的关系,或者说是一 种特殊和般的关系,
Pet。 同样,可以让学生继承人,让苹果继承水果,让三角形继承几何图形。
在Java中.福T.所有的Java类都直接或间接地继承了java lang. Object类。Object类是所有Java类

Class。在定义一个类时,如果没有使用extends关键字,那么这个类直接继承Object类.例如pubic
MyObject{}表明: MyObject 类的直接父类为object类。

修饰符 SubClass extends SuperClass {
//类定义部分
}

继承(inheritance) 通过extends关键字来实现,其中的SubClass称为子类,SuperClass 称为父类基类或超类。修饰符如果是public, 则该类在整个项目中可见,若无public修饰符,则该类只在当包可见:不可以使用private和protected修饰类,进行编码实现优化后的方案。

public Dog(String name, String strain) {
super (name) ; //此处不能使用this . name =name ;
this.strain = strain;
}

'super (name);"表示调用了父类 Pet的有参构造方法,还可以使用super
关键字调用直接父类的方法,如"super print( )”。

1、继承老子会有什么东西

➢继承 public和protected修饰的属性和方法,无论子类和父类是否在同一个包里。
➢继承默认权限修饰符修 饰的属性和方法.但子类和父类必须在同一个包里。
➢无法继承private修饰的属性和方法。
无法继承父类的构造方法。

访问修饰符本类同包子类其他
privatev
默认vv
protectedvvv
publicvvvv
2、重写和继承关系中的构造方法

在子类中可以根据需求对从父类继承的方法进行重新编写,称为方法的重写或方法的掩盖(overrideing), 方法重写必须满足如下要求。

重写方法和被重写方法必须具有相同的方法名。

重写方法 和被重写方法必须具有相同的参数列表。

里与方法的返回值类型必须和被重写方法的返回值类型相同或是其子类。
重写方法不能缩小被重写方法的访问权限。

3、super

super代表对当前对象的直接父类对象的默认引用。在子类中可以通过super 关键字来访问父类的成员。
super必须出现在子类(子类的方法和构造方法)中,而不是其他位置。
➢可以访问父类的成员, 如父类的属性、方法,构造方法。
➢注意访问权限的限制, 如无法通过super 访问private成员。

4、抽象类和抽象方法

4.1、抽象类和抽象方法的特点
(1)抽象类和抽象方法都通过abstret 关键字来修饰。
(2)抽象类不能实例化。抽象类中可以没有、有一个或多个抽象方法,甚至全部方法都可以是抽象方法。(3)抽象方法只有方法声明, 没有方法实现。有抽象方法的类必须声明为抽象类。 子类必须重写所有
的抽象方法才能实例化,否则子类还是一 个抽象类。

4.2、final的应用

final和abstract是功能相反的两个关键字,可以对比记忆。
abstract可以用来修饰类和方法,不能用来修饰属性和构造方法。final 可以用来修饰
类、方法和属性,不能修饰构造方法。

三、多态

1、子类到父类的转换(向上转型)

在用Java理解程序逻辑中我们学习了基本数据类型之间的类型转换。例如:


//将Int型常量或变量的值赋给double型变量,可以自动进行类型转换
int i=5double d1=5 ;
//将double型常量或变量的值赋给int型变量,进行强制类型转换

double d2=3.14 ;
int a=(int)d2;

从上面语句中可以总结出子类转换成父类时的规则。
➢将一个父类的引用指向一个子类对象,称为向上转型(upcasting). 自动进行类型转换。
➢此时通过父类引用变量调用的方法是子类覆盖或继承父类的方法,不是父类的方法。
➢此时通过父 类引用变量无法调用子类特有的方法。

2、使用父类作为方法形参实现多态

使用父类作为方法的形参,是Java中实现和使用多态的主要方式之一。下面就以这种方式重构
主人给宠物喂食的功能。

/**
*主人类
*/
public class Master {
private String name . "";
//主人名字
private int money .0;
//元宝数
public Master(String name, int money){
this.name = name ; 
this.money =money;
/**
*主人给宠物喂食
*/
public void feed(Pet pet) (
pet.eat () ;
/* //主人给Dog喂食
public void feed(Dog dog) {
dog.eat () ;
//主人给Penguin喂食
public void feed (Penguin pgn) {
pgn.eat() ;
*/

}}
/**
*测试类,领养宠物并喂食
*/
public class Test {
public static void main(String[] args) {
Master master=new Master ("王先生",100);
Pet pet = new Dog("欧欧""雪纳瑞");
//Pet pet = new Penguin("楠楠", "Q妹");
master. feed(pet);//主人给宠物喂食
}
}

从该代码可以看到,代码中只使用了一个feed( )方法,使用父类作为方法形参就可以正确显示多个宠物的吃饭形态,无须再编写示例6中被多行注释的代码,从而大大减少了码量。

3、instanceof运算符

语法:

对象 instanceof 类或接口

该运算符用来判断一个对象是否属于一个类或者实现了一个接口,结果为true或false. 在强制
类型转换之前通过instanceof运算符检查对象的真实类型,再进行相应的强制类型转换,这样就可以
避免类型转换异常,从而提高代码的健壮性。

四、接口

1、什么是接口

在生活中,接口是一套规范,只要是满足这个规范的设备,就可以将它们组装到一起,从而实
制定义备的功能,现在以USB接口为例,来学习接口的含义. uUSB 接口实际上是某些企业和组织等制定程等,神约定或标准,规定了接口的大小,形状,各引脚信号的范围和含义.通信速度、通信流开按照该约定或标准来设计各种设备,如∪盘. USB风扇、 UsB 鼠标都可以插到USB口上正常工作

语法如下:

语法,
[修饰符] interface 接口名extends 父接口1,父接口2...... {
//常量定义
//方法定义
语法.
class类名extends 父类名implements 接口1,接口.....
/1类成员
}

2、接口表示一种能力

接口不仅弥补了Java 只支持单继承的缺点,还利于代码的扩展和维护。接口类似于一个组件,需要时可以自由组装。从使用角度来讲,接口和抽象类的区别在于:抽象类利于代码复用,接口利于代码维护。
在Java API中,可以发现很多接口名都是以"able" 为后缀的,就是表示“可以做… 如
Serializable. Comparable. lterable 等。在微软公司的.NET中也有很多接口名以"able" 为后级,如
IComparable. Iullble. IClonable 等,也表示同样的意思。

3、接口表示一种约定

在面向对象编程中提倡面向接口编程,而不是面向实现编程。什么是面向接口编程呢?简单来
说. 如果打印机厂商只面向某一家或几家厂商的墨盒产品规格生产打印机,而没有一个统一 的约定,
就无法使用更多厂商的墨盒。如果这家墨盒厂商倒闭了,那么打印机就无用武之地了。为什么会出
现这种情况呢?这是因为它们彼此依赖性太强了.或者说耦合性太强了。而如果按照统一的约定生
产打印机和墨盒,就不会存在这个问题。

面向接口编程可以实现接口和实现的分离,这样做最大的好处就是能够在客户端未知的
情况下修改实现代码。那么怎祥抽象出接口呢?一种是用在层和层之间的调用。层和层
之间最忌讳耦合度过高或修改过于频繁。设计优秀的接口能够解决这个问题。另一种是
使用在那些不稳定的部分上。如果某些需求的变化性很大,那么定义接口也是一种解决
方法。设计良好的接口就像日常使用的万用插座,不论插头如何变化,都可以使用。
最后强调一点,良好的接口定又一定是来自于需求的,它绝对不是程序员绞尽脑汁想出
来的。

4、接口总结

➢接口中的属性都是全局静态常量, 接口中的方法都是全局抽象方法,接口中没有构造方法
➢类只能继承一 一个父类,但可以实现多个接口。 一个类如果实现了一个接口,则必须实现接
口中的全部方法,否则必须将其定义为抽象类。Java通过实现接口达到了多重继承的效果。
➢接口表示一种约定,接口表示一 种能力。接口体现了约定和实现相分离的原则。
➢抽象类利于代码复用, 接口利于代码维护。
➢通过面向接口编程, 可以降低代码间的耦合性,提高代码的可扩展性和可维护性。
➢面向接口编程意味着: 开发系统时,主体构架使用接口,接口构成系统的骨架,这样就可
以通过更换实现接口的类来实现更换系统。
➢C#中接口的成员主要是方法和属性。 接口中不能包含常量,变量、构造方法和任何静态成
员。定义接口时显式指定任何修饰符是非法的。

➢接口中的属性都是全局静态常量, 接口中的方法都是全局抽象方法,接口中没有构造方法
➢类只能继承一 一个父类,但可以实现多个接口。 一个类如果实现了一个接口,则必须实现接
口中的全部方法,否则必须将其定义为抽象类。Java通过实现接口达到了多重继承的效果。
➢接口表示一种约定,接口表示一 种能力。接口体现了约定和实现相分离的原则。
➢抽象类利于代码复用, 接口利于代码维护。
➢通过面向接口编程, 可以降低代码间的耦合性,提高代码的可扩展性和可维护性。
➢面向接口编程意味着: 开发系统时,主体构架使用接口,接口构成系统的骨架,这样就可
以通过更换实现接口的类来实现更换系统。
➢C#中接口的成员主要是方法和属性。 接口中不能包含常量,变量、构造方法和任何静态成
员。定义接口时显式指定任何修饰符是非法的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值