第四章 面向对象程序设计(中)

版本:JDK1.8
注:观看尚硅谷视频的复习笔记

八、this

this:代表了当前对象

1、调用属性

2、调用方法

3、调用构造器

① 我们在类的构造器中,可以显式的使用"this(形参列表)"方式,调用本类中指定的其他构造器

② 构造器中不能通过"this(形参列表)"方式调用自己

③ 如果一个类中有n个构造器,则最多有 n - 1构造器中使用了"this(形参列表)"

④ 规定:"this(形参列表)"必须声明在当前构造器的首行

⑤ 构造器内部,最多只能声明一个"this(形参列表)",用来调用其他的构造器

调用空参构造器:this();

调用有参构造器:this(参数列表);

九、package与import

(一)、package

使用package声明类或接口所属的包,声明在文件的首行

1.为了更好的实现项目中类的管理,提供包的概念

2.使用package声明类或接口所属的包,声明在源文件的首行

3.包,属于标识符,遵循标识符的命名规则、规范(xxxyyyzzz)、“见名知意”

4.每"."一次,就代表一层文件目录。

(二)、常用包
  1. java.lang----包含一些Java语言的核心类,如String、Math、Integer、 System和
    Thread,提供常用功能
  2. java.net----包含执行与网络相关的操作的类和接口。
  3. java.io ----包含能提供多种输入/输出功能的类。
  4. java.util----包含一些实用工具类,如定义系统特性、接口的集合框架类、使用与日
    期日历相关的函数。
  5. java.text----包含了一些java格式化相关的类
  6. java.sql----包含了java进行JDBC数据库编程的相关类/接口
  7. java.awt----包含了构成抽象窗口工具集(abstract window toolkits)的多个类,这
    些类被用来构建和管理应用程序的图形用户界面(GUI)。
(三)、import
  1. 在源文件中显式的使用import结构导入指定包下的类、接口
  2. 声明在包的声明和类的声明之间
  3. 如果需要导入多个结构,则并列写出即可
  4. 可以使用"xxx.*"的方式,表示可以导入xxx包下的所有结构
  5. 如果使用的类或接口是java.lang包下定义的,则可以省略import结构
  6. 如果使用的类或接口是本包下定义的,则可以省略import结构
  7. 如果在源文件中,使用了不同包下的同名的类,则必须至少有一个类需要以全类名的方式显示。
  8. 使用"xxx.*"方式表明可以调用xxx包下的所有结构。但是如果使用的是xxx子包下的结构,则仍需要显式导入
  9. import static:导入指定类或接口中的静态结构:属性或方法。
import static java.lang.System.*;
import static java.lang.Math.*;

out.println("hello");
long num = round(123.434);

十、继承extends

提高代码复用性、便于功能扩展

(一)、方法的重写

1、定义:在子类中可以根据需要对从父类中继承来的方法进行改造,也称
为方法的重置、覆盖。在程序执行时,子类的方法将覆盖父类的方法。

2、要求:

  1. 子类重写的方法必须和父类被重写的方法具有相同的方法名称、参数列表

  2. 父类被重写的方法的返回值类型是void,则子类重写的方法的返回值类型只能是void

    父类被重写的方法的返回值类型是A类型,则子类重写的方法的返回值类型可以是A类或A类的子类

    父类被重写的方法的返回值类型是基本数据类型(比如:double),则子类重写的方法的返回值类型必须是相同的基本数据类型(必须也是double)

  3. 子类重写的方法使用的访问权限不能小于父类被重写的方法的访问权限

  4. 子类不能重写父类中声明为private权限的方法

  5. 子类方法抛出的异常不能大于父类被重写方法的异常

3、注意:子类与父类中同名同参数的方法必须同时声明为非static的(即为重写),或者同时声明为static的(不是重写)。因为static方法是属于类的,子类无法覆盖父类的方法。

(二)、super

1、super可用于访问父类中定义的属性

2、super可用于调用父类中定义的成员方法

3、super可用于在子类构造器中调用父类的构造器

(1)、我们可以在子类的构造器中显式的使用"super(形参列表)"的方式,调用父类中声明的指定的构造器

(2)、 "super(形参列表)"的使用,必须声明在子类构造器的首行!

(3)、我们在类的构造器中,针对于"this(形参列表)"或"super(形参列表)"只能二选一,不能同时出现

(4)、在构造器的首行,没有显式的声明"this(形参列表)“或"super(形参列表)”,则默认调用的是父类中空参的构造器:super(),如果父类没有空参构造器,则会报错。

(5)、在类的多个构造器中,至少有一个类的构造器中使用了"super(形参列表)",调用父类中的构造器

4、注意:

(1)、当子父类出现同名成员时,可以用super表明调用的是父类中的成员

(2)、super的追溯不仅限于直接父类

(3)、super和this的用法相像,this代表本类对象的引用,super代表父类的内存空间的标识

十一、多态

(一)、多态

1、父类的引用指向子类的对象

Person person = new Man();

2、虚拟方法调用:当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法

3、只能调用子类重写父类的方法,不能调用子类自身的方法,如果子类没有重写父类方法,则调用父类本身的方法。

person.eat();//调用的是子类的eat

4、对象的多态性,只适用于方法,不适用于属性,如果子类和父类有同名属性,则调用父类属性。

public class AnimalTest {
	
	public static void main(String[] args) {
		
		AnimalTest test = new AnimalTest();
		test.func(new Dog());
		
		test.func(new Cat());
	}
	
	public void func(Animal animal){//Animal animal = new Dog();
		animal.eat();
		animal.shout();
		//测试一个对象是否是一个类的实例
		if(animal instanceof Dog){
			Dog d = (Dog)animal;
			d.watchDoor();
		}
	}
}


class Animal{
	
	public void eat(){
		System.out.println("动物:进食");
	}
	
	public void shout(){
		System.out.println("动物:叫");
	}
	
}

class Dog extends Animal{
	public void eat(){
		System.out.println("狗吃骨头");
	}
	
	public void shout(){
		System.out.println("汪!汪!汪!");
	}
	
	public void watchDoor(){
		System.out.println("看门");
	}
}

class Cat extends Animal{
	public void eat(){
		System.out.println("猫吃鱼");
	}
	
	public void shout(){
		System.out.println("喵!喵!喵!");
	}
}
(二)、向下转型:父类引用子类对象的

如何调用子类本身的属性和方法(强制转换)

Person person = new Man();
Man man = (Man)person;
man.eat();
(三)、instanceof

测试一个对象是否是一个类的实例,如果是返回true否则返回false

对象instanceof 类

使用情景:在进行向下转型使容易出现异常,在向下转型之前使用instanceof测试,则可以避免出现异常。

public class HelloWorld {
	public static void main(String[] args) {
		Person person = new Man();
		System.out.println(person instanceof Person);//true
		System.out.println(person instanceof Man);//true
	}
}

class Person {
	
}

class Man extends Person {
	
}

class Woman extends Person {
	
}

十二、==与equals()

(一)、==

1、基本数据类型的比较:比较两个变量保存的数据是否相等(不一定类型相同,自动类型提升)

2、引用数据类型的比较:比较两个对象的地址值是否相同

3、不可以 基本数据类型==引用数据类型

(二)、equals()

1、只能适用于引用数据类型

2、在Object类中的equals()与==的作用是相同的

3、像String、Date、File、包装类等都重写了equals()方法,重写后比较的是两个对象的实际内容。

4、在任何情况下x.equals(null),返回值都是false。x.equals(和x不同类型的对象),返回值永远是false。

5、重写equals()一定要重写hashcode() ,确保了对象和对象地址之间的关联性

十三、toString()

1、当输出一个对象的引用时,实际上就是调用当前对象的toString()方法

2、像String、Date、File、包装类等都重写了toString()方法

十四、单元测试

单元测试不需要main()方法即可进行测试

1、选中当前工程,右键选择build path,add libraries,JUnit4,下一步

2、创建Java类,进行单元测试的规则:类权限必须是public,必须提供无参构造器。

3、此类中声明单元测试方法规则:方法权限必须是public,没有返回值,没有形参。

4、此方法上需要声明注解:@Test,并导入junit包。

5、选中方法名,右键ruan as,JUnit Test

说明:如果执行结果没有任何异常,绿色;如果出现异常,红色。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值