Java面向对象

自定义类

一个java中最简单的标准的类定义形式如下:

class ClassName
{	
	field1;
	field2;
	...
	constructor1;
	constructor2;
	...
	method1;
	method2;
	...

一般情况下:
1.我们希望实例域部分全部声明为private,防止外部轻易得到该程序的数据
2.构造器和类名需保持一致,构造器可以有不同的参数列表,可以有多个
3.方法一般为public但是有时候也可以是其他类型,按照需要

构造器

1.构造器与类同名
2.根据参数表不同可以有多个构造器
3.一般都携程public
4.用类创建一个对象时,总是用new操作符,用new创建新的对象的时候,时通过构造器来创建的
5.构造器没有返回值
不同于c++,c++中创建一个新的对象可以不用new操作符

更改器方法和访问器方法

1.更改器方法:调用此方法后,对象的状态会改变,如setName
2.访问器方法:只访问对象而不修改对象的方法
c++中带有const后缀的时访问器方法,其他默认为更改器方法,而java中就不存在这种区别

隐式参数和显式参数

1.隐式参数:出现在方法名前的对象
2.显式参数:位于方法名后面括号中的数值
如:

	Empolyee num1 = new Employee();
	num1.raiseSalary(5);

num1:隐式参数
5:显式参数

静态(static)

静态域

如果定义了一个整型的id实例域,和一个静态整型的nextId实例域:

则每一个雇员对象都有一个自己的id域,但这个类的所有实例将共享一个nextId域
如果有1000个Employee类的对象,则有1000个实例域的id,但是他们只共享一个静态域nextId
在绝大多数面向对象的语言当中,静态域被称为类域

静态常量

静态常量不需要通过类的对象来访问,如math函数当中的PI,

public class Math
{
	...
	public static final double PI = 3.1415926...;
	...
}

可以采用Math.PI的方式的获得这个常量

虽然实例域一般都是private,但是final域可以声明为public,因为常量不可修改

常用的静态常量有PISystem.out

静态方法

静态方法时一种不能向对象实施操作的方法,在调用方法时,没有隐式参数,如Math.pow(x,a)
可以认为**静态方法时没有this参数的方法(在一个非静态的方法中,this参数表示这个方法的隐式参数)
虽然静态方法不能访问该类当中的普通实例域,但是可以访问自身类中的静态域
不需要使用对象就可以调用静态方法

使用静态方法的两种情况:

  • 一个方法不需要访问对象状态,其所需参数都是通过显式参数提供(如:Math.pow)
  • 一个方法只需要访问类的静态域

工厂方法

构造对象有如下2种方法:
1.用new操作符构造,如LocalDate today = LocalDate.now();
2.不用new操作符构造(静态工厂方法),如Employee num1 = new Employee;

使用静态工厂的原因:

  • 无法命名构造器。构造器的名字必须与类名相同。但是NumberFormat希望得到的货币实例和百分比实例采用不同的名字。
  • 当使用构造器时,无法改变所构造的对象类型。而工厂方法将返回一个DecimalFormat类对象,这是NumberFormat的子类。

更多内容参看这里:静态工厂方法

方法参数

1.方法参数有2种类型:

  • 基本数据类型
  • 对象引用
    2.java中方法参数的使用情况:
  • 一个方法不能修改一个基本数据类型的参数
  • 一个方法可以改变一个对象参数的状态
  • 一个方法不能让对象参数引用一个新的对象

对象构造

java提供的多种编写构造器的机制

重载

重载即:方法名相同,参数表不同

方法签名:方法名以及参数类型

默认域初始化

虽然,在构造器中没有显式的给域赋予初值,那么就会被自动地赋为默认值:数值为0,布尔值为false,对象引用为null。
但是,这不是优良代码的体现,会严重影响可读性

方法中的局部变量必须要初始化,类中的域不初始化会得到默认值,但极度不推荐使用

无参数的构造器

可以构造一个没有任何参数表的构造器
但是,如果在编写一个类的时候没有编写构造器,那么系统就会提供一个无参数构造器,并把所有实例域都设置为默认值放在里面

显式域初始化

  • 可以在类定义中,直接将一个值赋给任何域
  • 赋的值不一定时常量值,可以时该类中的方法

参数名

1.在编写很小的构造器时,通常参数用单个字符命名,如:

public Employee(String n , double s )
{	
	name = n;
	salary = s;
}

2.或者使用每个参数前加一个前缀a,如

public Employee(String aName , double aSalary)
{
	name = aName;
	salary = aSalary;
}	

3.或者使用隐式参数,这里this调用的name和salary时实例域当中的变量

public Employee(String name , double salary)
{
	this.name = name;
	this.salary = salary
}	

调用另外一个构造器

关键字this引用的方法时隐式参数,但还有另外一个含义
如果构造器的第一个语句形如this(。。。),这个构造器将调用同一个类中的另一个构造器。如:

public Employee(double s)
{
	this("Employee1",s)
}	

这样对公共的构造器代码只编写一部分就行

初始化块

前面已经讲过初始化数据域的方法:

  • 在构造器中设置值
  • 在声明中赋值

实际上还有第三种机制,称为初始化块,如:

class Employee
{
	private static int nexId;	

	private int id;
	private String name;
	private double salary;

	//初始化块
	{
		id = nextId;
		nextId ++;
	}
		
	public Employee(String n ,double s)
	{
		name = n;
		salary = s;
	}
	...	

在这个示例中,id域在对象初始化块中被初始化。
首先运行初始化块,然后才运行构造器的主体部分
初始化块不常用,建议将初始化块放在域后面

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值