继承
继承就是子类继承父类的特性和行为,使得子类对象(实例)具有父亲的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性的继承父类。
继承是is-a的相互关系
继承的优点
- 将所有子类的共同属性放入父类,实现代码共享,避免重复,提高开发效率
- 可以使得修改扩展继承而来的实现比较简单
继承的缺陷
- 父类变,子类就必须变
- 继承破坏了封装,对于父类而言,他的实现细节对于子类来说都是透明的
- 继承是一种强耦合性关系
特殊关键字
包package
包是类或接口的容器,是一个用于避免命名冲突的名空间,是一个逻辑命名的概念,与具体的物理位置无关在具体的实现中,包名称经常和目录名称对应
什么是包
- 包是类的组织方式,提供名空间和访问控制
- 类似于文件系统的组织
声明包中的类package
语法:package包名称
-
声明包要求是源代码文件的第一个语句,包定义之前可以添加注释信息
-
程序中最多只能有一条package语句,没有包定义的源代码文件成为默认包中的一部分
-
包的命名规则:
- 全小写
- 使用域名反转的方式定义
包的作用
- 包能将相关的源代码文件组织在一起
- com.yanan.bao其中存放操作数据相关的类文件
- com.yanan.biz存放相关的业务类文件
- 包减少了名称冲突带来的问题
- 可以使用package指明源文件中的类属于哪个具体的包
包的使用
- 如果其他人想使用包中类,则需要使用全名
import java.util.Date;
public class A{
public static void main(String[] args){
Date now=new Date(); //使用类的简称Date,而不是全名称java.util.Date
}
}
//用法2:全称
java.util.Date now=new java.util.Date(); //不需要import
- 为了简化书写,Java提供了import语句:
import package_name.*;
import java.util.*;
//使用java.util包中的所有类都不需要再使用import java.util.类名
- 引入包中的某一个类:
import java.util.ArrayList;
引入包import
- Java缺省引入的包为java.lang
System.out.println("显示输出");//不需要import java.lang.System
//同包中的其它类不需要导入
package com.yan;
public class A{}
package com.yan;
public class B{
public void pp(){
A a=new A1(); //不需要import com.yan.A
}
}
- 引入包中的类: import 包名称.类名称;例如import java.util.Date;
- 引入整个包;
import 包名称.* ;
例如import java.util.* ;
- 不引入包而是用类,则需要是用类的全名: 包名.类名,例如
java.util.Date dd=new java.util.Date();
包说明
package-info.java可以描述一个包的作用
//这是一个测试包
package com.yan.test;
package-info中不能定义public和private的类,但是可以定义friendly的类及包常量,提供给统一包下面 的类进行共享
package com.yan.a;
import lombok.Data;
class Constants{
public static final String NAME="Yanjun";
}
@Data
class Teacher{ //包中的类可以直接使用
private String className;
}
练习
1、猜数字游戏
- 需要记录猜数的整个过程
- 根据猜测的次数进行评价
import java.util.Scanner;
public class test {
private int tmp = 0;
private boolean flag = false;
private int[] arr = new int[15];
public void Game(int num) {
Scanner sc = new Scanner(System.in);
while (tmp < 15) {
System.out.println("第" + (tmp + 1) + "次猜数--输入-1退出");
int guessNum = sc.nextInt();
if (guessNum == -1) {
System.out.println("退出成功");
return;
}
if (guessNum > num) {
System.out.println("猜大了");
arr[tmp] = guessNum;
tmp++;
} else if (guessNum < num) {
System.out.println("猜小了");
arr[tmp] = guessNum;
tmp++;
} else {
tmp++;
flag = true;
System.out.println("你猜对了,用了" + tmp + "次");
break;
}
}
PinJia();
his();
sc.close();
}
public void PinJia() {
if (tmp < 5) {
System.out.println("你真棒");
} else if (tmp < 10) {
System.out.println("继续努力");
} else if (tmp < 15) {
System.out.println("你和猪差不多");
} else {
System.out.println("你真是个猪");
}
}
public void his() {
System.out.println("------------------------------");
if (flag) {
System.out.println("恭喜你猜对了");
}
for (int i = 0; i < tmp; i++) {
System.out.println("第" + (i + 1) + "次猜的值为" + arr[i]);
}
}
}
public static void main(String[] args) {
test gu = new test();
gu.Game(123);
}
2、计算圆的面积和周长,输入半径值
private int r;
private final double PI = 3.1415;
public double getMianJi(int r) {
return r * r * PI;
}
public String show() {
return "周长为" + getZhouChang(r) + ",面积为" + getMianJi(r);
}
public void setR(int r) {
this.r = r;
}
// ------------------------------
public double getZhouChang(int r) {
return 2 * r * PI;
}
public static void main(String[] args) {
cirle c = new cirle();
c.setR(5);
System.out.println(c.show());
}
3、请定义一个交通工具Vehicle的类,其中有:
- 属性:速度(speed),车的类型(type);方法:移动(move()),设置速度(setSpeed(doubles)),加速speedUp(double s),减速speedDown(double s)。
- 最后在测试类Vehicle中的main()中实例化一个交通工具对象,并通过构造方法给它初始化speed,type的值,并且打印出来。另外,调用加速,减速的方法对速度进行改变。
private double speed;
private String type;
String speedUp(double s) {
return "对车进行加速" + s + ",现在的车速是" + (speed + s) + "km/h";
}
String speedDown(double s) {
return "对车进行加速" + s + ",现在的车速是" + (speed - s) + "km/h";
}
String move() {
return "车的牌子是" + type + ",现在的速度是" + speed + "km/h";
}
// ----------------------------
public void setSpeed(double speed) {
this.speed = speed;
}
public void setType(String type) {
this.type = type;
}
public static void main(String[] args) {
Vehicle v1 = new Vehicle();
v1.setSpeed(60);
v1.setType("路虎");
System.out.println(v1.move());
System.out.println(v1.speedUp(20));
Vehicle v2 = new Vehicle();
v2.setSpeed(80);
v2.setType("奔驰");
System.out.println(v2.move());
System.out.println(v2.speedDown(20));
}