文章目录
继承
父类和子类间相关系:1.子类的属性比父类多,所以可以由 子类强制转化成父类 但是父类不可以强制转化成子类(运行错误)
2.父类中的方法在子类中都可以执行,子类中的方法父类如果没有声明则不可以执行
父类引用可以指向子类对象 子类引用不可以指向父类对象(编译错误)
父类引用指向子类对象时,运用父类引用调用方法时,如果子类中有该方法,则执行子类中的方法,如果子类中没有该方法,则执行父类中的方法
子类引用指向子类对象时调用方法时,如果子类中有该方法,则执行子类中的方法,如果子类中没有该方法,则子类引用执行父类中的方法
父类引用指向父类对象时,调用子类中有而父类中没有的方法,为编译错误
多态
多态的定义
一种对象的多种表现形式
多态的表现
①方法的重载和重写 ②对象的多态:父类引用指向子类对象
例如 Person person=new Man();
java程序运行时分为编译和运行 所以编译时:看左边 为父类的引用 则不可以实现子类中特有的方法,实现时为编译错误
运行时:看右面 指向子类对象,实现子类重写父类的方法时执行子类中的方法
----------虚拟方法调用(动态绑定)
引用数据类型的转换
向上转换:子类转父类 系统自动进行 如上面的把Man对象转为Person对象
向下转换:强制类型转换 注意转换时只能强制转换为父类引用指向的子类对象,如可以强制转 Man man=(Man)person 但是不可以强制转为women型,因为父类引用不指向子类对象
注意 :属性不具有多态性 即不可以进行虚拟属性的调用 父类引用指向子类对象时属性还是父类的属性
多态的应用
①多态数组:可以存储父类本类中的对象 也可以存储其子类的对象
遍历数组时 存储的父类对象执行父类方法 存储子类对象执行子类的方法
②多态参数:定义方法时,参数列表可以为多态参数,即为父类,当传递的为子类时,方法体中的方法(父类具有的,不可包括子类特有的)执行对应子类的方法,即为多态参数在方法中的应用
instanceof方法
基本用法: x instanceof Class 用于判断x引用指向的对象是不是Class类的对象,如果是则返回True 如果不是返回False
java.lang.Object
Object是所有类的父类,当一个类没有显示继承任何类时,默认继承Object类
作用:Object中的内容具有共性 子类可以继承Object类中的所有方法 若Object中的方法对于子类来说不适用,可以对其方法进行重写
equals方法
比较两个类是否相等可用”==“运算符和equals运算符,下面逐一进行详细的讲解
“==”运算符
①基本数据类型:比较两个类的 值(ASCII)是否相等
②引用数据类型:比较两个类的 地址值 是否相等
.equals方法
①只可以用于引用数据类型之间的比较
②Object类中的equals方法 比较的是 两个Object类的地址值 是否相等(底端默认的使用==方法判断)
③String类中的.equals方法比较的是两个字符串中的字符是否相等是因为底端对String的.equals 方法进行了重写
④如果一个类中不想比较地址值是否相等 而想比较其他的是否相等,应该在该类中对.equals方法进行重写
没有重写.equals方法前比较地址值
下面重写.equals方法比较名字和age是否相同
toString()方法
返回当前对象的字符串形式
①在Java.long.Object中
②当直接打印对象的引用时,默认调用toSring方法
③Object类中的toString方法的返回格式为:
getClass.getName()+‘@’+Integer.toHexString(hashcode());
④当Object中的toString方式不适用当前对象时,对其进行重写
Static方法
静态的
用于修饰 属性 方法 代码块 内部类
Static修饰属性(静态变量/类变量)
①随着类的加载而加载,随着类的消失而消失(生命周期最长)
②static修饰的该属性被该类的所有对象所共有,即通过一个对象修改该属性的时候其他对象的该属性的值也会随着改变
③静态变量存在优先于对象
④可以通过 “ 类名.类变量的方式”修改该属性值
可以看到,首先通过类中的.setNation方法修改了nation为China ;
然后又通过类名.类变量的方法将nation改为了中国
Static修饰方法(静态方法/类方法)
①随着类的加载而加载,随着类的消失而消失(生命周期最长)
②静态方法存在优先于对象(也即静态方法存在时 对象可能还不存在)
③通过 类名.类方法 的方式进行使用
④静态方法中 不可以 存在非静态成员
⑤非静态方法中 可以 存在静态成员
⑥静态方法中不能存在 this和super(其本质为对象)
非静态代码块
代码块用于类中
①格式:{
代码
}
②非静态代码块在创建对象的时候开始执行
③非静态代码块执行时优先于构造器
④代码块可用于属性的初始化---->属性的初始化方法:Ⅰ默认值(缺省值)Ⅱ直接显示赋值/代码块 Ⅲ构造器 其赋值顺序从前到后依次执行
注意:直接显示赋值和代码块的方式对属性进行初始化是同级的,即谁在上面谁先进行初始化
⑤非静态代码块可以有多个,按照从上到下的顺序依次执行
class Person{
private int age;
private String name;
{
System.out.println("这是一个非静态代码块");
}
静态代码块
①格式: static{ 代码}
②随着类的加载而加载,随着类的消失而消失
③静态代码块优先于构造器
④静态代码块中不可以有非静态成员和this super等方法
⑤一个类中可以有多个静态代码块,依次顺序执行
public class staticCodeBlocks {
public static void main(String[] args) {
dog d1=new dog("嘿嘿");
d1.toSring();
}
}
class dog{
private String name;
private static int age=10;
static {
age=15;
}
//先是直接显示赋值age为10,后来通过代码块赋值为15,所以结果为15
//如果代码块和直接显示赋值的顺序调换,则age为10;
public dog() {
}
public dog(String name) {
this.name = name;
}
public static int getAge(){
return age;
}//这里为static方法,不可以存在非staric成员,且其方法不可以用对象的引用执行,可以通过类名.类方法的方式执行
public void toSring(){
System.out.println(this.name+dog.getAge());
}
}
单例设计模式
单例设计模式就是一个类最多有一个对象实例,所以单例设计模式的设计理念为
①在类的内部创建类对象(static修饰的属性,为定义类方法做铺垫)
②构造器私有化(private)
③设计类方法(返回类型为该类类型 )
外部通过类名.类方法的方式创建一个对象
饿汉式单例设计模式
在类的内部直接创建一个对象
class singleton1{
//在类的内部创建对象
private static singleton1 instance1=new singleton1();
//把构造器私有化,这样在外部就不可以创建对象了
private singleton1(){
}
//设计static静态方法,在外部通过类名.类方法的方式获得类对象
public static singleton1 getInstance(){
return instance1;
}
public void toSting(){
System.out.println("这是饿汉式单例对象设计");
}
}
懒汉式单例设计模式
在类的内部先把类对象赋值为空,然后定义类方法,如果为对象为空,则创建一个对象,如果不为空,则直接返回这个对象
class singleton2{
//在类的内部不直接创建对象,首先把其定义为null
private static singleton2 instance2=null;
private singleton2(){
}
public static singleton2 getInstance2(){
if (instance2==null){
instance2=new singleton2();
}
return instance2;
}
public void toSting(){
System.out.println("这是懒汉式单例设计模式");
}
}
final修饰符
译为:代表最终的 可用于修饰属性 方法 类
①final修饰的类不能被继承
②final修饰的方法不能被重写
③final修饰的变量叫做常量,一旦被赋值不能再被修改(直接显式赋值 构造器 代码块赋值)