JAVA学习-面向对象
Posted burning-yu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA学习-面向对象相关的知识,希望对你有一定的参考价值。
JAVA学习-面向对象(一)
这个篇目主要针对类和对象的赋值使用、内存中的样子、值传递等进行总结。关注面向对象的封装性
一.类和对象
类:类是一种模板,抽象层面的东西,描述一类事物的状态和行为,JAVA实现类时,其中包含了属性(字段)和方法
对象:是一个具有自己特点的实例,具体层面的东西,描述了该对象的状态和行为
JAVA中的成员方法、属性要严格按照类、属性为前缀去调用!!!,更好理解面向对象
二.实例化
new
关键字从类模板实例化一个对象,建立了类和对象之间的联系其做了几件事:
- 为对象分配了空间,返回一个该对象的引用
- 属性初始化:成员变量转化为对象变量后,救获得了初值
- 构造:调用此类的构造方法
- 引用赋值和new实例化的关系,类似C中的指针,具体的可参照下图
对象赋值其实是两个引用指向了同一个对象,通过其中一个操作对象,另一个去访问时也会发生变化!
当堆中对象无引用时(相当于不能访问到了),JAVA就会自动回收这片内存,类似C的释放空间
- 引用本身存储在栈中,其内存大小为8字节(64位机),而对象大小由其所含属性等决定
引用 = null
可以帮助释放内存
三.构造器
-
写法
public class Student{ String name; int age //构造函数,无返回值,用类名作为函数名字 Student(){ } //有参构造,重载 Student(String name){ this.name = name; } //this()调用其他构造函数,但必须有出口! Student(String name, int age){ this(name); this.age = age } }
-
当没显示提供构造函数时,编译器默认提供一个隐式无参的构造函数,空的,什么都不干,只是为了能调用
-
一旦自己写了构造函数,默认提供的隐式无参构造函数就无了,一个好的习惯是,无论何时自己写一个无参的构造方法,保留这个无参构造器
-
构造器可以重载
-
用
this()
来调用其他构造函数,但必须写在构造器的第一行
四.this关键字
this在语义上可看成"本对象的xxx",是对象层面的东西,this关键字指向的是当前对象的引用,只有实例化后才会真正存在!
当用到this时,可假想一下该类被实例化成对象时调用自己的一些东西,这个this就是此时实例化的对象
- 调用类中的属性:this.属性名称,指的是访问类中的成员变量,用来区分成员变量和局部变量(重名问题)
- 调用类中的方法:this.方法名称,用来访问本类的成员方法
- 调用类构造方法:this();访问本类的构造方法,()中可以有参数的 如果有参数 就是调用指定的有参构造
- this()只能用在构造方法中,且必须是构造器的第一条语句!
五.static关键字
static是静态修饰符,把变量、属性变为类这一层次的东西!内存和值跟随类创建销毁,可以直接用类名调用
public class Main{
public static void main(){
//在该类中想调用该类资源,只能调用static的属性和方法
Main.test();
Main.name = "change";
//绝不运行用this!!!
}
public static int name = "这是一个静态方法"
public static void test(){
System.out.println("这是一个静态方法");
}
}
-
使用static关键字修饰一个属性:声明为static的变量实质上就是全局变量,其内存是随类产生销毁的,高于对象层次
-
使用static关键字修饰一个方法:在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法(类调用)
-
限制:
-
它们仅能调用其他的static 方法,反过来是可以的(普通方法可访问static方法)
它们只能访问static数据。 -
它们不能以任何方式引用this或super。因为this是对象层次的,甚至没创建对象就调用static,哪来this
-
不允许用来修饰局部变量
-
六.传参
JAVA本质都是值传递,相当于形参是单独开辟了一个空间,把实参的值拷贝过来而已,在函数中修改参数,实际上是修改的形参的值,实参不会变
而引用传过去后,虽然也是拷贝了一个引用,但实参和形参指向了同一个对象,所以通过形参引用去修改对象,实参那里也会反应出来(就和指针一样的)
public class Main{
public static void main(){
}
}
七.程序结构
用一个Main类来作为程序入口,组织主要逻辑。其他类不要包含main方法,不然会搞得特别混乱!
八.封装
目的:高内聚,低耦合
表现:数据隐藏,对外提供接口来取得数据,以及带条件的操作数据
好处:模块化、信息隐藏、代码重用、插件化易于调试、具有安全性
实现:访问权限符+set/get方法
class Person{
//属性是成员变量,私有化属性,使得其他对象不能直接访问属性
private String name;
private int age;
//参数及方法内定义的变量是局部变量
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
}
访问权限符:
其中package即默认值,当不写的时候就是package
以上是关于JAVA学习-面向对象的主要内容,如果未能解决你的问题,请参考以下文章