004面向对象三大特征+几个常见类

一.面向对象三大特征

封装和隐藏

问题:当创建了类的对象以后,如果直接通过“对象.属性”的方式对相应的对象属性赋值的话,可能会出现不满足实         际情况的意外,我们考虑不让对象来直接作用属性,而是通过“对象.方法”的形式,来控制对象对属性的访问。实际         情况中,对属性的要求就可以通过方法来体现。

解决的方法:(封装性的思想)将类的属性私有化,提供公共的方法(setter & getter)来实现调用。

继承

为什么要设计继承性: 为了方便,我们把一些事物共有的属性和行为单独建成一个类,让其他具体的事物来继承。

如何实现类的继承:通过“class A extends B”类实现类的继承。子类:A     父类(或基类SuperClass):B

子类继承父类后会怎样:父类中声明的属性、方法,子类都可以获取到。

明确:当父类中有私有的属性或方法时,子类同样可以获取得到,只是由于封装性的设计,使得子类不可以直接调用罢了。子类除了通过继承获取父类的结构之外,还可以定义自己特有的成分。extends:子类是对父类功能的“扩展”,明确子类不是父类的子集。

Java继承特点:只支持单继承:一个类只能继承一个父类。反之,一个父类可以有多个子类。子类父类只是相对的概念

多态

体现:方法的重载(overload)和重写(overwrite)。对象的多态性--可以直接应用在抽象类和接口上。

Java引用变量有两个类型:编译时类型和运行时类型。编译时的类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。*若编译时类型和运行时类型不一致,就出现多态。

多态性指的是什么:①多态性可以理解为一个事物的多种表现形态:方法的重载与重写  、子类对象的多态性。②子类对象的多态性前提:要有类的继承  、要有子类对父类方法的重写。③程序运行分为编译状态和运行状态。

对于多态性来说:编译时,“看左边”,将此引用变量理解为父类的类型。运行时,“看右边”,关注于真正对象的实体,子类的对象。那么执行的方法就是子类重写的。

/*
 * Person是父类  Student是子类。
 * 子类对象的多态性:父类的引用指向子类对象。
 * 虚拟方法调用:通过父类的引用指向子类的对象实体,当调用方法时,
 * 实际执行的是子类重写父类的方法,不能调用子类特有的方法。
 */
Person p = new Student();//向上转型
Student s = (Student)p;//向下转型,使用强转符

/*
 * 上面的强转可能类型不同可能失败,所以使用下面委婉一点的方法
 */
if (p instanceof Student) {
	Student s = (Student)p;
}
/*
 * instanceof格式: 对象p instanceof 类Student
 * 判断对象p是否是类Studnet的一个实例。 是的话,返回true,否则返回false
 */

二.几个常见类

Object类:所有Java类的根父类。如果在类的声明中未使用extends关键字指明其父类,则默认父类为Obeject类。

比较数据类型:①基本数据类型:根据基本数据类型的值判断是否相等。相等返回true,反之返回false。注意:两端数据类型可以不同,在不同的情况下,也可以返回true。②引用数据类型:比较引用数据类型变量的地址值是否相等。

equal()方法:①只能处理引用类型变量。②在Object类,发现equal()仍然比较的两个引用变量的地址值相等。③java.lang.Object类是所有类的根父类。④像 String包装类 File类 Date类这些类重写Object类的equal()方法,比较是两个对象的。⑤“实体内容”是否完全相同。⑥重写的equal()方法。

public boolean equals(Object obj) {
	if (this == obj) {
		return true;
	} else if (obj instanceof MyDate) {
		MyDate m = (MyDate) obj;
		return this.day == m.day && this.month == m.month &&this.year == m.year;
	} else {
		return false;
	}
}

toString()方法

/*
 * 1.toString()方法在Object类中定义,其返回值是String类型,返回类名和它的引用地址。
 * 2.在进行String与其他类型数据的连接操作时,自动调用toString()方法
 * 3.可以根据需要在用户自定义类型中重写toString()方法。如String类重写了toString()方法,返回字符串的值。
 * 4.基本数据类型转换成为String类型时,调用了对应包装类的toString()方法
 * 5.java.lang.Object类的toString()方法的定义如下:
 */
Date now = new Date();
Syatem.out.println("now="+now);//相当于
Syatem.out.println("now="+now.toString());

s1 = “hello”,
System.out.println(s1);//相当于
System.out.println(s1.toString());

int a = 10; 
Syatem.out.println("a="+a);

public String toString() {
	return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

当我们打印一个对象的引用时,实际上默认调用的就是这个对象的toString()方法。当我们打印的对象所在的类没有重写Object中的toString()方法时,那么调用的就是Object中定义的 toString()方法,返回此对象所在的类及对应的堆空间对象实体的首地址值。当我们打印对象所在的类重写了toString()方法时,调用的就是我们自己重写的toString()方法。常常重写为将对象的属性信息返回。像String类、包装类、File类、Date类等。已经实现了Object类中toString()方法的重写。

Junit单元测试类:当前工程下-右键build path-add libraries-Junit4。引入类:import org.junit.Test;。在方法上面写着@Test紧挨着方法,返回值类型应该用void。

测试:双击方法名,右键run as-junit Test即可。

发布了23 篇原创文章 · 获赞 7 · 访问量 1796

猜你喜欢

转载自blog.csdn.net/weixin_44145972/article/details/88924842