封装
什么是封装
面向对象一共三大特性:封装,继承和多态
封装带来的特性是:保护性,易用性。(封装有很多中表现形式)
之前写的程序中,我们不难发现,任何一个对象可以随意更改调用类中的成员变量和方法,这样非常不安全,所以需要保护起来,封装起来。
或者我们写的程序,作为用户而言,只要实现具体功能,并不需要知道组成他的具体部分是什么,所以可以封装起来,这是易用性的体现。
private实现封装
权限修饰符
Java的权限修饰符指的是,修改的属性,方法,类可见的范围到底有多大
一共有四大访问修饰符,可见的范围由小到大以此为
private < default(不需要写这个关键字,啥也不写就是default)-包访问权限 < protected < public
修饰符 private 只是实现封装的一种。
public整个程序可见
被private修饰的属性或方法称为私有属性或私有方法
private只在类的内部可见,可以直接用
private不能修饰外部类:类的创建就是为了让人看见的
如何在类外部使用私有属性(getter,setter)
getter方法:获取私有属性
setter方法:更改私有属性(有命名规则的成员方法)
至于哪些属性需要提供setter让外部修改,需要根据属性特征决定
构造方法
构造方法是非常特殊的一类方法,使用关键字new实例化对象实际上就是调用的该类的构造方法。
使用关键字new产生一个对象时,大概分为以下两步:
1.为对象在堆中分配空间。
2.调用对象的构造方法为对象成员变量赋值。
构造方法语法规则
1.方法名与类名称完全相同
2.构造方法没有返回值声明(不是void)
3.一个类至少存在一个构造方法,若没有显示定义,编译器会生成一个默认的无参构造
结合内存说明
在方法中产生对象时,
1.先在堆上开辟一块空间(大小由该类中成员变量的属性决定)
2.调用对象的构造方法为所有成员变量赋值
成员变量的默认值就是在构造方法中赋值的。
有初值的成员变量同样在构造方法中赋值。
构造方法的重载
因为成员变量在建类时就定义好了,所以只有参数的个数不同。
对象不可以调用构造方法,
构造方法只在JVM产生对象时调用。对象实例化结束,无法在程序中手动调用构造方法再次实例化对象。
this关键字
this表示当前对象的引用
1.调用当前对象的成员变量
因为程序的就近匹配原则,当我们构建方法传递形参的时候,如果要使用的实参名和形参名相同,系统会就近匹配,也就是说可能形参等于传的形参自身,实参没变化
为啥使用一样的名字?因为这样一眼就可以看出是哪个参数,所以不能改名字。
这个时候我们就是需要使用this关键字调用成员变量。
2.调用当前的对象方法
调用类中的成员方法
之前我们说过,成员方法是可以直接调用成员方法的,调用成员方法需要对象,那么调用的时候对象从哪里来呢,this就代表对当前对象的引用。
如果我们不写this,系统会自动加上this
构造方法的互相调用
如果不同参数的构造方法之间有重复的调用
构造方法互相可以通过this(参数)的方法调用
this调用构造方法必须放在当前构造方法首行,且不能成环
3.表示当前对象的引用
this就相当于一面镜子,可以表示当前对象引用调用的属性或者方法
代码块
代码块就是括号{}括起来的代码部分
根据定义的代码块位置以及关键字的不同可以分为以下四种代码块
普通代码块出括号销毁
构造块
直接定义在类中,不加任何修饰的代码块,优先于构造方法执行,有几个对象就调用几次构造块
class Test1{
private int a=150;
{
a=100;
}
public Test1() {
a = 10;
}
public void p () {
System.out.println(a);
}
}
public class Test {
public static void main(String[] args) {
Test1 test = new Test1();
test.p(); //a = 10
}
}
静态代码块
定义在类中,使用static修饰的代码块,在类加载时执行一次
问题:static属性和static代码块谁先执行
static属性存在于方法区中,在类定义的时候就会有初始值,初始值为10,这个类就被放到方法区中了。 => 这个类只是定义了,还没加载
static代码块,当主方法使用了Test1 , 就需要把Test1从方法区加载到内存,类加载 => static代码块执行
class Test1{
static int a=150;
static {
a = 100;
System.out.println("静态代码块执行");
}
public Test1() {
System.out.println("构造方法执行");
}
public void good() {
System.out.println(a);
}
}
public class Test {
public static void main(String[] args) {
Test1 test = new Test1();
Test1 test2 = new Test1();
test.good();
}
}
匿名对象和toString方法
匿名对象:
new出来的对象,没有引用指向,用一次就销毁。
new Person(); 常用于测试某些功能,用一次被JVM销毁。
toString方法:注意大小写
当一个引用类型需要调用println函数打印时,我们如果采用普通的println发现打印出的是地址,我们想要属性的话可以自己实现一个toString方法。
class Test1{
private String name;
public Test1(String name) {
this.name = name;
}
public String toString() {
String str = "我的名字是"+this.name;
return str;
}
}
public class Test {
public static void main(String[] args) {
Test1 test = new Test1("小王");
System.out.println(test);
}
}
如何判断是否写正确?
有左边这个图标就对了
版权归原作者 小白的含金量 所有, 如有侵权,请联系我们删除。