面向对象
- 对象(Object):
- 面向对象编程:对象还有对象之间的关系
- Objects与Class:Object到Class是一种抽象的方式,Class到Object由抽象到具体即实例化的操作 (class是提取共同特征,通过class实例化得到Object)
- class:包括状态特征和行为特征
对象分析 ——构建类的方法
- 状态特征:里面所需要的各种数据、信息
- 行为特征:
- 构造器:构造对象名称必须与类名相同、无返回类型,使用时通过
new
构造,可以重载。 - 方法函数:需要对数据的处理,调用
Object.Method
,有返回类型
类的使用
className objectName; //对象申明
objectName = new className();//创建
className objectName = new className([type date]); //对象的实例化(创建)
objectName.method(); //调用类中的方法
构造器
className(){
}//无参构造器(如果类中没有写构造器也是可以的,调用类会默认使用无参构造器)
className([type newDate]){
oriDate = newDate;
}//有参构造器(构造器重载)
注意:如果存在有参构造器,则默认构造器不会给出
- 构造器中的this
Circle(){
this(date1,date2)
} //调用类中的有参构造器,data与参数对应
引用类型(引用变量)
- 实例化对象是对类的引用,而不是生成了一个变量的储存空间(类似Python)
- 对象成员访问:
Circle c1 = new Circle(); //先创建
c1.method; //对象成员
引用变量
- 引用变量:类是引用类型,在函数中,使用类来声明一个“对象”,如
Circle c1
还未实例化,此时c1称作应用变量,通过new实例化后,引用变量指向实例化之后的对象,而不是对象存储在变量中。 - 类成员: 有
static
修饰的属性和方法,称为类属性和类方法,可以通过类名调用(如Math库中的E,PI,pow()) - 对象成员:在类中的属性(变量)和方法前,没有用
static
修饰,就是对象成员,称为对象属性和对象方法,必须实例化之后的对象,通过实例化的对象调用
public class Circle {
static double radius = 1.0; //加了static可以使用类名调用
Circle() {
}
Circle(double newRadius){
radius = newRadius;
}
static double getArea(){
return Math.pow(radius,2) * Math.PI;
}
double getPermeter(){
return 2 * Math.PI * radius;
}
void setRadius(double newRadius){
radius = newRadius;
}
}
需要注意的是,有static
修饰的就是属于类的,没有对象也有其存在,static
的成员为静态成员,一般为常量,不变(参考Math类中的内容)(思考如Math.pow())
public class Math{
static double abs(double a){
return ···
}
}//类对象
Math.abs(m); //类对象的调用
//同名的对象方法,不能多次重复(有参一个,无参一个,一般有参的为类对象,无参的为实例对象)
double getArea(){
return Math.pow(radius,2) * Math.PI;
}
static double getArea(double radius){
return Math.pow(radius,2) * Math.PI;
}
javaAPI查看类包
- 上网查看
- 本地安装包src.zip
static members
- static 是属于类的对象,可以用来对实例对象的统计、定义类的常量
final static
,静态函数 - 静态函数中的数据只能访问当前类中的静态成员(非静态成员只在实例化后才有用,而静态成员是本生就已经存在的,如果在使用的静态成员,而还未实例化,就会有错误,无法访问,所以静态函数只能使用静态成员,而非静态函数可以使用静态成员和非静态成员)
可见性修饰符
- 包(packet)
1. public————对外开放
2. 无修饰符————默认对包内开放
3. pravite————私有,对当前类中开放
4. protected————受保护的,子类能访问
把类在函数中对象作为参数传递
public static void changeRadius(Circle c,double newRadius){
c.setRadius(newRadius);
}//Circle作为参数传递还是type name
This
- 区分方法参数和类属性参数的修饰符
public class Circle{
pravite double radius = 1.0;
public Circle(double radius){
this.radius = radius; //不加this修饰,radius被隐藏,无法区分
}
public Circle(double newRadius){
radius = newRadius; //这样能区分也可
}
}
- 通过默认构造器调用有参构造器
public class Circle{
pravite double radius = 1.0;
public Circle(){
this(5.0); //既调用有参构造器方法,参数与有参匹配,而且不能省略!!!
}
public Circle(double radius){
System.out.println("Circle(double radius) is called")
this.radius = radius;
}
}
包装类
- 将基础数据类型也变成对象
String的两个特性!!!
- 直接赋值的指向相同的空间(和python相同)
String s1 = "java";
string s2 = s1;
System.out.println("s1 == s2"); //结果是true:s1 s2 都指向java
s1 = "hello";
System.out.println("s1 == s2"); //结果是false: s1指向了hello
- 直接赋值,如果特殊空间存在值则指向该对象,不存在则创建对象指向,通过new创建则在堆空间内创建对象
String s1 = "java";
String s2 = new String("java"); //两者指向不同