面向对象编程(中级)

包的使用

包作用类似文件夹,在项目下新建一个包,com.xiaoming,也就是在项目下新建com文件夹下建xiaoming文件夹。
在一个程序中引用不同的包下的同一个类时,只能导入一个,另一个需要在前面加上包名再调用

package com.use;

import com.xiaoming.Dog;

public class Test {
	public static void main(String[] args) {
		Dog dog = new Dog();
		System.out.print(dog);
		
		com.xiaoqiang.Dog dog1 = new com.xiaoqiang.Dog();
		System.out.println(dog1);
	}
}
命名规则

在这里插入图片描述

package com.shystudy.pkg;//package用来打包的,需要放在最上面

import java.util.Arrays;
import java.util.Iterator;

//import java.util.Scanner;//只导入Scanner类,推荐需要什么就导入什么
//import java.util.*;//表示将java.util包下的所有其他类全部引入
public class Import01 {
	
	public static void main(String[] args) {
		//使用系统提供的Arrays类进行数组排序
		int[] arr = {-1,20,2,13,3};
		Arrays.sort(arr);
		//输出排序结果
		for (int i = 0; i<arr.length;i++) {
			System.out.print(arr[i] + " ");
			
		}
	}
}

常用的包
1、Java.lang(默认包,不用导入);java.util(系统提供的工具包);Java.net//网络包,网络开发;java.awt//java界面开发包,GUI

访问修饰符

具体使用程序在文件夹com.shystudy.encap中进行查看
在这里插入图片描述
在这里插入图片描述

封装

把属性和方法封装在一起,数据被保护在内部,程序的其他部分只有被授权才可以使用
好处:隐藏实现细节,可以对数据进行验证,保证安全合理

封装实现步骤

1、将属性私有化【不能直接修改属性】
2、提供一个公共的set方法,用于对属性的判断且赋值
public void setXxx(类型 业务名){
//加入属性验证的业务逻辑
属性 = 参数名
}
3、提供一个公共的get方法,用于获取属性的值
public XX getXxx(){
return xx;
}
细节:eclipse快捷键ctrl + shift + s可以快速建立set和get以及构造器等方法

继承(提高代码的复用性)

当两个类大部分属性和方法都相同时,可以考虑使用继承,在父类中定义相同的属性和方法
在这里插入图片描述
继承的基本语法
class 子类 extends 父类{
}
子类会自动拥有父类定义的属性和方法;父类又叫超类,基类;子类又叫派生类。

继承细节

所有代码在com.shystudy.extend_内查找
1、子类继承了所有的属性和方法,但是私有属性和方法不能在子类直接访问,要通过公共的方法去访问(父类提供的公共方法去访问)。
2、子类必须调用父类的构造器,完成对父类的初始化。
3、当创建子类对象时,不管使用子类的那个构造器,默认情况下总会去调用父类的无参构造器;当父类没有无参构造器时,必须在子类的每个构造器下都指定父类构造器完成初始化工作(利用super()完成调用),否则编译不通过
4、子类需要调用不同的父类构造器可以通过显式调用
5、super()在使用时必须放在构造器第一行。
6、super()和this都必须放在第一行,所以二者不能同时使用。
7、Object()是所有类的父类,java所有类都是Object()的子类。(使用ctrl+t可以看到所有类的继承关系)
8、父类调用不限于直接父类,会往上一直调用到Object类。
9、子类只能继承一个父类,但是可以间接继承,a-b-c,c通过b继承a。
10、子类和父类必须满足is-a的关系。

继承的内存细节

在这里插入图片描述

继承练习题

1、super和this不能共存,有this语句就不执行super
2、每个构造器都默认有一句super(),调用父类的无参构造器。
输出 a ,b name , b。
在这里插入图片描述
在这里插入图片描述

super用法

1、访问父类的属性,但不能访问父类的private属性
2、访问父类的方法,但不能访问父类的private方法
3、访问父类的构造器,只能放在第一句,而且只能出现一句。

super关键字使用细节

1、调用父类构造器分工明确,父类属性有父类初始化,子类属性由子类初始化
2、当子类中有和父类重名的成员时,为了访问父类的成员,必须使用super,如果没有重名,super和this效果一样
3、super的访问不限于直接父类,如果爷爷类中有同名成员,也可以使用super去访问,但是super访问遵循就近原则。
在这里插入图片描述

方法重写/覆盖(override)

子类的一个方法和父类的方法名称、返回类型、参数一样,那么就说这个子类的方法覆盖了父类的方法

细节

1、子类和父类得参数、方法名称要和父类完全一样
2、子类的放回类型和父类的一样,或者是父类返回类型的子类。(子类的返回类型不能是父类返回类型的子类)
3、子类的方法不能缩小父类的访问权限(public>protected>默认>private>)父类是public,那么子类必须是public,如果父类是默认,子类是public和private就可以

方法的重载和重写的比较

在这里插入图片描述

多态

方法或者对象具有多种状态,建立在封装和继承之上
1、方法的多态:重写和重载都体现了方法的多态
2、对象的多态:
(1)一个对象的编译类型和运行类型可以不一致(父类的引用可以指向子类的对象 Animal animal(只是一个属性引用)= new Dog()(实际的对象); )(编译类型是animal,运行类型是dog或者是Cat)
(2)编译类型在定义对象时,就已经确定了,不能改变
(3)运行类型是可以变化的
(4)编译类型时看定义时 = 的左边,运行类型看 = 的右边

3、多态注意事项和细节讨论
属性看编译类型,方法看运行类型
(1)多态的前提是两个类存在继承关系
(2)多态的向上转型:父类的引用指向了子类的对象;
父类类型 引用名 =new 子类类型();
可以调用父类的所有成员(方法和属性),私有的权限依旧要遵守
不能调用子类的特有成员,与父类重写的可以调用(因为在编译阶段能调用那些成员需要由编译类型决定,运行结果则由运行类型决定,调用时从子类开始寻找)
(3)多态的向下转型: 语法:子类类型 引用名称 = (子类类型)父类引用;
只能强转父类的引用,不能强转父类的对象
要求父类的引用必须指向当前目标类型的对象
当向下转型后,就可以调用子类类型中的所有成员
(4)属性值不能重写,只能看编译类型。
(5)instanceOf比较操作符,用于判断对象的运行类型是否为xx类型或xx类型的子类型。
## java的动态绑定机制
在调用对象方法时,该方法会和对象的内存地址也就是运行类型绑定
在调用对象属性时,没有动态绑定,哪里声明,就那里使用
所以如果对象运行类型为子类,调用了父类的方法,如果父类方法又调用了父类和子都有的方法,实行动态绑定机制,此时父类会调用子类中的此方法。如果调用父类的方法中出现了父类和子类都有的属性,那么就直接调父类的属性,那里声明,哪里使用

多态数组,多态参数(多态的应用)

数组的定义类型为父类类型,里面保存的实际元素为子类类型
多态参数:形参类型为父类类型,实参允许为子类类型(主人喂动物案例)

Object类详解

equals方法

和equals的对比
1、
既可以判断基本类型,有可以判断引用类型
2、== 如果判断基本类型,判断的是值是否相等。实例:int i=10,double d=10,di
3、
如果判断引用类型,判断的是地址是否相等,及判定是不是同一个对象
equals:用于判断引用类型(地址)是否相等,是Object的子类,使用时子类往往重写该方法,用于判断内容是否相等;比如Integer,String

hashcode方法

1、具有提高hash结构的容器的编码效率;
2、两个引用如果指的是同一个对象,那么哈希值一定是一样的;
3、两个引用如果指的是不同的对象,那么哈希值一定不一样;
4、哈希值主要是根据地址号来的,但是不能完全等同于地址号;
5、案例演示[hasncode.java];
6、后面在集合中如果需要,也会重写hashcode方法。

toString方法

默认返回:全类名(包名+类名)+ @+哈希值的十六进制;子类往往重写这个方法,用于返回对象的属性信息;当输出一个对象时,toString方法会直接被调用。
在这里插入图片描述

finalize方法

1、当对象被回收时,系统自动调用该对象的finalize方法。子类可以重写该方法,做一些释放资源的操作
2、什么时候被回收:当某个对象没有任何引用时,则jvm就认为这个对象是一个垃圾对象,就会使用垃圾回收机制来销毁该对象,在销毁对象前,会调用finalize方法;
3、垃圾回收机制的调用,是由系统决定的,也可以通过System.gc()主动触发垃圾回收机制;

断点调试

1、在开发过程中,新手程序员可以一步步查看源码执行过程,从而发现错误所在。
2、在断点调试过程中,是运行状态,是以对象的运行类型来执行的;
3、断点调试是指在程序的某一行设置一个断点,调试时,程序到这一行就会停止,然后可以一步步向下调试,调试过程中可以查看各个变量的值,出错的话,到出错的代码即显示错误,从而分析找到这个bug
在这里插入图片描述
在这里插入图片描述
Debuger取消勾选java,javax(可以看java的原码,通过F7)

断点调试案例:使用断点调试的方法,查看一个对象的创建过程;使用断点调试

项目(零钱通)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(子类如果不写super默认调用super())

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值