继承
继承是面向对象编程的三大特征之一。继承让我们更加容易实现类的扩展。实现代码的 重用,不用再重新发明轮子(don’t reinvent wheels)。
继承的主要作用:
- 代码复用,更容易实现类的扩展
- 方便建模
继承的俩个特性:
- 单根性:一个子类只能有一个直接的父类
- 传递性:A类的非私有属性或方法可以传递给子类B,再传递给子类C
Java中类是单继承的,接口是多继承的
子类继承父类,可以得到父类的全部属性和方法 (除了父类的构造方法),但不见 得可以直接访问(比如,父类私有的属性和方法)。
如果定义一个类时,没有调用 extends,则它的父类是:java.lang.Object。
在Java中,使用extends关键字来实现子类继承父类。例如:动物是哺乳动物和爬行动物的父类。
package com.bjsxt.inherit;
public final class animal {
public static void main(String[] args) {
Taidi t=new Taidi();
t.dog.shout();
t.dog.height=101;
}
}
/*final*/ class Dog{
int height;
public void shout(){
System.out.println("你在狗叫什么");
}
}
class Taidi extends Dog{
Dog dog=new Dog();
}
instanceof运算符
instanceof 是二元运算符,左边是对象,右边是类;当对象是右面类或子类所创建对 象时,返回 true;否则,返回 false。
final关键字
修饰变量:被他修饰的变量不可改变。一旦赋了初值,就不能被重写赋值。
修饰方法:该方法不可被子类重写,但是可以被重载。
修饰类:修饰 的类不能被继承。
Object类基本特性
1.Object类是所有类的父类,所有的Java对象都拥有Object类的属性和方法。
2.如果在类的声明中未使用extends,则默认继承Object类。
toString方法
toString ()方法:输出内容是一个字符串,即完整的包名+类名+@+十六进制的哈希码值
Object 类中定义有 public String toString()方法,其返回值是 String 类型。Object 类中 toString 方法的源码为:
对上述代码实现:
package com.bjsxt.inherit;
import java.util.DoubleSummaryStatistics;
public class Person extends Object{
String name;
int height;
public void rest(){
System.out.println("休息!");
}
public Person getFriends(){
return new Person();
}
public String toString(){
return "名字是"+name+",身高,"+height;
}
public static void main(String[] args) {
Student s=new Student("张三",180,90);
System.out.println(s instanceof Person );
s.rest();
System.out.println(s.toString());
}
}
class Student extends Person{
int score;
public void study(){
System.out.println("学习"+name);
}
public void rest(){
System.out.println("回宿舍睡会!");
}
Student(String name,int height,int score){
this.score=score;
this.name=name;
this.height=height;
}
}
class Employee extends Person{
public void rest()
{
System.out.println("办公区休息");
}}
class Teacher{
int teacherId;
Person person=new Person();
Teacher(int TeacherId,String name,int height){
this.teacherId=teacherId;
}
}
方式重写 override
子类重写父类的方法,可以用自身行为替换父类行为。重写是实现多态的必要条件。
方式重写需要符合下面的三个要点:
- “==”:方法名、形参列表相同。
- “<=”:返回值类型和声明异常类型,子类小于等于父类。
- “>=”:访问权限,子类大于父类。
equals方法
equals() 提供定义“对象内容相等”的逻辑。比如,我们在公安系统中认为 id 相同的 人就是同一个人、学籍系统中认为学号相同的人就是同一个人。
上述方法实现:
package com.bjsxt.inherit;
import java.util.Objects;
public class User {
int id;
String name;
String pwd;
User (int id,String name,String pwd){
this.id=id;
this.name=name;
this.pwd=pwd;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return id == user.id &&
Objects.equals(name, user.name) &&
Objects.equals(pwd, user.pwd);
}
@Override
public int hashCode() {
return Objects.hash(id, name, pwd);
}
public static void main(String[] args) {
User u1=new User(1001,"WJH","123321");
User u2=new User(1002,"wjh","123321");
System.out.println(u1);
System.out.println(u2.toString());
System.out.println(u1==u2);//== 判断是不是同一个对象
System.out.println(u1.equals(u2));
}
}
super关键字
super在Java中指代父类,只能出现在子类中。
作用:
- 访问父类的非私有属性,其调用格式: super.属性名;
- 访问父类的非私有方法,其调用格式为:super.方法名;
super“可以看做”是直接父类对象的引用。可通过 super 来访问父类中被子类覆盖的 方法或属性。
代码实操:
package com.bjsxt.text;
import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;
import org.w3c.dom.ls.LSOutput;
public class Text1 {
public static void main(String[] args) {
System.out.println("开始创造一个ChildClass对象....");
new ChildClass2();
}
}class FatherClass1{
public FatherClass1(){
System.out.println("创建FatherClass");
}
FatherClass1(int a){
}
}
class ChildClass2 extends FatherClass1{
public ChildClass2(){
super(3);
System.out.println("创建Child Class");
}
}
IDAE快捷键