成员变量是在堆内存中分配
类的各个对象之间都可以将静态成员变量修改
成员变量只有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的
接口可以继承其它接口,并添加新的属性和抽象方法
Java面向对象高级特性
本文深入探讨Java中的静态成员、包管理、继承机制、多态性等核心概念,并讲解抽象类、final关键字及接口的应用。
621

被折叠的 条评论
为什么被折叠?



