包
包(package) 用于管理程序中的类,主要用于解决类的同名问题。包可以看出目录。
包的作用
[1] 防止命名冲突。
[2] 允许类组成一个单元(模块),便于管理和维护
[3] 更好的保护类、属性和方法
包命名规范
包命名原则:始终保持类的全路径唯一。
规范:
[1]包名由小写字母组成,不能以圆点开头或结尾。圆的有特殊意义——包分隔符
[2]包名之前最好加上唯一的前缀,通常使用组织倒置的网络域名。如:域名javagroup.net
package net.javagroup.xx
[3]包名后续部分依不同机构内部的规范不同而不同
package net.javagroup.project1.projectname.xx
在控台如何编译包:javac -d ./(当前文件夹) ./Tset01.java (javac -d 编译目的地 源文件)没个都有空格
编译完成后,Test01的全路径是cn.huang001.Test01
注意:编译时还没有包出来,不能用源文件的全路径形式
1.1 jvm提供的包
包名 |
描述 |
java.lang/语言包 |
系统默认导入,String类保存在这个包中,所以我们在使用String时不需要导包 |
java.util |
工具包,一些常用的类库,Scanner,Date,Arrays |
java.io |
输入输出处理,文件的读写等 |
java.net |
网络编程 |
java.math |
数学计算.Math.random |
java.awt(C) |
这个包中的类用于构建和管理应用程序的图形用户界面 |
为什么要使用继承?
为了提取两个类中公共的代码,可以使用继承抽取重复性的代码到一个公共类中,这个公共的类称为父类(super class)。继承于父类的类称为子类(sub class).
java继承的特性
[1] 单根性。在java中,一个类只能有一个直接父类。
[2] 传递性。C继承于B,B继承于A,C具有A的特性和行为。
类B继承于类A,使用关键字extends,B拥有了A中非私有的属性和方法。
变量隐藏(C)
当子类定义了一个和父类同名的属性时,在子类中优先访问子类的属性,如果要访问父类属性一定要加super。
//如果引入两个相同名字的类时,其中一个可以用import,另一个如下
//其中一个在创建对象时写全路径
//java.util.Date date1 = new java.util.Date()
//用于定义包的位置 package 包名.包名 package cn.car; //必须写到源代码的第一句 import cn.car.*; //导入cn.car下的所有类 //import 用于导包,告诉类需要的其他类在什么位置! //(在同一包不需要导入) public class Test01{ public static void main(String[] args){ Carriage ca=new Carriage("","汽车","武大郎"); ca.carriage(); Taxi caa=new Taxi("","京B123","景顺出租车公司"); caa.taxi(); } }
//java继承父类(公共类)是多个类的共有的属性和方法 //单根性。在java中,一个类只能有一个直接父类。 //传递性。C继承于B,B继承于A,C具有A的特性和行为。 //父类 package cn.car; public class Car{ private String motorcyle; private String number; public void setMotorcyle(String motorcyle){ this.motorcyle=motorcyle; } public String getMotorycle(){ return this.motorcyle; } public void setNumber(String number){ this.number=number; } public String getNumber(){ return this.number; } public Car(){ } public Car(String motorcyle,String number){ this.setMotorcyle(motorcyle); this.setNumber(number); } }
//java继承子类 //类B继承于类A,使用关键字extends,B拥有了A中非私有的属性和方法。 //导入cn.car下的Carriage类 //先导入父类在继承父类(同一包不需要导入) //子类不能继承private成员,不能继承构造方法,父类子类不在同包不能使用默认访问 //子类 package cn.car; import cn.car.Car; public class Carriage extends Car{ private String name; public void setName(String name){ this.name=name; } public String getName(){ return name; } public Carriage(){//无参构造 }//有参构造 public Carriage(String motorcyle,String number,String name){ super(motorcyle,number); this.setName(name); } public void carriage(){ System.out.println("我是"+this.name+",我的"+super.getNumber()+"我做主"); System.out.println("目的地到了,我们去玩吧"); } }
//java继承子类 //类B继承于类A,使用关键字extends,B拥有了A中非私有的属性和方法。 package cn.car; import cn.car.Car; public class Taxi extends Car{ private String company; public void setCompany(String company){ this.company=company; } public String getCompany(){ return this.company; } public Taxi(){ } public Taxi(String motorcyle,String number,String company){ //super关键字表示父类对象,只是一个关键字,里面没有引用 //super调用父类构造方法时,必须写到构造方法有效代码第一句 super(motorcyle,number); //super可以访问父类的非私有属性。私有的属性不能用super访问。 this.setCompany(company); } public void taxi(){ System.out.println("乘客您好");//// 当需要访问父类的属性时,优先使用super System.out.println("我是"+company+"的,我的车牌是"+super.getNumber()+",您要去哪里?"); System.out.println("目的地已经到了,请您付费下车,欢迎再次乘坐"); }//super.父类方法名(); 可以把父类的方法继承过来 }/*如果要访问父类属性,通过super;如果要访问子类属性,通过this. 当子类定义了一个和父类同名的属性时, 在子类中优先访问子类的属性,如果要访问父类属性一定要加super。*/
静态导入
如果一个类中定义的属性和方法都是静态时,可以考虑使用静态导入。jdk1.5+ 出现。
如果子类 父类 全是静态变量或方法 就可以静态导入,静态导入后可以直接提取类中的变量和方法
import static cn.sxt01.Calc.*;
1.1 访问修饰符
java中存在4类访问修饰符,分别是private、默认、protected、public。
修饰符 |
本类✘ |
同包子类 |
同包其他类 |
不同包子类 |
不同包其他类 |
private |
✔ |
✘ |
✘ |
✘ |
✘ |
默认 |
✔ |
✔ |
✔ |
✘ |
✘ |
protected |
✔ |
✔ |
✔ |
✔ |
✘ |
public |
✔ |
✔ |
✔ |
✔ |
✔ |
private:私有的,只能在本类可以访问。
friendly:默认的,同包可访问,也称包访问权限。
protected:受保护的, ①子类可访问 ②同包可访问
public:公共的,都可以访问
继承关系的初始化顺序
继承关系内存图