final
1.此类不能被其他类继承
public final class 类名 {}
2.方法不能被重写
public final void 方法名(){}
3.属性值不能被修改
final int a=10;
static
一、放在属性上(类属性,静态属性)
1.类属性的使用方式
1.对象.属性
2.类名.类属性(推荐使用)
2.类属性和普通属性的区别
使用方式的区别:
类属性不需要创建对象就可以使用,普通属性必须创建对象才可以使用
类属性: 类名.属性名
普通属性: 对象名.属性名
3.各自的特点:
类属性属于全局的,所有对象共用一个属性值
普通属性是每个对象属性值特定的,改变一个对象的属性,另一个对象的属性值不会发生变化
二、放在方法上(类方法:静态方法,工具方法)
1.类方法特点
不需要创建对象就可以使用
只要类被加载(即加载main方法),无需创建对象就可以调用静态的内容
一个类的加载顺序:
静态属性(类属性)-->静态代码块-->普通属性-->代码块-->构造
如果继承中类有静态属性或代码块,类的初始化顺序:
父类静态属性(类属性)-->父类静态代码块-->子类静态属性(类属性)-->子类静态代码块-->父类普通属性-->父类代码块-->子类普通属性-->子类代码块-->父类构造-->子类构造
静态的方法中不能使用类中的普通属性
静态方法和普通方法(即非静态方法)之间的相互调用:
静态方法不能调用非静态方法,非静态方法可以调用静态方法(涉及到方法加载的优先级)
如果必须在静态的方法中调用非静态方法,必须要创建对象,通过对象.方法来调用
静态方法可以直接调用静态方法,无需创建对象
非静态方法可以直接调用非静态方法,无需创建对象
方法在加载时,同一级别的方法同时加载,所以同一级别的方法不考虑顺序的问题
三、放在代码块上
object
package com.jredu.oop.ch0203;
public class Ch05 {
public int a;
public double b;
//判断两个对象的值是不是相等
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
//判断是否是同一个对象
if(super.equals(obj)){
return true;
}else{
//判断是否是Ch05类型的对象
if(obj instanceof Ch05){
//引用数据类型的强制类型转换:父类转子类
Ch05 ch05=(Ch05)obj;
if(a==ch05.a&&b==ch05.b){
return true;
}
}
}
return super.equals(obj);
}
@Override
public String toString() {
return "Ch05 [a=" + a + ", b=" + b + "]";
}
public static void main(String[] args) {
Ch05 c1=new Ch05();
c1.a=10;
c1.b=10;
Ch05 c2=new Ch05();
c2.a=10;//c2.a=11;
c2.b=10;
Object object=new Object();
System.out.println(c1.equals(c1));
System.out.println(c1.equals(c2));
System.out.println(c1.equals(object));
System.out.println(c1);
Class c=c1.getClass();
System.out.println(c.getName());
}
}
多态
优化设计
如何实现多态:
1.使用继承
2.子类重写父类的方法
3.父类引用子类对象:同一个引用类型,使用不同的实例而执行不同的操作
多态的优点:
NoneColor.java , Colorful.java 继承了Print.java的属性和方法,Test.java声明一个方法并传参数,参数是父类Print.java的方法
类的内部类
一个类中只有一个public,但可以有多个类,类可以嵌套类。
创建内部类对象必须先创建public类对象。
引用类型转换
向上转型:
父类引用子类
可见性:父类重写子类的方法
应用:多态
向下转型:
强制类型转换,父类转子类
应用:类型的还原
instanceof
判断一个对象是否属于一个类或者实现了一个接口
强制类型转换之前通过instanceof运算符检查对象的真实类型,可以避免类型转换异常,从而提高代码健壮性