parent
0808d68011
commit
98913a9913
|
@ -0,0 +1,30 @@
|
|||
## 实例: 根据身高、体重计算BMI值
|
||||
创建 BMIexponent 类,声明double 型变量height 记录身高,单位为米,声明 int 型变量 weight 记录体重,单位为千克,根据 BMI= 体重/(身高× 身高)的公式计算 BMI指数,实例代码如下∶
|
||||
```java
|
||||
public class BMIexponent {
|
||||
public static void main(String[] args) {
|
||||
double height = 1.82; // 身高变量,单位:米
|
||||
int weight = 65; // 体重变量,单位:千克
|
||||
double exponent = weight / (height * height); // BMI计算公式
|
||||
System.out.println("您的身高为:" + height);
|
||||
System.out.println("您的体重为:" + weight);
|
||||
System.out.println("您的BMI指数为:" + exponent);
|
||||
System.out.print("您的体重属于:");
|
||||
if (exponent < 18.5) { // 判断BMI指数是否小于18.5
|
||||
System.out.println("体重过轻");
|
||||
}
|
||||
if (exponent >= 18.5 && exponent < 24.9) { // 判断BMI指数是否在18.5到24.9之间
|
||||
System.out.println("正常范围");
|
||||
}
|
||||
if (exponent >= 24.9 && exponent < 29.9) { // 判断BMI指数是否在24.9到29.9之间
|
||||
System.out.println("体重过重");
|
||||
}
|
||||
if (exponent >= 29.9) { // 判断BMI指数是否大于29.9之间
|
||||
System.out.println("肥胖");
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
#### 练习1:试着实现将37摄氏度转换为整型的华氏度。(提示∶ 华氏度 =32+摄氏度 ×1.8)
|
||||
#### 练习2:一个圆柱形粮仓,底面值径为 10米,高为 3米,该粮仓体积为多少立方米?如果每立方米屯粮 750 千克,该粮仓一共可储存多少千克粮食?
|
||||
|
|
@ -0,0 +1,155 @@
|
|||
**思考:** 构造方法能作为抽象方法吗?
|
||||
|
||||
## 实例1:使用抽象类模拟"去商场买衣服"场景
|
||||
|
||||
"去商场买衣服",这句话描述的是一个抽象的行为∶到底去哪个商场买衣服,是实体店还是网店,买什么样的衣服,是短衫、裙子,还是其他的什么衣服?在"去商场买衣服"这句话中,并没有为"买衣服"这个抽象行为指明一个确定的信息。设计一个商场的抽象类,并在其中定义买东西的抽象方法,具体是什么商场、买什么东西,交给子类去实现即可。代码如下∶
|
||||
```java
|
||||
public abstract class Market {
|
||||
public String name; // 商场名称
|
||||
public String goods; // 商品名称
|
||||
|
||||
public abstract void shop(); // 抽象方法,用来输出信息
|
||||
}
|
||||
```
|
||||
定义一个TaobaoMarket类,继承自 Market 抽象类,实现其中的shop()抽象方法:
|
||||
```java
|
||||
public class TaobaoMarket extends Market {
|
||||
public void shop() {
|
||||
System.out.println(name + "网购" + goods);
|
||||
}
|
||||
}
|
||||
```
|
||||
定义一个 WallMarket 类,继承自Market 抽象类,实现其中的shop()抽象方法:
|
||||
```java
|
||||
|
||||
public class WallMarket extends Market {
|
||||
public void shop() {
|
||||
System.out.println(name + "实体店购买" + goods);
|
||||
}
|
||||
}
|
||||
```
|
||||
定义一个 GoShopping类,在该类中分别使用WallMarket类和TaobaoMarket类创建抽象类的对象,并分别给抽象类中的成员变量赋不同的值,调用 shop()方法分别输出结果:
|
||||
```java
|
||||
public class GoShopping {
|
||||
public static void main(String[] args) {
|
||||
Market market = new WallMarket(); // 使用派生类对象创建抽象类对象
|
||||
market.name = "沃尔玛";
|
||||
market.goods = "七匹狼西服";
|
||||
market.shop();
|
||||
market = new TaobaoMarket(); // 使用派生类对象创建抽象类对象
|
||||
market.name = "淘宝";
|
||||
market.goods = "韩都衣舍花裙";
|
||||
market.shop();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 练习1:
|
||||
创建 Shape(图形)类,该类中有一个计算面积的方法。圆形和矩形都继承自图形类,输出圆形和矩形的面积。
|
||||
|
||||
#### 练习2:
|
||||
创建工厂类,工厂类中有一个抽象的生产方法,创建汽车厂和鞋厂类,重写工厂类中的抽象生产方法,输出汽车厂生产的是汽车,鞋厂生产的是鞋。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
**使用抽象类和抽象方法时,需要遵循以下原则**∶
|
||||
- 在抽象类中,可以包含抽象方法,也可以不包含抽象方法,但是包含了抽象方法的类必须被定义为抽象类。
|
||||
- 抽象类不能直接被实例化,即使抽象类中没有声明抽象方法,也不能被实例化。
|
||||
- 抽象类被继承后,子类需要重写抽象类中所有的抽象方法。
|
||||
- 如果继承抽象类的子类也被声明为抽象类,则可以不用重写父类中所有的抽象方法。使用抽象类时,可能会出现这样的问题;程序中会有太多冗余的代码,同时父类的局限性很大。例如,上面的例子中,也许某个不需要 shop()方法的子类也必须重写 shop()方法。如果将这个 shop()方法从父类中拿出,放在别的类里,又会出现新间题∶某些类想要实现"买衣服"的场景,意然需要继承两个父类。Java中规定,一个类不能同时继承多个父类,为解决这种问题,接口应运而生。
|
||||
|
||||
|
||||
## 实例2:通过实现接口 绘制出特殊的平行四边形
|
||||
特殊的平行四边形有矩形、正方形和菱形。现使用接口的相关知识绘制出特殊的平行四边形。
|
||||
```java
|
||||
|
||||
interface DrawImage { // 定义“画图形”接口
|
||||
public void draw(); // 定义抽象方法“画”
|
||||
}
|
||||
|
||||
class Rectangle implements DrawImage { // 矩形类实现了drawTest接口
|
||||
public void draw() { // 矩形类中实现draw()方法
|
||||
System.out.println("画矩形");
|
||||
}
|
||||
}
|
||||
|
||||
class Square implements DrawImage { // 正方形类实现了drawTest接口
|
||||
public void draw() { // 正方形类中实现draw()方法
|
||||
System.out.println("画正方形");
|
||||
}
|
||||
}
|
||||
|
||||
class Diamond implements DrawImage { // 菱形类实现了drawTest接口
|
||||
public void draw() { // 菱形类中实现draw()方法
|
||||
System.out.println("画菱形");
|
||||
}
|
||||
}
|
||||
|
||||
public class SpecialParallelogram { // 定义特殊的平行四边形类
|
||||
public static void main(String[] args) {
|
||||
// 接口也可以进行向上转型操作
|
||||
DrawImage[] images = { new Rectangle(), new Square(), new Diamond() };
|
||||
// 遍历“画图形”接口类型的数组
|
||||
for (int i = 0; i < images.length; i++) {
|
||||
images[i].draw(); // 调用draw()方法
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**提醒:** 由于接口中的方法都是抽象方法,所以当子类实现接口时,必须实现接口中的所有抽象方法。
|
||||
|
||||
|
||||
## 实例3: 使用继承输出儿子喜欢做的事
|
||||
爸爸喜欢做的事有抽烟和钓鱼,妈妈喜欢做的事有看电视和做饭,儿子完全继承了爸爸妈妈的爱好,使用多重继承输出儿子喜欢做的事。首先定义一个DadLikeDo接口,并在接口中定义两个方法 smoke()和 fish():
|
||||
```java
|
||||
public interface DadLikeDo { // 定义“爸爸喜欢做的事”接口
|
||||
void smoke(); // 抽烟的方法
|
||||
|
||||
void fish(); // 钓鱼的方法
|
||||
}
|
||||
|
||||
public interface MomLikeDo { // 定义“妈妈喜欢做的事”接口
|
||||
void watchTV(); // 看电视的方法
|
||||
|
||||
void cook(); // 做饭的方法
|
||||
}
|
||||
|
||||
|
||||
// 继承DadLikeDo接口和MomLikeDo接口
|
||||
public class SonLikeDo implements DadLikeDo, MomLikeDo {
|
||||
public void watchTV() { // 实现watchTV()方法
|
||||
System.out.println("看电视");
|
||||
}
|
||||
|
||||
public void cook() { // 实现cook()方法
|
||||
System.out.println("做饭");
|
||||
}
|
||||
|
||||
public void smoke() { // 实现smoke()方法
|
||||
System.out.println("抽烟");
|
||||
}
|
||||
|
||||
public void fish() { // 实现fish()方法
|
||||
System.out.println("钓鱼");
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
SonLikeDo son = new SonLikeDo(); // 通过子类创建IFather接口对象
|
||||
System.out.println("儿子喜欢做的事有:");
|
||||
// 子类对象调用DadLikeDo和MomLikeDo两个接口被实现的所有方法
|
||||
son.watchTV();
|
||||
son.cook();
|
||||
son.smoke();
|
||||
son.fish();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
```
|
||||
|
||||
**思考:**
|
||||
如何区分抽象类和接口?有哪些不同?
|
|
@ -0,0 +1,129 @@
|
|||
## 实例1:使用 if…else if 语句实现饭店座位分配
|
||||
创建 Restaurant类,声明整型变量count表示用餐人数,根据人数安排客人到4人桌、8人桌或包厢用餐,实例代码如下∶
|
||||
```java
|
||||
import java.util.Scanner; //引入Scanner类
|
||||
|
||||
public class Restaurant {
|
||||
public static void main(String args[]) {
|
||||
Scanner sc = new Scanner(System.in); // 创建扫描器,获取控制台输入的值
|
||||
System.out.println("欢迎光临,请问有多少人用餐?"); // 输出问题提示
|
||||
int count = sc.nextInt(); // 记录用户输入的用餐人数
|
||||
if (count <= 4) { // 如果人数小于4人
|
||||
System.out.println("客人请到大厅4人桌用餐"); // 请到4人桌
|
||||
} else if (count > 4 && count <= 8) { // 如果人数在4-8人之间
|
||||
System.out.println("客人请到大厅8人桌用餐"); // 请到4人桌
|
||||
} else if (count > 8 && count <= 16) { // 如果人数在8-16人之间
|
||||
System.out.println("客人请到楼上包厢用餐"); // 请到包厢
|
||||
} else { // 当以上条件都不成立时,执行的该语句块
|
||||
System.out.println("抱歉,我们店暂时没有这么大的包厢!"); // 输出信息
|
||||
}
|
||||
sc.close(); // 关闭扫描器
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 练习1:将一、二年级学生的学生成绩划分等级,等级划分标准如下∶①"优秀",大于等于 90分;②"良好",大于等于 80 分,小于 90分;③"合格",大于等于 60分,小于80分;④"不合格",小于 60 分。使用 if…else if语句实现根据控制台输入的成绩,输出与该成绩对应等级的功能。
|
||||
#### 练习2:BMI 身体质量指数的等级划分标准如下∶①"偏轻",BMI 小于18.5;②"正常",BMI大于等于 18.5,小于25;③"偏重",BMI 大于等于25,小于30;④"肥胖",BMI大于等于30。根据控制台输入的身高( 单位∶ 来)、体重(单位∶ 千克),输出 BMI指数以及与该指数对应的等级。
|
||||
|
||||
## 实例2: 用 switch 多分支语句判断成绩等级
|
||||
创建 Grade类,使用 Scanner 类在控制台输入成绩,然后用 switch 多分支语句判断输入的分数属于哪个等级。10分和9分属于优,8分属于良,7分和6分属于中,5分、4分、3分、2分、1分以及 0 分均为差,实例代码如下∶
|
||||
```java
|
||||
|
||||
import java.util.Scanner; //引入Scanner类
|
||||
|
||||
public class Grade {
|
||||
public static void main(String[] args) {
|
||||
Scanner sc = new Scanner(System.in); // 创建扫描器,接收控制台输入内容
|
||||
System.out.print("请输入成绩:"); // 输出字符串
|
||||
int grade = sc.nextInt(); // 获取控制台输入的数字
|
||||
switch (grade) { // 使用switch判断数字
|
||||
case 10: // 如果等于10,则继续执行下一行代码
|
||||
case 9: // 如果等于9
|
||||
System.out.println("成绩为优"); // 输出成绩为优
|
||||
break; // 结束判断
|
||||
case 8: // 如果等于8
|
||||
System.out.println("成绩为良"); // 输出成绩为良
|
||||
break; // 结束判断
|
||||
case 7: // 如果等于7,则继续执行下一行代码
|
||||
case 6: // 如果等于6
|
||||
System.out.println("成绩为中"); // 输出成绩为中
|
||||
break; // 结束判断
|
||||
case 5: // 如果等于5,则继续执行下一行代码
|
||||
case 4: // 如果等于4,则继续执行下一行代码
|
||||
case 3: // 如果等于3,则继续执行下一行代码
|
||||
case 2: // 如果等于5,则继续执行下一行代码
|
||||
case 1: // 如果等于1,则继续执行下一行代码
|
||||
case 0: // 如果等于0
|
||||
System.out.println("成绩为差"); // 输出成绩为差
|
||||
break; // 结束判断
|
||||
default: // 如果不符合以上任何一个结果
|
||||
System.out.println("成绩无效"); // 输出成绩无效
|
||||
}
|
||||
sc.close(); // 关闭扫描器
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
#### 练习3:使用 switch多分支语句判断控制台输入的某个月份属于哪个季节。
|
||||
#### 练习4:使用 switch多分支语句判断控制台输入的某个月份属于哪个季节。(光盘\Code\Try\O3\05)(2)某大型商超为答谢新老顾客,当累计消费金额达到一定数额时,顾客可享受不同的折扣∶①尚未超过 200 元,顾客须按照小票价格支付全款;不少于 200元但尚未超过 600元,顾客全部的消费金额可享 8.5 折优惠;③不少于 600 元但尚未超过 1000 元,顾客全部的消费金额可享 7折优惠;④不少于 1000 元,顾客全部的消费金额可享 6折优惠;
根据顾客购物小票上的消费金额,在控制台上输出该顾客将享受的折扣与打折后需支付的金额。
|
||||
|
||||
|
||||
## 实例3:使用 for 循环完成 1~ 100的相加运算
|
||||
创建 AdditiveFor类,使用for循环完成1~100的相加运算,实例代码如下∶
|
||||
```java
|
||||
public class AdditiveFor {
|
||||
public static void main(String[] args) {
|
||||
int sum = 0; // 创建用户求和的变量
|
||||
int i; // 创建用于循环判断的变量
|
||||
for (i = 1; i <= 100; i++) { // for循环语句
|
||||
sum += i; // 循环体内执行的代码
|
||||
}
|
||||
System.out.println("the result :" + sum); // 在循环外输出最后相加的结果
|
||||
}
|
||||
}
|
||||
```
|
||||
$思考:可不可以改写用while实现相加运算呢?$
|
||||
|
||||
#### 练习5:有一组数∶ 1、1、2、3、5、8、13、21、34…,请用for循环算出这组数的第n个数是多少?
|
||||
#### 练习6:一个球从80米高度自由落下,每次落地后反弹的高度为原高度的一半,第6次落地时共经过多少米?第6次反弹多高?
|
||||
|
||||
|
||||
## 实例4:使用嵌套的 for 循环输出乘法口诀表
|
||||
创建 Multiplication类,使用两层 for循环实现在控制台输出乘法口诀表,实例代码如下∶
|
||||
```java
|
||||
|
||||
public class Multiplication {
|
||||
public static void main(String[] args) {
|
||||
int i, j; // i代表行,j代表列
|
||||
for (i = 1; i < 10; i++) { // 输出9行
|
||||
for (j = 1; j < i + 1; j++) { // 输出与行数相等的列
|
||||
System.out.print(j + "*" + i + "=" + i * j + "\t"); // 打印拼接的字符串
|
||||
}
|
||||
System.out.println(); // 换行
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
#### 练习7:5文钱可以买一只公鸡,3 文钱可以买一只母鸡,1文钱可以买三只雏鸡,现在用 100文钱买 100 只鸡,那么公鸡、母鸡、雏鸡各有多少只?
|
||||
#### 练习8:根据用户控制输入 * 的行数,在控制台中输出相应行数的等腰三角形。
|
||||
|
||||
|
||||
## 实例5:找出1 ~ 19 之间所有的偶数
|
||||
使用一个for循环输出1~19之间所有的值,如果输出的值是奇数,则使用 continue 语句跳过本次循环,实例代码如下∶
|
||||
```java
|
||||
public class ContinueTest {
|
||||
public static void main(String[] args) {
|
||||
for (int i = 1; i < 20; i++) { // i的值从1循环至19
|
||||
if (i % 2 != 0) { // 如果i不是偶数
|
||||
continue; // 跳到下一循环
|
||||
}
|
||||
System.out.println(i); // 输出i的值
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 练习:找出1-1000数字种的素数和水花仙数。
|
|
@ -0,0 +1,39 @@
|
|||
## 实例1:演示隐式转换时自动提升精度的效果
|
||||
创建ImplicitConyersion类,让低精度的变量与高精度变量同时做计算,查看计算结果属于哪种精度,实例代码如下∶
|
||||
```java
|
||||
public class ImplicitConversion {
|
||||
public static void main(String[] args) {
|
||||
// 声明byte型变量mybyte,并把byte型变量允许的最大值赋给mybyte
|
||||
byte mybyte = 127;
|
||||
int myint = 150; // 声明int型变量myint,并赋值150
|
||||
float myfloat = 452.12f; // 声明float型变量myfloat,并赋值
|
||||
char mychar = 10; // 声明char型变量mychar,并赋值
|
||||
double mydouble = 45.46546; // 声明double型变量,并赋值
|
||||
/* 将运算结果输出 */
|
||||
System.out.println("byte型与float型数据进行运算结果为:" + (mybyte + myfloat));
|
||||
System.out.println("byte型与int型数据进行运算结果为:" + mybyte * myint);
|
||||
System.out.println("byte型与char型数据进行运算结果为:" + mybyte / mychar);
|
||||
System.out.println("double型与char型数据进行运算结果为:" + (mydouble + mychar));
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 实例2:利用显式转换演示精度丢失
|
||||
创建 ExplicitConversion类,使用显式转换将不同类型的变量转换成精度更低的类型,输出转换之后发生精度丢失的结果,实例代码如下∶
|
||||
```java
|
||||
|
||||
public class ExplicitConversion {
|
||||
public static void main(String[] args) {
|
||||
int a = (int) 45.23; // double类型强制转化成int类型
|
||||
long b = (long) 456.6F; // flaot类型强制转化成long类型
|
||||
char c = (char) 97.14; // double型强制转换成char型
|
||||
System.out.println("45.23强制转换成int的结果:" + a);
|
||||
System.out.println("456.6F强制转换成long的结果:" + b);
|
||||
System.out.println("97.14强制转换成char的结果" + c);
|
||||
}
|
||||
}
|
||||
```
|
||||
#### 练习1:使用 char型声明'a'~'g',然后输出它们相加后的结果。
|
||||
#### 练习2:IP地址每段数字的最大值可以由byte型的最大值与 short型128相加后得到,使用隐式转换控制台输出 IP 地址每段数字的最大值。
|
||||
#### 练习3:将 65~71显式转换为 char 型并输出。
|
||||
#### 练习4:一辆货车运输箱子,载货区宽2米,长 4米,一个箱子宽 1.5 米,长 1.5米,请问载货区一层可以放多少个箱子?
|
|
@ -0,0 +1,4 @@
|
|||
#### 练习1:遍历二维数组int a[][] = {{23.65,43,68},{45,99,86,80},{76,81,34,45},{88,64,48,25}}后,再通过循环计算该二维数组的两条对角线之和。
|
||||
#### 练习2:一个3×3的网格,将从1到9的数字放入方格,达到能够使得每行每列以及每个对角线的值相加都相同。
|
||||
#### 练习3:交换二维数组 int array[][] = {{8,75,23},{21,534},{15,23,20 }};的行、列数据。
|
||||
#### 练习4:使用二维数组实现杨辉三角算法。
|
|
@ -0,0 +1,44 @@
|
|||
扩展知识
|
||||
- 不定长参数:
|
||||
声明方法时,如果有若平个相同类型的参数,可以定义为不定长参数,该类型的参数声明如下∶
|
||||
```
|
||||
权限修饰符 返回值类型 方法名(参数类型... 参数名)
|
||||
```
|
||||
**注意∶** 参数类型和参数名之间是三个点,而不是其他数量或省略号。
|
||||
|
||||
## 实例1:使用 this 关键字实现给饼只加一个蛋
|
||||
顾客买鸡蛋灌饼要求加几个蛋,烙饼大妈就给饼加几个蛋,不要求的时候就只加一个蛋。创建鸡蛋灌饼 EggCake 类,创建有参数和无参数构造方法,无参构造方法调用有参数构造方法并实现初始化。
|
||||
```java
|
||||
public class EggCake { // 创建鸡蛋灌饼EggCake类
|
||||
int eggCount; // 鸡蛋灌饼里蛋的个数(属性)
|
||||
// 有参数构造方法,参数是给饼加蛋的个数
|
||||
public EggCake(int eggCount) { // 参数为鸡蛋灌饼里蛋的个数的构造方法
|
||||
this.eggCount = eggCount; // 将参数eggCount的值付给属性eggCount
|
||||
System.out.println("这个鸡蛋灌饼里有" + eggCount + "个蛋。");
|
||||
}
|
||||
// 无参数构造方法,默认给饼加一个蛋
|
||||
public EggCake() { // 默认构造方法
|
||||
// 调用参数为鸡蛋灌饼里蛋的个数的构造方法,并设置鸡蛋灌饼里蛋的个数为1
|
||||
this(1);
|
||||
}
|
||||
public static void main(String[] args) {
|
||||
EggCake cake1 = new EggCake(); // 创建无参的鸡蛋灌饼对象
|
||||
EggCake cake2 = new EggCake(5); // 创建鸡蛋灌饼对象,且鸡蛋灌饼里有5个蛋
|
||||
|
||||
}
|
||||
}
|
||||
```
|
||||
定义了两个构造方法,在无参构造方法中可以使用this关键字调用有参的构造方法。但是要注意,this()语句之前不可以有其他代码。
|
||||
|
||||
#### 练习1:设计加油站类和汽车类,加油站提供一个给车加油的方法,参数为剩余汽油数量。每次执行加油方法,汽车的剩余汽油数量都会加 2。
|
||||
|
||||
|
||||
#### 练习2:智能手机的默认语言为英文。,但制造手机时可以将默认语言设置为中文。编写手机类, 无,参构造方法使用默认语言设计,利用有参构造方法修改手机的默认语言。
|
||||
|
||||
#### 练习3:张三去KFC买可乐,商家默认不加冰块。但是张三可以要求加 3 个冰块。请利用有参构造方法实现上述功能。
|
||||
|
||||
#### 练习4:创建教师类,类中有姓名、性别和年龄三个属性,在构造方法中使用 this 关键字分别为这三个成员属性赋值。
|
||||
|
||||
#### 练习5:一只大熊猫,长 1.3 米,重 90千克。在自定义方法中使用this关键字调用类的成员变量并在控制台输出这只大熊猫的信息。
|
||||
|
||||
#### 练习6:创建信用卡类,有两个成员变量分别是卡号和密码,如果用户开户时没有设置初始密码,则使用"123456"作为默认密码。设计两个不同的构造方法,分别用于用户设置密码和用户未设置密码两种构造场景。
|
|
@ -0,0 +1,124 @@
|
|||
**继承**的基本思想是基于某个父类的扩展,并制定出一个新的子类,子类可以继承父类原有的属性和方法,也可以增加原来父类所不具备的属性和方法,或者直接重写父类中的某些方法。例如,平行四边形是特殊的四边形,如果说平行四边形类继承了四边形类,那么平行四边形类就在保留四边形类所有属性和方法的同时,还扩展了一些平行四边形类特有的属性和方法
|
||||
## 实例1: 使用继承表现 Pad和 Computer 的关系
|
||||
创建一个电脑类 Computer,Computer 类中有屏幕属性 screen 和开机方法 startup()。现 Computer类有一个子类 Pad(平板电脑)类,除了和 Computer类具有相同的屏幕属性和开机方法以外,Pad类还有电池属性 battery,使用继承表现 Pad 和 Computer 的关系。代码如下∶
|
||||
```java
|
||||
class Computer { // 父类:电脑
|
||||
String screen = "液晶显示屏"; // 属性:屏幕
|
||||
|
||||
void startup() { // 方法:开机
|
||||
System.out.println("电脑正在开机,请等待...");
|
||||
}
|
||||
}
|
||||
|
||||
public class Pad extends Computer { // 子类:平板电脑
|
||||
String battery = "5000毫安电池"; // 平板电脑的属性:电池
|
||||
|
||||
public static void main(String[] args) {
|
||||
Computer pc = new Computer(); // 创建电脑类对象
|
||||
System.out.println("computer的屏幕是:" + pc.screen);
|
||||
pc.startup(); // 电脑类对象调用开机方法
|
||||
Pad ipad = new Pad(); // 创建平板电脑类对象
|
||||
System.out.println("pad的屏幕是:" + ipad.screen); // 平板电脑类对象使用父类属性
|
||||
System.out.println("pad的电池是:" + ipad.battery);// 平板电脑类对象使用自己的属性
|
||||
ipad.startup(); // 平板电脑类对象使用父类方法
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 练习1:创建银行卡类,并设计银行卡的两个子类∶ 储蓄卡与信用卡。
|
||||
|
||||
|
||||
## 实例2:让平板电脑调用台式机的功能
|
||||
编写一个程序,平板电脑类是普通电脑类的子类,当使用普通电脑时,普通电脑会提示"欢迎使用的信息;当使用平板电脑时,平板电脑会提示"欢迎使用iPad"的信息。代码如下∶
|
||||
```java
|
||||
|
||||
class Computer3 { // 父类:电脑
|
||||
String sayHello() { // 方法:打招呼
|
||||
return "欢迎使用";
|
||||
}
|
||||
}
|
||||
|
||||
public class Pad3 extends Computer3 { // 子类:平板电脑
|
||||
String sayHello() { // 子类重写父类方法
|
||||
return super.sayHello() + "iPad"; // 调用父类方法并添加字符串
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
Computer3 pc = new Computer3(); // 创建电脑类对象
|
||||
System.out.println(pc.sayHello());
|
||||
Pad3 ipad = new Pad3(); // 创建平板电脑类对象
|
||||
System.out.println(ipad.sayHello());
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 练习3:
|
||||
设计火车类和高铁类,高铁类继承火车类,不管火车类的行进速度是多少,高铁的行进速度永远是火车的二倍。
|
||||
#### 练习4:
|
||||
设计人类,有二个自我介绍的方法,输出"我是 XXX";设计博士类,继承人类,博士类自我介绍时输出"我是XXX 博士"。
|
||||
|
||||
**扩展知识:**
|
||||
在开始学习使用class关键字定义类时,就应用到了继承原理,因为在Java中,所有的类都直接或间接继承了java.lang.Obiect类。Obiect类是比较特殊的类,它是所有类的父类,是Java类层中的最高层类。当创建一个类时,除非已经指定要从其他类继承,否则都是从java.lang.Object类继承而来的,所以Java中的每个类都源于java.lang.Object类,如 String、Integer等类都是继承于 Object类。除此之外,自定义的类也都继承于Object类。由于所有类都是Obiect子类,所以在定义类时,省略了extends Object语句。
|
||||
|
||||
|
||||
## 实例3: 编写 add()方法的多个重载形式
|
||||
在项目中创建 OverLoadTest类,在类中编写add()方法的多个重载形式,然后在主方法中分别输出这些方法的返回值。代码如下∶
|
||||
```java
|
||||
|
||||
public class OverLoadTest {
|
||||
// 定义一个方法
|
||||
public static int add(int a) {
|
||||
return a;
|
||||
}
|
||||
|
||||
// 定义与第一个方法参数个数不同的方法
|
||||
public static int add(int a, int b) {
|
||||
return a + b;
|
||||
}
|
||||
|
||||
// 定义与第一个方法相同名称、参数类型不同的方法
|
||||
public static double add(double a, double b) {
|
||||
return a + b;
|
||||
}
|
||||
|
||||
// 定义一个成员方法
|
||||
public static int add(int a, double b) {
|
||||
return (int) (a + b);
|
||||
}
|
||||
|
||||
// 这个方法与前一个方法参数次序不同
|
||||
public static int add(double a, int b) {
|
||||
return (int) (a + b);
|
||||
}
|
||||
|
||||
// 定义不定长参数
|
||||
public static int add(int... a) {
|
||||
int s = 0;
|
||||
// 根据参数个数循环操作
|
||||
for (int i = 0; i < a.length; i++) {
|
||||
s += a[i];// 将每个参数的值相加
|
||||
}
|
||||
return s;// 将计算结果返回
|
||||
}
|
||||
|
||||
public static void main(String args[]) {
|
||||
System.out.println("调用add(int)方法:" + add(1));
|
||||
System.out.println("调用add(int,int)方法:" + add(1, 2));
|
||||
System.out.println("调用add(double,double)方法:" + add(2.1, 3.3));
|
||||
System.out.println("调用add(int a, double b)方法:" + add(1, 3.3));
|
||||
System.out.println("调用add(double a, int b) 方法:" + add(2.1, 3));
|
||||
System.out.println("调用add(int... a)不定长参数方法:" + add(1, 2, 3, 4, 5, 6, 7, 8, 9));
|
||||
System.out.println("调用add(int... a)不定长参数方法:" + add(2, 3, 4));
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
在本实例中分别定义了6个方法,在这 6个方法中,前两个方法的参数个数不同,所以构成.了重载关系; 前两个方法与第3 个方法比较时,方法的参数类型不同,并且方法的返回值类型也不同,所以这 3 个方法也构成了重载关系;比较第 4、第5两个方法时,会发现除了参数的出现顺序不同之外,其他都相同,这样同样可以根据这个区别将两个方法构成重载关系; 而最后一个使用不定长参数的方法,实质上与参数数量不同是一个概念,也构成了重载。
|
||||
|
||||
#### 练习5:
|
||||
使用方法的重载描述所有的超市都支持现金付款,但大型商超还支持刷卡付款。
|
||||
|
||||
#### 练习6:
|
||||
使用方法的重载描述所有的汽车都至少有两块脚踏板,但手动挡汽车有三块脚踏板。
|
||||
|
||||
|
Loading…
Reference in New Issue