包_继承
1.包
包(package) 用于管理程序中的类,主要用于解决类的同名问题。包可以看成目录。
包的作用:
【1】防止命名冲突
【2】允许类组成一个单元模块,便于管理
【3】更好的保护类、属性和方法
1.1定义包
package用于定义包,形如:package 路径(包名)
必须写到源文件的有效代码的第一句。
1 package cm.wuhao; //定义包 2 3 public class Test01{ 4 public static void main(String[] args){ 5 System.out.println("test package"); 6 } 7 }
编译带包的源文件
javac -d 目的地 源文件
编译完成后生成的字节码的全路径
运行编译好的字节码文件
java 包路径+类名
例如:
1.2包的命名规范
原则:始终保持类的全路径是唯一
规范:
[1]包名由小写字母组成,不能以圆点开头或结尾。圆点有特殊意义——包分隔符
[2]包名之前最好加上唯一的前缀,通常使用组织倒置的网络域名。如javagroup.com.xx avagroup.net.xx
[3]包名后续部分依不同机构内部的规范不同而不同
1.3导包
import 用于导包,告诉类需要的其他类在什么位置(路径)。
形如:
1 import com.wuhao.Student; // 导入com.wuhao下的Student类。
2 import com.wuhao.*; // 导入com.wuhao下的所有类。
编译时要先编译导入的包,其他类生成该类的全路径方能编译本类成功。
1.4不同包中的同名
如果一个类中用到了两个不同包但同名的类时,如何处理?
1 import java.util.Date; //两个包中都有date类 2 import java.sql.Date; 3 4 public class Test05{ 5 public static void main(String[] args) { 6 Date date = new Date(0); 7 } 8 9 }
这时候系统报错,并没有通过编译
我们可以这样处理:
创建对象时写其中一个对象的全路径
1 import java.sql.Date;//sql中的Date类 2 3 public class Test05{ 4 public static void main(String[] args) { 5 java.util.Date date1 = new java.util.Date();//写全路径 6 System.out.println("date1的地址"+date1); 7 Date date2 = new Date(0); //调用sql中的Date类 8 System.out.println("date2的地址"+date2); 9 } 10 11 }
2.jvm中提供的包
包名 |
描述 |
java.lang/语言包 |
系统默认导入,String类保存在这个包中,所以我们在使用String时不需要导包 |
java.util |
工具包,一些常用的类库,Scanner,Date,Arrays |
java.io |
输入输出处理,文件的读写等 |
java.net |
网络编程 |
java.math |
数学计算.Math.random |
java.awt(C) |
这个包中的类用于构建和管理应用程序的图形用户界面 |
3.静态导入
如果一个类中定义的属性和方法都是静态时,可以考虑使用静态导入。jdk1.5+ 出现。
1 package cn.sxt01; 2 public class Calc{ 3 public static float PI = 3.14f; //静态属性 4 5 public static int add(int a,int b){ 6 return a+b; 7 } 8 }
1 package cn.sxt02; 2 // 静态导入 3 import static cn.sxt01.Calc.*; 4 public class Test01{ 5 public static void main(String[] args){ 6 System.out.println(PI); 7 System.out.println(add(1,2)); 8 } 9 }
思考:如果一个类中还有实例成员,能不能用静态导入?
4.继承
4.1为什么要继承?
为了提取较少代码的重复性,把抽取重复性的代码到一个公共类中,这个公共的类称为父类(super class)。继承于父类的类称为子类(sub class).
java 的继承特性:
【1】单根性:只能有一个父类(只有一个爸爸)
【2】传递性:可以是爸爸从爷爷那继承过来的非私有的属性和方法,儿子在从爸爸那里继承下来(类似中国的香火延续)
类B继承于类A,使用关键字extends,则B拥有了A中非私有的属性和方法。
1 class Car { //父类 2 private int site; //座位数 3 public void setSite(int site){ 4 this.site = site; 5 } 6 void print(){ 7 System.out.print("载客量是"+site+"人"); 8 } 9 }
1 class Bus extends Car { //子类 2 Bus(int site){ 3 setSite(site); 4 } 5 }
1 public class Test04{ 2 public static void main(String[] args) { 3 Bus bus = new Bus(20); 4 bus.print(); 5 } 6 7 }
如果Person中定义了private 属性count
5.super关键字
super只是一个关键字,区别于this关键字,super并没有引用有地址。
super的作用:
【1】访问父类的构造方法
1 public Dog(String name,int health,int love,String strain){ 2 /* 3 this.setName(name); 4 this.setHealth(health); 5 this.setLove(love); 6 */ 7 super(name,health,love); 8 this.setStrain(strain); 9 10 }
super调用父类构造方法时,必须写到构造方法有效代码第一句
【2】super调用父类的非私有属性
super可以访问父类的非私有属性。私有的属性不能用super访问。
变量隐藏(C)
当子类定义了一个和父类同名的属性时,在子类中优先访问子类的属性,如果要访问父类属性一定要加super。
一句话:如果要访问父类属性,通过super;如果要访问子类属性,通过this.
[3] super访问非私有父类方法
1 public void print(){ 2 System.out.print("我的姓名"+super.getName()); 3 System.out.print(",健康值"+super.getHealth()); 4 System.out.print(",亲密度"+super.getLove()); 5 super.showInfo(); 6 System.out.println(",我是一只"+this.getStrain()); 7 } 8
6.子类不能继承父类的资源
7.访问修饰符
java中存在4类访问修饰符,分别是private、默认、protected、public。
修饰符 |
本类✘ |
同包子类 |
同包其他类 |
不同包子类 |
不同包其他类 |
private |
✔ |
✘ |
✘ |
✘ |
✘ |
默认 |
✔ |
✔ |
✔ |
✘ |
✘ |
protected |
✔ |
✔ |
✔ |
✔ |
✘ |
public |
✔ |
✔ |
✔ |
✔ |
✔ |
private :只能访问本类成员
friendly:默认的,同包可以访问,包访问符
protected:除了不同包的其它类不能访问,其它都可以访问
public:全都可以访问
8.继承的循序
继承关系内存图
9.方法的重写
当子类从父类继承过来的方法不能满足自身需要时,子类可以根据自身情况进行方法重写(overwrite/override)
方法重写建立在继承的基础上,没有继承,就没有重写!
子类根据自身情况,可以选择部分重写和完全重写。
部分重写
1 public void showInfo(){ 2 super.showInfo(); 3 System.out.println("我是一只"+this.getStrain()); 4 }
完全重写
1 public void showInfo(){ 2 System.out.println("--"+super.getName()+"--"); 3 System.out.println("健康值:"+super.getHealth()); 4 System.out.println("亲密度:"+super.getLove()); 5 System.out.println("品种:"+this.getStrain()); 6 }
重写的规则
[1]方法名称相同
[2]参数列表相同
[3]子类的访问权限一定 >= 父类访问权限 private 特殊除外
[4]返回值和父类相同或者是其子类
1 public Pet create(){ 2 Pet pet = new Pet(); 3 return pet; 4 }
1 public Dog create(){ 2 Dog dog = new Dog(); 3 return dog; 4 }