文章目录
1. 类的继承
子类可以继承父类原有的属性和方法,也可以增加原来父类不具备的属性和方法,或者直接重写父类中的某些方法。
在继承中,还有一种特殊的重写方式,子类与父类的成员方法返回值、方法名称、参数类型及个数完全相同,唯一不同的是方法实现内容,这种特殊的重写方式被称为重构。
1.1 extends关键字
例子:
首先,创建一个Computer类:
package JAVALearining;
public class Computer {//父类 电脑
String screen = "液晶显示屏"; //成员属性
void startUp() {
System.out.println("电脑正在开机,请稍等……"); //成员方法
}
}
然后,创建一个Pad类,继承Computer类:
package JAVALearining;
public class Pad extends Computer{//子类 平板电脑
}
然后,再创建一个Demo类,实例化Computer类和Ipad类,并输出电脑的显示屏信息:
package JAVALearining;
public class Demo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Computer com = new Computer();
Pad ipad =new Pad();
System.out.println(com.screen);
}
}
得到结果:
液晶显示屏
同样,使用子类调用父类的方法,可以得到:
package JAVALearining;
public class Demo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Computer com = new Computer();
Pad ipad =new Pad();
System.out.println(com.screen);
com.startUp();
System.out.println(ipad.screen);
ipad.startUp();
}
}
结果:
液晶显示屏
电脑正在开机,请稍等……
液晶显示屏
电脑正在开机,请稍等……
下面,为ipad子类添加特有的属性和方法:
package JAVALearining;
public class Pad extends Computer{//子类 平板电脑
String battery = "5000毫安电池";
void open3G() {
System.out.println("打开3G网络……");
}
}
在Demo中输出相关的属性和方法:
package JAVALearining;
public class Demo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Computer com = new Computer();
Pad ipad =new Pad();
ipad.open3G();
System.out.println(ipad.battery);
}
}
得到结果:
打开3G网络……
5000毫安电池
注意:子类没有权限调用父类中被修饰为private的方法,只可以调用父类中修饰为public和protected的成员方法。
1.2 方法的重写
重写(还可以称为覆盖)就是子类中将父类的成员方法的名称保留,重写成员方法的实现内容,更改成员方法的存储权限,或是修改成员方法的返回值类型。
我们分别在Computer类和Ipad类中增加一个showPicture方法,并在ipad类中对方法进行重写:
void showPicture() {
System.out.println("台式机电脑:双击打开图片。");
}
void showPicture() {
System.out.println("平板电脑:用手指点击触摸屏。");
}
在Demo中调用computer类和ipad类中showPicture方法:
package JAVALearining;
public class Demo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Computer com = new Computer();
Pad ipad =new Pad();
com.showPicture();
ipad.showPicture();
}
}
得到结果:
台式机电脑:双击打开图片。
平板电脑:用手指点击触摸屏。
1.3 super关键字
分别在Computer类和Pad类中添加sayHello方法:
String sayHello() {
return "欢迎使用";
}
String sayHello() {
return "欢迎使用"+"平板电脑";
}
在Demo中调用computer类和ipad类中sayHello方法:
package JAVALearining;
public class Demo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Computer com = new Computer();
Pad ipad =new Pad();
System.out.println(com.sayHello());;
System.out.println(ipad.sayHello());
}
}
得到结果:
欢迎使用
欢迎使用平板电脑
如果将父类中的“欢迎使用”改为“welcome”,因为子类重写了方法,不会改变。如果想改变的话,可以在子类调用原有方法:
父类:
String sayHello() {
return "welcome to use";
}
子类:
String sayHello() {
return super.sayHello()+"平板电脑";
}
Demo:
package JAVALearining;
public class Demo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Computer com = new Computer();
Pad ipad =new Pad();
System.out.println(com.sayHello());;
System.out.println(ipad.sayHello());
}
}
结果:
welcome to use
welcome to use平板电脑
public class Pad extends Computer{//子类 平板电脑
String battery = "5000毫安电池";
public Pad() {
super(); //调用父类方法 初始化,注意必须放在第一行
this.screen = super.screen; //调用父类屏幕属性
}
void open3G() {
System.out.println("打开3G网络……");
}
void showPicture() {
System.out.println("平板电脑:用手指点击触摸屏。");
}
String sayHello() {
return super.sayHello()+"平板电脑";
}
}
2. Object类
在Java中,所有的类都直接或间接继承了java.lang.Object类。Object类是比较特殊的类,它是所有类的父类,是Java类层中的最高层类。用户创建一个类时,除非已经指定要从其他类继承,否则它就是从java.lang.Object类继承而来的。
2.1 getClass()方法
是Object类定义的方法,它会返回对象执行时的Class实例。语法如下:
getClass().getname();
package JAVALearining;
public class NewDemo {
public static void main(String[] args) {
Object[] arr = new Object[4];
arr[0] = new Object();
arr[1] = new String("字符串");
arr[2] = new Integer(3);
arr[3] = new NewDemo();
for(Object obj:arr) {
System.out.println(obj.getClass().getName());
}
}
}
得到结果:
java.lang.Object
java.lang.String
java.lang.Integer
JAVALearining.NewDemo
2.2 toString()方法
将一个对象返回为字符串形式,它会返回一个String实例。
public class NewDemo {
public static void main(String[] args) {
Object[] arr = new Object[4];
arr[0] = new Object();
arr[1] = new String("字符串");
arr[2] = new Integer(3);
arr[3] = new NewDemo();
for(Object obj:arr) {
System.out.println(obj.toString());
}
}
}
得到结果:
java.lang.Object@4361bd48
字符串
3
JAVALearining.NewDemo@53bd815b
因为没有重写,所以最后一个返回的是类。下面重写一下:
public class NewDemo {
public static void main(String[] args) {
Object[] arr = new Object[4];
arr[0] = new Object();
arr[1] = new String("字符串");
arr[2] = new Integer(3);
arr[3] = new NewDemo();
for(Object obj:arr) {
System.out.println(obj.toString());
}
}
@Override //输入toString,然后Alt+/
public String toString() {
// TODO Auto-generated method stub
return "我是Demo类";
}
}
得到结果:
java.lang.Object@4361bd48
字符串
3
我是Demo类
2.3 equals()方法
比较两个对象是否相等,主要比较的是两个对象的地址是否相等。
首先,创建Person类,并将对象强制转换成Person类,设置判断相同的条件:
public class Person {
String name;
String id;
@Override
public boolean equals(Object obj) {
Person p = (Person) obj; //强制转换成人类对象
boolean b1 = this.name.equals(p.name);
boolean b2 = this.id.equals(p.id);
return b1&&b2;
}
}
然后,在Demo类中输入对象的信息:
public class Demo {
public static void main(String[] args) {
Person p1 = new Person();
Person p2 = new Person();
Person p3 = new Person();
p1.name = "小明";
p1.id = "123";
p2.name = "小红";
p2.id = "123";
p3.name = "小明";
p3.id = "456";
System.out.println(p1.equals(p2));
System.out.println(p2.equals(p3));
System.out.println(p1.equals(p3));
}
}
执行结果如下:
false
false
false
如果将p3的信息进行修改:
p3.name = "小明";
p3.id = "123";
得到结果:
false
false
true