封装与继承
一.封装
封装的定义
面对对象三大特征之一(封装,继承,多态)
隐藏实现细节,仅对外暴露公共的访问方式
封装常见的体现
a.私有(private)成员变量,提供set和get方法
如果有构造方法,则在构造器中调用setter保证封装的安全性
b.将代码抽渠取到方法中,这是对代码的一种封装
c.将属性抽取到类中,这是对数据的一种封装
练习
无构造方法的封装
public class Penguin {
private String name;
private int health;
private int love;
private String sex;
public String getName() { return name; }
public void setName(String name) {
this.name = name;
}
public int getHealth() { return health; }
public void setHealth(int health) {
if (health < 0 || health > 100) {
System.out.println("健康值的有效性在0-100间,否则取默认值60");
health=60;
}this.health = health;
}
public int getLove() { return love; }
public void setLove(int love) {
if (love<0||love>100){
System.out.println("亲密值的有效性在0-100间,否则取默认值60");
love=60;
}this.love = love;
}
public String getSex() { return sex; }
public void setSex(String sex) {
this.sex = sex;
}
public void show(){
System.out.println("名字"+name+",性别"+getSex()+",健康值"+health+",亲密值"+love);
}
}
public class Test {
public static void main(String[] args) {
Penguin penguin=new Penguin();
penguin.setName("ciao");
penguin.setSex("nan");
penguin.setLove(1000);
penguin.setHealth(-100);
penguin.show();
}
}
有参构造的封装
public class Penguin {
private String name;
private int health;
private int love;
private String sex;
public Penguin(String name, int health, int love, String sex) {
setHealth(health);
setLove(love);
setSex(sex);
setName(name);
}
public String getName() { return name; }
public void setName(String name) {
this.name = name;
}
public int getHealth() { return health; }
public void setHealth(int health) {
if (health < 0 || health > 100) {
System.out.println("健康值的有效性在0-100间,否则取默认值60");
health=60;
}this.health = health;
}
public int getLove() { return love; }
public void setLove(int love) {
if (love<0||love>100){
System.out.println("亲密值的有效性在0-100间,否则取默认值60");
love=60;
}this.love = love;
}
public String getSex() { return sex; }
public void setSex(String sex) {
this.sex = sex;
}
public void show(){
System.out.println("名字"+getName()+",性别"+getSex()+",健康值"+getHealth()+",亲密值"+getLove());
}
}
public class Test {
public static void main(String[] args) {
Penguin penguin=new Penguin("xiaoyu",-100,30,"nan");
penguin.show();
}
}
企鹅类
public class Penguin {
private String name;
private int health;
private String sex;
public String getName() { return name; }
public void setName(String name) {
this.name = name;
}
public int getHealth() { return health; }
public void setHealth(int health) {
if (health < 0 || health > 100) {
System.out.println("健康值的有效性在0-100间,否则取默认值60");
health=60;
}this.health = health;
}
public String getSex() { return sex; }
public void setSex(String sex) {
this.sex = sex;
}
public void show(){
System.out.println("名字"+getName()+",性别"+getSex()+",健康值"+getHealth());
}
}
狗狗类
public class Dog {
private String name;
private int health;
private int love;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHealth() {
return health;
}
public void setHealth(int health) {
if (health < 0 || health > 100) {
System.out.println("健康值的有效性在0-100间,否则取默认值60");
health=60;
}this.health = health;
}
public int getLove() {
return love;
}
public void setLove(int love) {
if (love<0||love>100){
System.out.println("亲密值的有效性在0-100间,否则取默认值60");
love=60;
}this.love = love;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public void show(){
System.out.println("名字"+getName()+",性别"+getSex()+",健康值"+getHealth()+",亲密值"+getLove());
}
}
测试类
public class Test {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
Dog dog = new Dog();
Penguin penguin = new Penguin();
System.out.println("欢迎您来到宠物店!");
System.out.print("请输入要领养宠物的名字:");
String name = input.next();
dog.setName(name);
penguin.setName(name);
System.out.print("请选择要领养的宠物类型:(1、狗狗 2、企鹅)");
int num = input.nextInt();
switch (num) {
case 1:
System.out.print("请选择狗狗的性别(1、公 2、母):");
int num1 = input.nextInt();
if (num1 == 1) {
dog.setSex("公");
} else {
dog.setSex("母");
}
System.out.print("请输入狗狗的健康值(1~100之间):");
int num2 = input.nextInt();
dog.setHealth(num2);
System.out.print("请输入主人与狗狗的亲密度(1~100之间):");
int num3 = input.nextInt();
dog.setLove(num3);
System.out.println("宠物的自白:");
dog.show();
break;
case 2:
System.out.print("请选择企鹅的性别:(1、Q仔 2、Q妹)");
int num4 = input.nextInt();
if (num4 == 1) {
penguin.setSex("Q仔");
} else {
penguin.setSex("Q妹");
}
System.out.print("请输入企鹅的健康值(1~100之间):");
int num5 = input.nextInt();
penguin.setHealth(num5);
System.out.println("宠物的自白:");
penguin.show();
break;
}
}}
效果图
二.继承
概述
继承是面向对象三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法
格式
public class子类名 extends 父类名{}
继承中子类的特点
子类可以有父类的内容
子类还可以有自己特有的内容
继承的好处与弊端
1.提高了代码的复用性
2.提高代码的 维护性
3.当父类发生变化时,子类不得不跟着变化,削弱了子类的独立性
使用继承的原则
继承体现关系is a
举例苹果是水果的一种,可以使用继承的
狗是动物的一种,可以使用继承
猫是狗的一种,错误,所以不可以使用继承
继承中变量的访问特点
在子类方法中访问一个变量
子类局部范围找
子类成员范围找
父类成员范围找
如果都没有就报错(不考虑父亲的父亲)
super关键字
a.super代表父类对象
b.在子类构造方法中调用且必须是第一句
c.不可以访问父类中定义为private的属性和方法
子类访问父类成员
//我要访问本类的成员变量age,
System.out.println(this.age);
//我要访问父类的成员变量age
System.out.println(super.age);
继承中构造方法的访问特点
子类中的所有构造方法默认都会访问父类中的无参构造方法
super()默认出现在子类构造方法的第一行
如果父类中没有无参构造方法,只有带参构造方法,怎么办呢
- 通过使用super关键字去显示调用父类的带参构造方法
- 在父类中自己提供一个无参构造方法
示例
三.包
区分同名类,在项目中能有清晰的组织架构
package 包名;
导入包:
import 包名.类名;
四.访问权限
五.static修饰符
普通方法可以调用静态方法和静态属性
普通方法可以直接调用普通方法和普通属性
静态方法可以调用静态方法和静态属性
静态方法不可以直接调用普通方法和普通属性,需要使用对象 . 的方式调用
调用时就可以不用创建对象,直接类名.方法名调用
练习
模拟实现选民投票过程:一群选民进行投票,每个选民只允许投一次票,并且当投票总数达到100时,就停止投票
Voter类
public class Voter {
public static int voteNum = 0;
public static void vote() {
voteNum++;
}
}
TestVoter类
public class TestVote {
public static void main(String[] args) {
for (int i = 1; i <= 200; i++) {
Voter.vote();//调用静态方法
System.out.println("当前投票数为:" + i);
if(Voter.voteNum == 100){
System.out.println("投票完成 ");
break;
}
}
}
}