类的继承
Java语言每个类只可以继承一个父类
所有类的构造方法第一行都有个隐藏的"super();"
作用是在执行该构造方法之前调用其父类构造方法
extends 继承
父类 没有任何变化
public class 父类类名{
}
子类 需要继承父类
public class 子类类名 extends 父类类名{
}
子类可以重写父类的方法
重写:返回参数相同 方法名相同 传入参数相同 只有方法体不同
package 第七章继承多态抽象;
public class Child extends Parent {
public Child () {
super();
System.out.println("Child的构造方法");
}
}
package 第七章继承多态抽象;
public class Parent {
public Parent() {
System.out.println("Parent类的构造方法");;
}
}
package 第七章继承多态抽象;
public class ExtendsTest {
public static void main(String[] args) {
// TODO 自动生成的方法存根
new Child();
}
}
package 第七章继承多态抽象;
public class Telephone { //电话类
String button="button:0-9"; //成员属性,10个按键
void call() { //拨打电话功能
System.out.println("开始拨打电话");
}
}
package 第七章继承多态抽象;
public class Mobile extends Telephone { //手机类继承电话类
String screen="screen:液晶屏"; //成员属性,液晶屏幕
}
package 第七章继承多态抽象;
public class Demo2 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Mobile motto=new Mobile();
System.out.println(motto.button); //子类调用父类属性
System.out.println(motto.screen); //子类调用父类没有的属性
motto.call(); //。子类调用父类方法
}
}
Object类
在开始学习使用class关键词定义类时,就应用到了继承原理,因为在Java中所有 Object类是比较特殊的类,它是所有类的父类, 是Java类层中的最高层类。
在Object类中,主要包括clone(),finalize(),equals(), toString()等方法,其中常用的俩个方法为equals()和toString()方法。由于所有的类都是Object类的子类,所以任何类都可以重写Object类中的方法。
Object类中的几种重要方法。
1.getClass()方法
getClass()方法是Object类定义的方法,它会返回对象执行的Class实例,然后使用此实例调用getName()方法可以取得类的名称。语法如下
getClass().getname();
可以将getClass()方法与toString()方法联合使用。
2.toString()方法
toString()方法的功能是将一个对象返回为字符串形式,它会返回一个String实例。在实际的应用中通常重写toString()方法,为对象提供一个特定的输出模式。当这个类转换为字符串或与字符串连接时,将自动调用重写的toString()方法。
package 第七章继承多态抽象;
public class Student {
String name;
int age;
public Student(String name,int age) {
this.name=name;
this.age=age;
}
public String toString() {
return"我叫"+name+",今年"+age+"岁。";
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
Student s1=new Student("张三",16);
System.out.println(s1);
Student s2=new Student("李四",19);
System.out.println(s2);
}
}
3.
equals()方法
package 第七章继承多态抽象;
public class People {
int id; //身份证号
String name; //名字
public People(int id,String name) {
this.id=id;
this.name=name;
}
public boolean equals(Object obj) { //重写Object类的equals()方法
if(this==obj) //如果参数与本类是同一个对象
return true;
if(obj==null) //如果参数是null
return false;
if(getClass()!=obj.getClass()) //如果参数与本类类型不同
return false;
People other=(People)obj; //将参数强转成本类对象
if(id!=other.id) //如果俩者的身份证号不相等
return false;
return true;
}
public String toString() { //重写Object类的toString()方法
return name; //只输出名字
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
People p1=new People(220,"tom");
People p2=new People(220,"汤姆");
People p3=new People(330,"张三");
Object o=new Object();
System.out.println(p1+"与"+p2+"是否为同一人?");
System.out.println("equals()方法的结果:"+p1.equals(p2));
System.out.println("==运算符的结果:"+(p1==p2));
System.out.println();
System.out.print(p1+"与"+p3+"是否为同一人?");
System.out.println(p1.equals(p3));
System.out.print(p1+"与"+o+"是否为同一人?");
System.out.println(p1.equals(o));
}
}
对象类型的转换
对象类型的转换在java编程中遇到,主要包括向上转型和向下转型操作 本届将详解讲解对象类型转换的内容
向上转型
向上转型可以理解为将子类类型的对象转换为父类类型的对象,即把子类类型的对象直接赋值给父类类型的对象进而实现按照父类描述子类的效果
向上转型:将子类的对象赋值给父类的对象引用
自动类型转换
Animal a=new Animal();
自动类型转换
构建一个Animal的对象 赋值给Animal的a;
向下转型:将父类的对象赋值给子类对象引用
向下转型的时候需要进行强制类型转换
强制类型转换
Dog a=(Dog)new Animal();
使用instanceof关键字来判断对象属性
对象名instanceof 类名
判断对象是否属于一个类或其子类
package 第七章继承多态抽象;
class Quadrangle{}
class Square extends Quadrangle{}
class Circular{}
public class Demo5 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Quadrangle q=new Quadrangle(); //四边形对象
Square s=new Square(); //正方形对象
System.out.println(q instanceof Square);//判断四边形是否为正方形的子类
System.out.println(s instanceof Quadrangle);//判断正方形是否为四边形的子类
//判断正方形是否为圆形的子类
}
}
方法的重载
方法名相同 参数不同
构造方法的名称是由类名决定,所以构造方法只有一个格名称。 如果希望以不同的方式俩实例化对象,就需要使用u东哥构造方法来完成 由于这个构造方法都需要根据类名进行命名 为了让方法名相同 而形参不同的构造方法同时存在必须用到方法重载 虽然方法重载起源与构造方法 但是它可以应用在其他方法中
package 第七章继承多态抽象;
public class OverLoadTest {
public static int add(int a,int b) { //定义一个方法
return a+b;
}
public static double add(double a,double b) { //与第一个方法名称相同,参数类型不同
return a+b;
}
public static int add(int a) { //与第一个方法参数个数不同
return a;
}
public static int add(int a,double b) { //先int参数,后double参数
return a; //输出int 参数值
}
public static int add(double a,int b) { //先double参数,后int参数
return b; //输出int 参数值
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
System.out.println("调用add(int,int)方法:"+add(1,2));
System.out.println("调用add(double,double)方法:"+add(2.1,3.3));
System.out.println("调用add(int)方法:"+add(1));
System.out.println("调用add(int,double)方法:"+add(5,8.0));
System.out.println("调用add(double,int)方法:"+add(5.0,8));
}
}
package 第七章继承多态抽象;
public class OverLoadTest2 {
public static int add(int a,int b) {
return a+b;
}
public static double add(double a,double b) {
return a+b;
}
public static int add(int a) {
return a;
}
public static int add(int a,double b) {
return a;
}
public static int add(double a,int b) {
return b;
}
public static int add(int... a) { //定义不定长参数方法
int s=0;
for(int i=0;i<a.length;i++) { //根据参数个数做循环操作
s+=a[i]; //将计算结果返回
}
return s;
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
System.out.println("调用add(int,int)方法:"+add(1,2));
System.out.println("调用add(double,double)方法:"+add(2.1,3.3));
System.out.println("调用add(int)方法:"+add(1));
System.out.println("调用add(int,double)方法:"+add(5,8.0));
System.out.println("调用add(double,int)方法:"+add(5.0,8));
//调用不定长参数方法
System.out.println("调用不定长参数方法:"+add(1,2,3,4,5,6,7,8,9));
System.out.println("调用不定长参数方法:"+add(1));
}
}
final关键字
final修饰方法-----该方法不可以被重写
final修饰类-----该类不能被继承
final被译为”最后的“”最终的“final时java语言中的关键字 凡是被final关键字修饰过的内容都是不可改变的
final关键字用于修饰常量
final关键字可用于声明变量,一旦该变量被设定 就不可以在改变该变量的值。通常由final定义的变量为常量如以下语句
final double PI=3.14;
final方法
将方法定义为final类型,可以防止子类修改父类的定义与实现方式, 同时定义为final的方法执行效率要高于非final方法 。在需要时股权哑巴宣布这个i部分曾经提到过private修饰符, 如果一个父类的某个方法被设置为private, 子类将无法访问该方法,自然无法覆盖该方法,也就是说,一个定义为private的方法隐式被指定为final类型,因此无需将一个定义为private的方法在定义为final类型语法如下
定义为final的类不能被能继承 如果希望一个类不被任何类继承,并且不允许其他人对这个类进行任何改动 可以将这个类设置为final类 final类语法如下
final类
定义为final的类不能被能继承 如果希望一个类不被任何类继承,并且不允许其他人对这个类进行任何改动 可以将这个类设置为final类 final类语法如下
final 类名{}
如果设置为final类,则该类中的所有方法都被影视设置为final方法, 但是final类中成员可以被定义为final或非final形式。
多态
利用多态可以使程序具有良好的扩展性,并可以对所有类对象进行通用的处理。
假如现在要编写一个绘制图形的方法draw(),如果传入正方形对象就绘制正方形,如果传入圆形对象就绘制圆形,这种场景可以使用重载来实现,定义如下
public void draw(Square s){ //绘制正方形的方法
}
public void draw(Circular){ //绘制圆形的方法
}
package cjj;
class Shape{} //图形类
class square extends Shape{} //正方形类继承图形类
class circular extends Shape{} //圆形类继承图形类
public class Demo6 {
public static void draw(Shape s) { //绘制方法
if(s instanceof square) { //如果是正方形
System.out.println("绘制正方形");
}else if (s instanceof circular) { //如果是圆形
System.out.println("绘制圆形");
}else { //如果是其他类型
System.out.println("绘制父类图形");
}
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
draw(new Shape());
draw(new square());
draw(new circular());
}
}