为便于管理大型软件系统中数目众多的类,解决类的命名冲突问题。
package
语句作为java源文件的第一条语句,指明该文件中定义的类所在的包。若缺省package语句,则指定为无名包。
package p1;
生成class文件要加入`'-d'`参数值,若不适用`'-d'`参数,class文件不会按java文件的包路径生成对应文件夹。
javac -d destpth Test.java
使用定义在不同包中的java类
import p1.Test; //或 import p1.*;
Question:
import p1.*;
会否有性能影响?
Answer:
不会,效果与import p1.Test;
一样
注意: 一个类如果未声明为public的,则只能在其所在包中被引用,其他包中的类无法用import语句引入它。
包名 | 功能说明 | 包名含义 |
---|---|---|
java.lang | 包含了java语言程序设计的基础类 | lang是language的简写 |
java.awt | 包含了用于创建图形用户界面和绘制图形图像的相关类 | awt是抽象窗口工具类(abstract window toolkit)的简写 |
java.util | 包含集合、日期、国际化和各种实用工具类 | util是utility的简写 |
java.io | 包含可提供数据输入/输出相关功能的类 | io是input/output的简写 |
java.net | 提供用于实现java网络编程的相关功能类 | net意为网络 |
java.sql | 提供数据库操作相关功能类 | sql是数据化查询语言(structed query language)的简写 |
Java只支持单继承,不允许多重继承。
public的类可在任意场合被引用和使用,而非public的类只能在其所在包中被使用。
类中成员的访问控制:
修饰符 | 同一个类中 | 同一个包中 | 子类中 | 任意范围 |
---|---|---|---|---|
private | Yes | |||
缺省 | Yes | Yes | ||
protected | Yes | Yes | Yes | |
public | Yes | Yes | Yes | Yes |
在存在命名冲突(子类中存在方法重写或添加同名属性)的情况下,子类中的代码将自动使用子类中的同名属性或重写后的方法。也可以在子类中使用关键字super
引用父类中的成分。
super.<属性名>
super.<方法名>(实参列表)
说明:
super
的追溯不仅限于直接父类
// 正常方法调用
Person e = new Person();
e.getInfo(); //调用Person的方法
Student e = new Student();
e.getInfo(); //调用Student的方法
//虚方法调用
Person e = new Student();
e.getInfo(); //运行时,调用的是子对象的方法
引用类型数据值之间的强制类型转换称为造型
。
从子类到父类的类型转换可以自动进行:
Person p = new Student();
在多态的情况下,从父类到子类的类型转换必须通过造型(强制类型转换)实现:
Person p1 = new Student();
Student s1 = (Student)p1;//合法
Person p2 = new Person();
Student s2 = (Student)p2; //非法
无继承关系的引用类型间的转换是非法的:
String s = "Hello, World!";
Person p = (Person)s; //非法
用于检测一个对象的真正类型。注意:先判断子类,再判断父类。
class Person {
//---
}
class Student extends Person {
//---
}
class Graduate extends Student {
//---
}
public class TestInstanceof {
public void distribute(Person p) {
if(p instanceof Graduate) {
// 处理子类Graduate
} else if (p instanceof Student) {
// 处理子类Student
} else {
// 处理父类Person
}
}
}
协变返回类型:重写方法时,修改其返回值的类型;但必须是重写前方法返回值类型的子类或实现类类型。
class Person{
// --
}
class Student extends Person{
// --
}
class Parent {
public Person getAssistor(){
Person p = new Person();
//--
return p;
}
}
public class CovarianReturn extends Parent {
public Student getAssistor(){
Student s = new Student();
//--
return s;
}
}
一个类中存在多个同名方法,重载参数列表必须不同。
可以在构造方法的第一行使用关键字this
调用本类其他重载的构造方法(注意:若this
不在第一行,将会编译报错,同样super
也是第一行的,所以二者只能用其一):
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person(String name) {
this(name,18); //调用其他构造方法
}
public Person(int age) {
this("Anonymous",age); //调用其他构造方法
}
}
static初始化块
static块仅在其所属的类被载入时执行一次,通常用于初始化static(类)属性。
public class TestStatic {
public static void main(String[] args) {
System.out.println("Hello World!");
System.out.println("total="+Person.total); //Person类被载入时,调用static初始化块
}
}
class Person {
public static int total;
static {
total = 100;
System.out.println("in static block!");
}
}
output:
D:\xiaocancan\code\helloworld\2_TestStatic>java TestStatic
Hello World!
in static block!
total=100
public class TestStatic {
public static void main(String[] args) {
new A(); //调用非static初始化块
new A(3); //再次调用非static初始化块
}
}
class A {
{
System.out.println("in none static block!");
}
private int i=5;
public A() {}
public A(int a) {
System.out.println("begin");
i = a;
System.out.println("end");
}
}
output:
D:\xiaocancan\code\helloworld\2_TestStatic>java
in none static block!
in none static block!
begin
end
静态导入用于在一个类中导入其他类或者接口中的static成员。
import static java.lang.Math.*;
public class TestStatic {
public static void main(String[] args) {
double d = sin(PI*0.45); //double d= Math.sin(Math.PI*0.45);
System.out.println(d);
}
}
单例模式:只有一个对象实例,如打印机类对象
public class Single{
private Single(){}
private static Single onlyone = new Single();
public static Single getSingle(){
return onlyone;
}
}