JAVA基础、方法、面向对象笔记5

Java面向对象高级特性
本文深入探讨Java中的静态成员、包管理、继承机制、多态性等核心概念,并讲解抽象类、final关键字及接口的应用。
静态方法不会针对每一个对象来调用
成员变量是在堆内存中分配
类的各个对象之间都可以将静态成员变量修改
成员变量只有new出来的时候才在堆内存中分配


静态方法所以在static方法中不可访问非static 的成员
非静态成员专属于某个对象
想要访问某个非静态成员只有通过new一个对象出来
静态成员变量可以通过对象来修改
就是可以通过对象名来访问


包可以是为了解决类重名的问题,类名会产生冲突
在java中给报起名有一个约定俗成的规则
包只能放在源代码第一行,当然前面写注释无所谓,注释不认为是源代码
一般是公司域名的倒写,后面还可以跟各种项目名等




如果你要把一个源文件放在一个包里面,第一句话要写package,
后面你想跟多少重就跟多少重包,你编译出来的这个.clss文件必须位于
正确的路径下面,和包的层次完成一致
该类的源代码可能会产生会产生影响,应删除或是转移到另外的目录中
位于同一个包中的类不需要引入
必须class文件的最上层包的父目录位于classpath下
执行一个类需要写全包名
找任何类的时候,找不到的话,就需要你去classpath里面看看有没有
那个类的路径


如果你想在另外一个类中引用我们这个类,必须把这名字给写全了
要不然它不知道你用的是哪一个类,不然它还以为你这是裸体类
裸体类其实很容易跟别人产生冲突


短路径要放在前面


jdk提供给我们那些个类
java.lang包中包含一些JAVA语言核心类,如String,Math,Integer,System
和Thread,提供常用功能
java.awt包含了构成抽象窗口工具集的多个类,这些类被用来构建和管理
应用程序的图形用户界面(GUI)
java.applet包含applet运行所需要的一些类
java.net包含执行与网络相关的操作的类
java.io包含能提供多种输入、输出功能的类
java.util包含一些实用工具类,如定义系统的特性、使用与日期日历相关的
函数


一般我们实用String或是Systme时,都可以直接使用,而
如果我也想把自己的类打包成.jar包
一般其它的类我们在使用时还要导入它所在的包
在java中,只有java.lang包下的类在使用时可以直接引用
而其他包在使用时则不可以,必须要引用


java中使用extends关键字实现类的继承机制
通过继承,子类自动拥有了基类(superclass)的所有成员变量和方法


java只支持单继承,不允许多继承:
一个子类只能有一个基类
一个基类可以派生出多个子类


访问控制有四个
private 只能是类的内部使用
default 类内部、同一个包中(默认,什么都没有)
protected类内部、同一个包中、子类

public类内部、同一个包中、子类、任何地方

继承而来,当然继承父类的所有东西
如果继承来后,有default类型的成员变量的类子类也不可以访问


讲到内部类在讲private protected


方法的重写
在子类中可以根据需要对从基类中继承来的方法进行重写
重写方法必须和被重写方法具有相同方法名称、参数列表和返回类型
重写方法不能使用比被重写方法更为严格的访问权限


为什么要重写呢?
继承父类中的方法,他可能对父类中的方法不满意
例如动物类中run方法,
狗的run方法不同于动物类中的run方法


方法的重载
一个类里参数不同,个数不同,,方法名相同
方法名不一样,可能将来产生的结果会不一样
最好是copy来;
overload重载
override重写overwrite


其实default更加严格


super关键字
在java类中使用super来引用基类的成分
super相当于当前对象的父类对象的引用
子类可以重写,虽然父类中的方法也有一部分用处,此时为了省略
可以直接在子类方法中去引用父类中的方法


子类的构造的过程中必须调用其基类构造方法(子类对象的内部有一个父类
的对象,子类的构造方法中,应该首先调用父类中的构造方法)
子类可以在自己的构造方法中使用super(argument_list)调用基类的构造
方法
使用this(argument_list)调用本类的其它构造方法
如果调用super,必须写在子类构造方法的第一行


如果子类的构造方法中没有显示地调用基类的构造方法,则系统默认调用基类
无参数的构造方法
如果子类构造方法中既没有显示的调用基类构造方法,而
基类中又没有无参数的构造方法,则编译出错


equals方法
public boolean equals(Object obj){
}提供定义对象是否"相等"的逻辑,就是比较两个对象是否指向同一个对象
"=="于equals相同,都是看两个对象是否指向内存中同一块区域


如果x.equals(y)==y.equals(x)
x.equals(x)永远返回一个true;
x.equals(null)永远返回一个false
x.equals(y),y.equals(z),那么x.equals(z)


jdk提供一些类,如String,Date等,重写了Object的equals方法,调用这些类的
equals方法,x.equals(y),当x和y所引用的对象是同一个类对象且属性内容相等时,
(并不一定是相同的对象),返回true,否则返回false
可以根据需要在用户自定义类型中重写equals方法


2点20到6点20分,四个小时的时间
3点之前把对象转型给它看完
4点之前把多态看完(两个视频)
5点之前把抽象类和final关键字看完(两个视频) 
6点之前把两个接口看完


一个基类的引用类型变量可以"指向"其子类对象
一个基类的引用不可以访问其子类对象新增加的成员(属性和方法)
可以使用引用变量instanceof类名来判断该引用型变量所“指向”的对象
是否属于该类或该类的子类
子类的对象可以当作基类的对象来使用成为向上转型(upcasting),反之称为
向下转型(downcasting)


动态绑定和多态
我们可以在方法的参数中放一个父类的引用,
在实际放实参时可以是子类引用或是对象
再在方法中实际去区分一下,程序可扩展性比定义几个方法
面向对象最核心机制是多态


指的是执行期间,


当你要添加一个别的东西的时候直接添加就可以了
不用改Lady里面的东西


现在来总结一下:
动态绑定是指在执行期间而不是在编译期间所引用对象的实际类型
根据其实际类型调用其相应的方法
记住,是根据实际的类型来调用相应的方法
是动态得去找,new的是谁,找的就是谁


多态存在的条件是:
1、要有继承
2、要有重写
3、父类引用指向子类对象

Object类是所有Java类的根基类
public class Person{}=public class Person extends Object
Object类的方法
clone()方法
equals(Object obj)相等()
protected void finalize()收集垃圾之前,垃圾收集器会帮忙调用这个finalize()方法
Class getclass()反射机制,拿到的是一个已经编译好的class文件,返回值是一个class对象
int hashCode()返回一个哈希码,这个对象在内存中有一个位置,可以根据哈希码可以很容易找到这个位置
String toString()返回代表这个对象的一个字符串


toString()方法
一个字符串和另外一种类型的数据进行连接时,自动转换成字符串类型
任何类都可以重写这个toString()方法
这个方法默认是返回“类名+哈希码”


哈希码
会用一个表,来记录每个对象在内存中的位置




public class MyMouseListener extends MouseAdapter {
public void mouseClicked(MouseEvent evt) {
if (evt.getClickCount() == 3) {
// 处理鼠标三击
} else if (evt.getClickCount() == 2) {
// 处理鼠标双击
}
}
}


处理鼠标右键


public mouseClicked(MouseEvent e){


if(e.isMetaDown()){//检测鼠标右键单击


}


如何在小程序中处理鼠标中间键?


new MyMouseListener());


public class MyMouseListener extends MouseAdapter {
public void mouseClicked(MouseEvent evt) {
if ((evt.getModifiers() &?
InputEvent.BUTTON1_MASK) != 0) {
processLeft(evt.getPoint());
//处理鼠标左键单击
}
if ((evt.getModifiers() &?
InputEvent.BUTTON2_MASK) != 0) {
processMiddle(evt.getPoint());
//处理鼠标中间键单击
}
if ((evt.getModifiers() &?
InputEvent.BUTTON3_MASK) != 0) {
processRight(evt.getPoint());
//处理鼠标右键单击


抽象类、抽象方法
含有抽象方法的类必须被声明为抽象类,抽象类必须被继承
抽象方法是必须被重写,抽象类不能实例化
抽象方法只需声明,而不需实现
不重写也行,继续定义为抽象方法
抽象类是残缺的,不能new一个对象
不能实例化抽象类
抽象类中可以有非抽象方法


final的变量的值是不能被改变
final的成员变量
final的局部变量
final的方法不能够被重写
final的类不能够被继承
public void m(final int j){}
表示这个j一旦被传进来就不能被改变
public void m(final Cat c){}
不能让这个引用指向其它的猫
只有继承这个类后才可能重写该类中的方法


面向对象最后一个知识点
java中其实也是可以是
接口有实现类之间的多态性
多个无关的类可以实现同一个接口
一个类可以实现多个无关的接口
接口是抽象方法和常量值的定义的集合
从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的
定义,而没有变量和方法的实现


抽象类中具有的方法接口全有
接口中所有的方法都是抽象方法
并且抽象类的属性(成员变量)是


接口中只包含常量和方法的定义,而没有变量和方法的实现
接口中所有的方法不用谢abstract,所有全都是abstract
接口可以多重实现,一个类可以实现多个接口
接口中成员变量默认是public static final,也只能是public static final
接口中的方法只能是抽象方法,写不写都是抽象方法,而且这些方法默认为
public 的,也只能是public的
接口可以继承其它接口,并添加新的属性和抽象方法




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值