Java(六)--类和对象
2017-10-12 本文已影响0人
五秋木
- 文件中可以包含多个类,但是只能有一个公共类,公共类且与文件名同名。
- 类的建立与测试
形式一:将测试放在主类的main函数中,类的数据域、构造方法与其他方法放在主函数外,所有的都在同一个文件中,文件名与类名相同。例如:Circle1.java文件中
public class Circle1{
public static void main(String [] args)
{
....
Circle1 circle1 = new Circle1() //创建对象
Circle1 circle2 = new Circle1(5) //创建对象
circle2.radius = 15; //调用类中的数据域
}
double radius; //数据域
Circle1(){
radius = 1.0
}//无参数构造函数
Circle1(double newRadius){
radius = newRadius;
}//有一个参数的构造函数
double getArea(){
return radius*redius*Math.PI;
}
}
形式二:将类中数据域、构造方法与其他方法均放在一个类中。测试函数放在另外一个类,且该类为主类中。即文件中包含两个类,测试在主类中。例如:
文件TestCircle1.java
public static void main(Sting [] args)
{
...
}
class Circle1{
double radius;
Circle1()
{
radius = 1..0;
}
Circle1(double newRadius){
radius = newRaius;
}
double getArea(){
return radius*radius*Math.PI;
}
}
- 构造方法:必须和所在类相同的名字、无返回类型、在新建一个对象new时调用,构造方法是初始化对象。
- 对象的数据和方法使用圆点运算符来访问和调用。
- 区别:
Math.methodName(参数)来调用Math中的方法。
但Circlie.getArea()不能来调用getArea方法。
原因:Math中所有方法是用关键词static定义的静态方法
getArea是个实例方法。非静态。必须使用具体object.getArea()
的方式从对象调用。 - 匿名对象:创建对象后不在进行赋值给一个变量进行引用。例如
System.out.print("Area is "+new Circle(5).getArea());
- 类的属性或者数值域创建后若没有初始化,java会自动赋默认值。
例如:
int类型变量默认初始值为0
float类型变量默认初始值为0.0f
double类型变量默认初始值为0.0
boolean类型变量默认初始值为false
char类型变量默认初始值为0(ASCII码)
long类型变量默认初始值为0
引用型变量默认初始值为null。
注1:若局部变量没有初始化,会出现编译错误。
注2:NullPointerException:当调用值为null的引用变量上的方法时会发生此类异常。故在通过引用变量调用一个方法前,确保将对象引用赋值给该变量。
- 库类
- Date类--java.util.Date
Date(); //构造函数 Date(elapseTime:long) //构造1970-1-1+elapseTime的时间 toString(); //返回日期和时间的字符串表达式 getTime(); //返回从1970-1-1至今的毫秒数
- Random类
Random(); //以当前时间作为种子构造Random对象 Random(seed:long): //以特定种子构造Random对象 nextInt(); //返回一个随机整数 nextInt(n:int); //返回0到n的整数,但不包括0和n nextLong(); //随机long型 nextDouble(); //(0.0 , 1.0) nextFloat(); //(0.0F , 1.0F) nextBoolean(); //随机布尔
相同的种子产生相同的随机数列,固定的随机数列测试程序。
- GUI组件--java.swing.*
- JOptionPane(三种方法:显示、输入、确定)
showMessageDialog
showInputDialog
showConfirmDialog - JFrame、JButton、JLabel、JTextField、JCheckBox、JRadioButton、JComboBox、JPanel
- JOptionPane(三种方法:显示、输入、确定)
- 常量:被类中所有对象所共享,一定是静态的,声明:final static double PI = 3.1415926......,被引用时直接使用Math.PI即可
- 类中变量:实例变量和静态变量
static变量与instance变量,初始化的时机是不同的。instance属性在创建实例的时候初始化,static属性在类加载,也就是第一次用到这个类的时候初始化,对于后来的实例的创建,不再次进行初始化。
实例变量的引用必须在实例(对象)创建后,且方式为:对象名.变量名
静态变量的引用- 对象名.变量名,可能出现警报:如下
The static field Calendar.MONTH should be accessed in a static way
- 类名.变量名(推荐)
同理:静态方法和实例方法与此类似。
- 对象名.变量名,可能出现警报:如下
- 可见性修饰符
public:在类、方法、数据域前出现,表示可以被任何其他的类访问。
无public:只能被同一个包中任何类访问。包私有或者包内访问
private:方法和数据域只能在它自己的类中被访问。仅能修饰类的成员,不能修饰类。
如果一个对象定义在自己的类中,那么这个对象可以访问他的私有对象。 - 为了防止用户创建对象,例如Math中所有的数据域和方法都是静态的,所以没必要创建对象,所以定义Math类的构造函数:private Math{ },防止创建类的构造。
public final class Math {
/**
* Don't let anyone instantiate this class.
*/
private Math() {}
Math是final类 不是static类
这是sun公司关于java.lang.Math类的开头,由于构造函数被声明为私有的,就是说明不能被外部调用,所以不能new出来一个新的对象
Math类的作用是对数学进行一些扩充,进行一些常量定义、操作定义,只需要传入参数就可以返回你需要的结果,所以所有方法都是静态方法直接使用,不需要实体类就行
那个声明:Don't let anyone instantiate this class. 也说明了Math类就是不会初始化任何实例。Math还定义为final类,不允许被继承。所以永远不会出现Math对象 。
- 为防止用户随意篡改数据域,将之设为private类型,这叫做数据域封装,但是类外的对象不能访问这个数据域。想读取:使用get方法;想修改,使用set方法。
- 在方法中引用的对象和传递的对象是一样的,传共享。