文章目录
Java----对象、类、实例、方法
面向对象:思考问题的方式,相当于把面向过程的动作封装起来
让复杂问题简单,执行者变成指挥者要结果
1.1 对象
-
对象是类的一个实例,有状态和行为。
-
软件对象也有状态和行为。
-
软件对象的状态就是属性,行为通过方法体现。
-
在软件开发中,方法操作对象内部状态的改变,对象的相互调用也是通过方法来完成。
1.1.1 匿名对象
Car c = new Car();
c.num= 5;
可以写成:
new Car().num = 5;
这就是匿名对象
new Car().color = "red";
new Car().run();
但是这3句会出现一个问题:创建3个,同时只剩最后一个。
1、匿名对象调用属性没有意义,调用方法才有意义。
2、当对对象的方法只调用一次时,可以用匿名对象,比较简化
3、如果对一个对象进行多个成员调用,必须给这个对象起个名字
4、可以将匿名对象作为实际参数进行传递。
Car c = new Car();
show(c);
……
public static void show(Car c)//这不是同一个c
{//c是局部变量
c.num = 3;
c.color = "black";
c.run();
}
主程序结束才没掉,或者直接q=null;就释放了
show(new Car());
……
public static void show(Car c)//这不是同一个c
{
c.num = 3;
c.color = "black";
c.run();
}
//已经有名字了
show执行完就没了
1.2 类
- 类是一个模板,它描述一类对象的行为和状态。
- 类可以看成是创建Java对象的模板。
[修饰符] class 类名
{
//零到多个构造器...
//零到多个成员变量...
//零到多个方法...
//零到多个初始化块...
}
//修饰符 可以为 public、 final 、abstract 或者不写
一个类可以包含以下类型变量:
局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。,访问修饰不能用于局部变量,没有默认值,在栈上分配。
成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。(实例域)
类变量:类变量也声明在类中,方法体之外,但必须声明为static类型。(成员变量中的一种),
- 静态变量除了被声明为常量外很少使用。常量是指声明为public/private,final和static类型的变量。常量初始化后不可改变。
- 静态变量储存在静态存储区。经常被声明为常量,很少单独使用static声明变量
- 与实例变量具有相似的可见性。但为了对类的使用者可见,大多数静态变量声明为public类型
- 类变量被声明为public static final类型时,类变量名称一般建议使用大写字母。如果静态变量不是public和final类型,其命名方式与实例变量以及局部变量的命名方式一致。
其实:成员变量就是类里面的变量,不区分static,没有static的成员变量叫实例变量 加了static就叫类变量
一个类可以拥有多个方法。
1.2.1 成员变量
[修饰符] type 成员变量名称 [= 默认值];
//修饰符 (public protected private)三选一、 static、final
1.2.1.1 实例变量
- 访问修饰符可以修饰实例变量;
- 实例变量对于类中的方法、构造方法或者语句块是可见的。一般情况下应该把实例变量设为私有。通过使用访问修饰符可以使实例变量对子类可见;
1.2.1 总结
作用范围:
成员:整个类
局部:函数或者语句中
在内存中的位置:
-
成员:在堆内存,因对象的存在而存在
-
局部:在栈内存
1.4 方法
1.4.1 构造方法
构造器没有返回值
每个类都有构造方法。如果没有显式地为类定义构造方法,Java编译器将会为该类提供一个默认构造方法。
在创建一个对象的时候,至少要调用一个构造方法。构造方法的名称必须与类同名,一个类可以有多个构造方法。
public class Puppy{
public Puppy(){
}
public Puppy(String name){
// 这个构造器仅有一个参数:name
}
}
1.4.2 方法
[修饰符] 方法的返回值类型 方法名称 (形参列表)
{
//方法体代码
[return 返回值;]
}
//修饰符 (public protected private)三选一、 static、final、synchronize、native
1.5 创建对象
- 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。
- 堆内存用来存放由new创建的对象和数组
1.5.1声明与创建对象的区别
Node newNode=null;
与Node newNode = new Node();
前者,是声明了一个对象(的引用),jvm并没有开辟内存放入一个对象;
而后者,在声明了一个对象的引用后,又把新开辟的没有存储任何有效值的对象的地址赋给了他。
Node newNode = new Node();
Node newNode:声明一个引用变量,在栈内化分一个空间给引用变量
new Node():在堆内存开辟一个内存用来存放由new创建的对象和数组:属于实例化,new操作符的返回值也是一个引用
Node():初始化,使用new创建对象时,会调用构造方法初始化对象。
//例如定义一个类:
class Text
{public static int number;
public int temp;}
如果你想访问temp属性,你就必须先创建一个Text的对象,才能访问:Text b = new Text();
b.temp;这就是实例成员变量。
而你想 访问number的话,不用创建Text的实例就可以访问,就像这样:Text.number.这就是类成员变量。
++主要区别就是访问是需不需要创建对象,而对于类成员变量,所有对象是共享一个变量的++。
Java方法区和堆一样,方法区是一块所有线程共享的内存区域,他保存系统的类信息。
堆里都有默认初始化值,有的有显示初始化值
1.5.2 引用
HelloWorld t;
System.out.println("t1.a:"+t.a);//出错,未初始化变量
//因为他现在不是对象,也没有引用对象
//必须先构造对象
Object obj = new Object();
//Object: 类
//obj:对象的引用,并没有实际包含一个对象,仅仅是引用一个对象
//new Object():构造了一个对象,并且他的值是对新创建的对象的引用,这个引用存储在变量obj
HelloWorld t;
t = new HelloWorld();
t= new String();
//出错,是因为类型不兼容,若全改成String就可以,但是t的值已经是另一个地址了。
public class HelloWorld /*类别*/ {/*类体*/
HelloWorld(){
System.out.println("gyyyy");
}
……
HelloWorld t;
t= new HelloWorld();
System.out.println("t1:"+t);
t= new HelloWorld();
System.out.println("t2:"+t);
结果:
gyyyy
t1:HelloWorld@6d06d69c
gyyyy
t2:HelloWorld@7852e922
HelloWorld t=null;
System.out.println("t1.a:"+t.String);
//出错,不能将方法用在值为null的对象上
1.5.3 总结
-
封装的关键是绝对不能让类中的方法直接访问其他类的数据域
-
操作对象:对象.对象成员。成员包括成员方法、成员变量
-
还有一种引用类型:
类类型变量:是引用类型,指向对象
1.6 源文件声明规则
当在一个源文件中定义多个类,并且还有import语句和package语句时,要特别注意这些规则。
- 一个源文件中只能有一个public类
- 一个源文件可以有多个非public类
- 源文件的名称应该和public类的类名保持一致。
- 如果一个类定义在某个包中,那么package语句应该在源文件的首行。
- 如果源文件包含import语句,那么应该放在package语句和类定义之间。如果没有package语句,那么import语句应该在源文件中最前面。
- import语句和package语句对源文件中定义的所有类都有效。在同一源文件中,不能给不同的类不同的包声明。
类有若干种访问级别,并且类也分不同的类型:抽象类和final类等。这些将在访问控制章节介绍。
除了上面提到的几种类型,Java还有一些特殊的类,如:内部类、匿名类。
参考链接:https://www.runoob.com/java/java-object-classes.html