Java基础--封装、继承、多态

时间:2023-02-14 18:59:06

封装:

封装是指:将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问。
封装是面向对象语言对客观世界的模拟,在客观世界里,对象的状态信息都被隐藏在对象内部,外界无法直接直接操作和修改,就比如类中的Person
对象的age变量,只能随着岁月的流逝,age才会增加,通常不能岁月修改属性的值,良好的封装有以下特点:

1:隐藏类的实现细节
2:让使用者只能通过实现预定的方法来访问数据,从而可以在该方法里加入控制逻辑,限制对成员变量的不合理访问
3: 可进行数据检查,从而利用保证对象信息的完整性。
4:便于修改,提供代码的可复用性和维护性

最重要的两条就是:
a:把对象的成员变量和实现细节隐藏起来,不允许外部直接访问
b:把方法暴露出来,让方法控制对这些成员变量进行安全的访问和操作。
这样做的目的就是为了统一行径,可以在方法中加入控制逻辑。

继承:

继承是面向对象的三大特征之一,也是实现软件复用的重要手段,Java具有单继承的特点每个子类只有一个直接父类。
Java中的基础是通过extends关键字来实现的,实现继承的类称为子类,被继承的类被称为父类(超类,基类,大类)
例如苹果继承了水果,苹果是子类,水果是父类。
继承是把很多子类中相同的成员属性和方法定义父类的过程。

super
一定要有继承关系(父子关系)前提下,才会有super的概念
当前类如果没有继承关系,执行的类Object
如果有继承关系,一定执行父类的引用和父类构造函数

---他们都是给成员属性赋值操作
给成员属性赋值:
1:修饰符
2: 你属性是static,不是对象的范畴,通过类去调用
3:final 值赋值一次
4:final修饰的方法,不能被重写的方法.
5:final --不管针对的是成员变量还是局部变量,一定赋值就不能修改----常量
成员变量:
修饰的非静态成员变量,赋值的方式有三种:
1:直接赋值
2:通过代码块赋值
3:通过构造函数
如果是静态成员:
1:直接赋值
2:静态代码块赋值
局部变量:
1:直接赋值
2:可以不用赋初始值,但是只能赋值一次,赋值以后不能修改.
比如:
public void test(){
final int age ;
age = 10;
//age = 20;//error,编译通不过
}
多态:

多态是存在继承的前提下
Java引用变量有有两个类型,一个是编译时的类型,一个是运行时的类型,
编译时的类型由申明该变量时使用类型决定
运行时的类型有实际赋给该变量的对象决定,
如果编译时的类型和运行时的类型不一致的时候,就出现了所谓的多态。
注:多态的实例只能调用被子类覆盖的部分和父类公开和受保护以及同包下面缺省的成员变量和方法。


代码:

父类PhoneMessage

package test.phone;

public abstract class PhoneMessage {

/**
* 抽象类: 不能实现化对象,但是可以定义构造函数. 实现抽象类,方式有两种---一种:通过匿名内部类,一种是:具体子类
* 1:抽象类必须使用abstract修饰,抽象方法必须用abstract修饰,抽象方法中不能又具体的实现。
* 2:抽象类不能被实例化对象的,但是可以定义构造函数,目的是给当前抽象类的私有成员属性赋值目的。(注:一种:通过匿名内部类,一种是:具体子类)
* 3:抽象方法,必须定义在抽象类中或者接口中。如果有抽象方法就要必然是抽象类或者接口。 4:final不能够abstract共用
* 5:不能私有private 可以是public protected 6:没有抽象属性的概念
* 7:抽象类可以继承抽象类,也可以继承普通类,也可以实现接口.
*
* 1:从语义上的角度来看,抽象类是从多个具体类中抽象出来的父类,它具有更高层次的抽象,从多个具有相同特征的类中抽象出一个抽象类, 以这个抽象类作为其字类的 模板,从而子类设计的随意性。
* 2:抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展,改造,但子类总体上回大致保留抽象类的行为方式。
* 3:如果编写一个抽象父类,父类提供多个子类的通用方法,并把一个或多个方法留给器子类实现,这就是模板模式,
* 4:如果父类中定义的普通方法一般都是给所有子类调用的方法,或者私有方法给自己调用的方法。 5:抽象方法的类一定抽象类,抽象类不一定有抽象方法
*
*/

public abstract String sendMessage(String message);
public abstract void callPhone(String tel);

}
子类1YiDong继承父类

package test.phone;

//extends继承父类
public class YiDong extends PhoneMessage {

// 属性私有化,通过构造函数赋值。封装,通过构造函数赋值
private String username;
private String company = "移动";

// 构造函数
public YiDong() {
super();
}

// 重载
public YiDong(String username) {
super();
this.username = username;
}

// 重写
@Override
public String sendMessage(String message) {
System.out.println(this.company + "的用户" + this.username + "发送的短信内容是:" + message);
System.out.println("扣除1毛钱");
return "success";
}

@Override
public void callPhone(String telephone) {
System.out.println(this.company + "的用户" + this.username + "拨通了电话号码:" + telephone);
System.out.println("扣除1.5毛");
}

}

子类2LianTong继承父类

package test.phone;

public class LianTong extends PhoneMessage {

private String username;
private String company = "联通";

// 构造函数
public LianTong() {
super();
}

public LianTong(String username) {
super();
this.username = username;
}

// 重写
@Override
public String sendMessage(String message) {
System.out.println(this.company + "的用户" + this.username + "发送的短信内容是:" + message);
System.out.println("扣除5毛钱");
return "success";
}

@Override
public void callPhone(String telephone) {
System.out.println(this.company + "的用户" + this.username + "拨通了电话号码:" + telephone);
System.out.println("扣除5.5毛");
}

}

测试类:
package test.test;

import test.phone.LianTong;
import test.phone.PhoneMessage;
import test.phone.YiDong;

public class Test {

public static void main(String[] args) {
/**
* 多态:
* PhoneMessage yidong --编译时的类型
* = new YiDong("fyl"); --运行时的类型
* 如果编译时的类型和运行时的类型不一致的时候,就出现了所谓的多态。
* 注:多态的实例只能调用被子类覆盖的部分和父类公开和受保护以及同包下面缺省的成员变量和方法。
*/
PhoneMessage yidong = new YiDong("fyl");
yidong.callPhone("186");
String result = yidong.sendMessage("你好。。。。。。。");
if (result == "success") {
System.out.println("短信发送成功");
}

System.out.println("==========================================");

PhoneMessage liantong = new LianTong();
liantong.callPhone("185");
liantong.sendMessage("hello......");

}
}

输出结果

移动的用户fyl拨通了电话号码:186
扣除1.5毛
移动的用户fyl发送的短信内容是:你好。。。。。。。
扣除1毛钱
短信发送成功
==========================================
联通的用户null拨通了电话号码:185
扣除5.5毛
联通的用户null发送的短信内容是:hello......
扣除5毛钱