JAVA基础_面向对象
JAVA学习_面向对象OOP
学习7.0
快捷键
文档注释:alt+shift+j
继承性
优点:减少代码冗余; 便于功能扩展; 为多态性提供前提
格式:class A extends B{ }
A: 子类、派生类、subclass
B: 父类、超类、基类、superclass
体现:A获得B的所有的属性、方法、
特别的,父类中声明的私有的属性或方法,子类继承后,仍然可以获取,但由于封装性的问题,可能不能直接调用
子类继承父类后,还可以功能扩展
规定:
一个父类可以有多个子类;
一个子类只能有一个父类 (单继承);
可以多层继承;
子类继承父类后,可以使用直接父类和间接父类的功能;
Object 类
如果没有显示的声明一个类的父类的话,则此类继承于java.lang.Object
类
Debug
如何调试程序?
1、短的时候加syso
2、设置断点
方法的重写
子类继承父类的方法之后,可以在子类中重写方法体(方法名和参数不变)
方法的重载与重写?
1、概念?
2、规则?
3、重载:不表现为多态性;
重写:表现为多态性;
重写的规定:
方法的声明: 权限修饰符 返回值类型 方法名(形参列表)throws 异常的类型{ //方法体 }
1、子类重写的与父类中的方法名和参数列表一样
2、子类重写的方法的权限修饰符不小于父类中被重写的
>> 特殊情况:子类不能重写父类中私有权限的方法
3、返回值类型:
>> 父类被重写的方法的返回值是void,子类重写的方法也只能是void
>> 父类被重写的方法的返回值是A类型,则子类重写的方法的返回值类型可以是A类或A类的子类
>> 父类被重写的方法的返回类型是基本数据类型,则子类必须相同
4、子类重写的方法抛出的异常类型 不大于 父类被重写的方法抛出的异常类型
子类和父类中同名同参数的方法,要么都声明为非static(考虑重写),要么都是static(不是重写)
super 关键字
可以理解为:父类的
可以调用:属性,方法,构造器,
调用属性方法时:不重名的时候一般可省略
子类重写后一般调用的是子类的,但是可以使用super.属性
或者super.方法
表明调用的是父类的
调用构造器的时候:
可以在子类的构造器中显示的使用super(形参列表)
的方式,调用父类声明的构造器
必须在首行
在类的构造器中,this(形参列表)
和super(形参列表)
只能二选一,不能同时出现
若没有显示,则默认调用的是父类中的空参构造器:super
在类的多个构造器中,至少有一个用了super(形参列表),不能全是this
继承和super的课后练习 ?
(this 和super区别练习)?
多态性(?)
理解:一个事物的多种形态
对象的多态性: Person p=new man();
父类的引用指向子类的对象(子类的对象赋给父类的引用);
当调用子父类同名同参的方法时,编译时只能调用父类,但运行时实际执行的是子类重写父类的方法;(编译看左,执行看右)
使用前提:
类的继承关系;方法的重写;
只适用于方法,不适用于属性;
虚拟方法调用
向下转型的使用
多态的逆过程
使用强制类型转换符 ()
可能出现ClassCastException异常,使用instanceof关键字进行判断
向上转型:多态
instanceof关键字
格式:a instanceof A
判断对象a是否是类A的实例。如果是,返回true,如果不是,返回false
为了避免出现ClassCastException异常,所以使用instanceof,一旦返回true ,就向下转型,若返回false,则不转
若 a instanceof A 返回true, a instanceof B也 返回true,则类B是类A的父类
Object类
Object 类是所有类的根父类
Object类的功能具有通用性
只声明了一个空参构造器
方法:
equals()
toString()
getClass()
......
equals()
1、==和equals()的区别?
1.1 ==运算符
如果比较的是基本数据类型,比较的是变量保存的数据是否相等(不一定类型要相同)
如果比较的是引用数据类型,比较的是地址值,即两个引用是否指向同一个对象实体
使用时左右两边类型必须一致
1.2 equals()
只适用引用数据类型;
在object类中,与== 相同;
像String Data File 包装类等都重写了equals(),重写后比较的是两个对象的“实体内容”是否相同;
2、自定义类的equals()如何重写?
2.1 手动重写
2.2 自动生成
例:
public boolean equals(Object obj)
{
if(this==obj)
{
return true;
}
if(obj instanceof Customer)
{
Customer cust = (Customer)obj;
if(this.age ==cust.age && this.name.equals(cust.name))
{
return true;
}
else
{
return false;
}
}
return false;
}
注:x.equals(null)
永远返回false
toString()
当我们输出一个对象的引用时,实际上就是调用当前帝乡的toString()
像String Data File 包装类等都重写了toString(),返回实体内容
自定义类也可以重写toString()方法
可自动生成
@Override
public String toString() {
return "Customer [name=" + name + ", age=" + age + "]";
}
单元测试(?)
步骤:
包装类(Wrapper)
提供8种基本类型对应的包装类
为了使基本数据类型具有类的特征
基本类型、包装类与String类之间的转换
1、基本类型----> 包装类
int num1=10;
//System.out.println(num1.toString); 错误
Integer in1=new Integer(num1);
System.out.println(in1.toString());
Integer in2=new Integer("123");
System.out.println(in2.toString());
Float f1=new Float(12.2f);
Float f1=new Float("12.2");
System.out.println(f1);
System.out.println(f2);
Boolean b1=new Boolean(true);
Boolean b2=new Boolean("True");
Boolean b3=new Boolean("true123");
System.out.println(b3); //false
2、包装类---->基本数据类型
3、基本数据类型、包装类—>String类型
方式1:连接运算 String str1=num1+" ";
方式2:调用String的valueOf(Xxx xxx) String str2=String.valueOf(f1);
4、String类型—>基本数据类型、包装类
调用包装类的parseXxx(String s)
格式:int num1=Integer.parseInt(str1);
格式:boolean b1=Integer.parseBoolean(str1);
自动装箱 与 自动开箱 (基本数据类型<—>包装类)
//1、自动装箱: 基本类型---->包装类
int num1=10;
Ineger in1=num1;
boolean b1=true;
Boolean b2=b1;
//2、自动开箱: 包装类---->基本数据类型
int num3=in1;