Java对象和类
1.对象的概念
对象:对象是类的一个实例,有状态和行为。
例如,一条狗是一个对象。
它的状态有:颜色、名字、品种;(名词,是什么类型)
行为有:摇尾巴、叫、吃等。(动词,具有什么功能)
软件对象也有状态和行为。
软件对象的状态就是属性,行为通过方法体现。
在软件开发中,方法操作对象内部状态的改变,对象的相互调用也是通过方法来完成。
1.1.面向对象思想特点
-
是一种更符合我们思想习惯的思想(懒人思想)
-
可以将复杂的事情简单化
-
将我们从执行者变成了指挥者
-
角色发生了转换
1.2.面向对象开发
- 就是不断的创建对象,使用对象,指挥对象做事情。
1.3.面向对象设计
- 其实就是在管理和维护对象之间的关系。
2.类的概念
类:类是一个模板,它描述一类对象的行为和状态,可以看成是创建Java的模板。
public class Dog{ //类,定义一个狗类
String breed; //成员变量(类中的变量)
int age;
String color;
void barking(){ } //方法
void hungry(){ } //在实现方法的时候,需要变量,
void sleeping(){ } //局部变量(方法中的变量)
}
-
局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
-
成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
-
类变量:类变量也声明在类中,方法体之外,但必须声明为static类型。
一个类可以拥有多个方法,在上面的例子中:barking()、hungry()和sleeping()都是Dog类的方法。
2.1.Java中最基本的单位是类,Java中用class描述事物也是如此
-
成员变量 就是事物的属性
-
成员方法 就是事物的行为
2.2.定义类其实就是定义类的成员(成员变量和成员方法)
-
成员变量 和以前定义变量是一样的,只不过位置发生了改变。在类中,方法外。
-
成员方法 和以前定义方法是一样的,只不过把static去掉,后面在详细讲解static的作用。
2.3.类和对象的概念
-
类:是一组相关的属性和行为的集合
-
对象:是该类事物的具体体现
-
举例:
类 学生 对象 具体的某个学生就是一个对象
3.构造方法
3.1.构造方法概述和作用
- 给对象的数据(属性)进行初始化
3.2.构造方法格式特点
-
方法名与类名相同(大小也要与类名一致)
-
没有返回值类型,连void都没有
-
没有具体的返回值return;
class Demo1_Constructor{ //Constructor构造
public static void main(String[] args) {
Person p = new Person();
//在一创建对象的时候,系统就帮我调用了构造方法
//p.Person(); //构造方法不能用对象调用
p.show();
Person p2 = new Person(); //再次创建对象
p2.show();
}
}
class Person {
private String name;
private int age;
//构造方法
public Person() {
System.out.println("Hello World!");
return; //构造方法也是有return语句的,格式是return;
name = "张三";
age = 23;
}
public void show() {
System.out.println(name + "..." + age);
}
}
3.3.总结:
-
每个类都有构造方法。
-
如果没有显式地为类定义构造方法,Java编译器将会为该类提供一个默认构造方法。
-
在创建一个对象的时候,至少要调用一个构造方法。
-
构造方法的名称必须与类同名,一个类可以有多个构造方法。
构造方法注意事项:
-
如果我们没有给出构造方法,系统将自动提供一个无参构造方法。
-
如果我们给出了构造方法,系统将不再提供默认的无参构造方法。
注意:
这个时候,如果我们还想使用无参构造方法,就必须自己给出。建议永远自己给出无参构造方法
4.创建对象
对象是根据类创建的。在Java中,使用关键字new来创建一个新的对象。
创建对象需要以下三步:
-
声明:声明一个对象,包括对象名称和对象类型。
-
实例化:使用关键字new来创建一个对象。
-
初始化:使用new创建对象时,会调用构造方法初始化对象。
public class Puppy{ public Puppy(String name){ //这个构造器仅有一个参数:name
System.out.println("小狗的名字是 : " + name );
}
public static void main(String[] args){
// 下面的语句将创建一个Puppy对象
Puppy myPuppy = new Puppy( "tommy" );
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E5bOwR7r-1570343976629)(en-resource://database/723:1)]
5.访问实例变量和方法
通过已创建的对象来访问成员变量和成员方法。
/* 实例化对象 */
Object referenceVariable = new Constructor();
/* 访问类中的变量 */
referenceVariable.variableName;
/* 访问类中的方法 */
referenceVariable.methodName();
public class Puppy{
int puppyAge;
public Puppy(String name){
// 这个构造器仅有一个参数:name
System.out.println("小狗的名字是 : " + name );
}
public void setAge( int age ){
puppyAge = age;
}
public int getAge( ){
System.out.println("小狗的年龄为 : " + puppyAge ); return puppyAge;
}
public static void main(String[] args){
/* 创建对象 */
Puppy myPuppy = new Puppy( "tommy" );
/* 通过方法来设定age */
myPuppy.setAge( 2 );
/* 调用另一个方法获取age */
myPuppy.getAge( );
/*你也可以像下面这样访问成员变量 */ System.out.println("变量值 : " + myPuppy.puppyAge );
}
}
结果:
小狗的名字是 : tommy
小狗的年龄为 : 2
变量值 : 2
6.源文件声明规则
当在一个源文件中定义多个类,并且还有import语句和package语句时。
要特别注意这些规则:
-
一个源文件中只能有一个public类
-
一个源文件可以有多个非public类
-
源文件的名称应该和public类的类名保持一致。
例如:源文件中public类的类名是Employee,那么源文件应该命名为Employee.java。如果一个类定义在某个包中,那么package语句应该在源文件的首行。
-
如果源文件包含import语句,那么应该放在package语句和类定义之间。
-
如果没有package语句,那么import语句应该在源文件中最前面。
-
import语句和package语句对源文件中定义的所有类都有效。在同一源文件中,不能给不同的类不同的包声明。
7.匿名对象
7.1.什么是匿名对象
- 没有名字的对象
7.2.匿名对象应用场景
- 调用方法,仅仅只调用一次的时候。
那么,这种匿名调用有什么好处吗?
- 节省代码
注意:
调用多次的时候,不适合。
匿名对象调用完毕就是垃圾,可以被垃圾回收器回收。
匿名对象可以作为实际参数传递
7.3.演示
匿名对象应用场景
class Demo2_Car {
public static void main(String[] args) {
Car c1 = new Car(); //创建有名字的对象
c1.run();
c1.run();
new Car().run(); //匿名对象调用方法
new Car().run(); //匿名对象只适合对方法的一次调用,因为调用多次就会产生多个对象,不如用有名字的对象
//匿名对象是否可以调用属性并赋值?有什么意义?
// 匿名对象可以调用属性,但是没有意义,因为调用后就变成垃圾
//如果需要赋值还是用有名字对象
new Car().color = "red";
new Car().num = 8;
new Car().run();
}
}
class Car {
String color; //颜色
int num; //轮胎数
public void run() {
System.out.println(color + "..." + num);
}
}