Java面向对象(三)
值传递
值传递:将数值传递给方法,进行计算,不影响之间的值,传递的值是一个副本
引用传递:将对象本身传递给变量。
注意:在java中没有引用传递,只有值传递
object(续)
object 提供了所有类共有的各种方法
toString
父类的toString 方法就讲内存地址转化为类名+hashcode码
java规定,如果你输出的对象是变量,默认调用toString讲内存地址转化为字符串输出。如果是对象.属性 或者属性.方法 会输出对象的属性值或方法。
equals
比较两个对象是否相等到,子类可以重写,根据自己的需求进行重写。
hashcode
equals 和 hashcode 两个方法都是用来判断两个对象是否相等的方法,但是equals在进行比较的时候,本质是比较对象所有的属是否相等,如果属性全都相等,当前两个对象就想等,这种验证方法效率比较低。
hashcode 来比较,hashcode 方法用hash值来比较(hash算法),效率非常高。
hashcode 并不是完全可靠的,有时不同对象生成的hashcode一样。
特点:equals 相等的两个对象,他们的hashcode值一定相等,也就是说equals来判断绝对可靠,hashcode相等对象,进行equals比较并不一定相等,hashcode 并不是绝对可靠。
super关键字
java中有几种表示形式:
- 1、super.属性 表示表演父类的属性
- 2、super.方法 表示调用父类的方法
- 3、super(参数) 自己指定父类调用的构造器
在java类中,在使用super关键字来表示引用父类的属性和方法,this.表示当前类的对象,super.表示父类的对象。
final 关键字
final修饰变量:
变量的值就不能改变,变成常量。
final 修饰类:
表示当前类不可被继承。
final 修饰方法:
该方法不能被重写。
类的高级特性:
访问修饰符:
类的每个成员(包括变量、方法和构造器)都有一个访问修饰符,用来判断 谁可以访问该成员。
访问修饰符的作用是限制属性和方法被使用和调用的范围,指明了类的数据成员和方法的能够被访问的程度
封装:
封装:
将类的某些信息隐藏在类的内部,不允许外部直接访问,而是通过类提供对外的接口来访问当前的数据。
特点:
- 构造器必须public
- 属性必须是私有的(private)
- 提供属性接口(get访问器,set修改器)
- 类是可序列化的。(implements Serializable)
javabean:
遵循上述三条规范的对象叫做javabean对象,是java中设计的一种可重用的组件。
封装的优点:
- (1): 良好的封装能够减少类与类之间的耦合
- (2): 类内部的结构可以自由修改
- (3):可以对属性(成员变量)进行控制
- (4):隐藏信息,实现细节
静态类
static变量
java中其实不存在全局变量的概率,我们可以使用static来实现一个伪全局的概念。static 在java中表示全局或者静态的意思。
用static 来修饰属性或方法,当前属性或方法就属于类级别。
对象级别: 成员变量、成员方法。
类级别: 静态的内容都属于类级别。
在类加载时,类的静态变量就已经在内存里创建了空间,静态变量默认在方法区,通过内创建的对象,每个对象都可以共享静态变量。
成员变量和静态变量的区别:
1、静态变量随着类加载就初始化,在内存中有且仅有一个,jvm只会给当前类的静态变量分配一次内存,同时类的静态变量是所有对象共享的额,还可以通过类名.静态变量来访问。
class TestStatic {
static String name;
public static void main(String[] args) {
String name = TestStatic.name;
}
}
2、实例变量:伴随着对象的产生而创建,每个对象都有对应的实例变量。所有的实例变量都是和对象同生共死的。
一般公共的条件(共享的)一般设成静态的。
static方法
与static 变量一样,属于类的方法。main方法就是静态方法。
成员方法和静态方法调用成员变量和静态变量的区别:
1、静态方法可以直接调用本类中的静态成员
2、静态方法不能调用非静态成员变量(成员变量还未创建)
3、普通方法可以调用静态变量也可调用普通变量
4、静态方法可以调用静态方法,但不能调用普通方法
5、普通方法可以调用成员方法,也可以调用静态方法。
静态块
public class StaticBlock{
public StaticBlock() {
System.out.println("这是构造器")
}// 最后执行构造器
{
System.out.println("这是一个普通块1");
} // 先执行块1
{
System.out.println("这是一个普通块2");
} // 在执行块2
static {
System.out.println("这是个静态块")
} // 最先执行,并且只执行一次
}
普通块:在类下{ } 来书写的代码就称为普通块,作用每次在产生对象的时候都会执行。
静态块:在普通块前加一个static 表示静态块,类加载时就在内存创建空间,并且有且仅有一个,不管创建多少个对象都共享这个块。
执行顺序:静态块—普通块—构造器。