继承:
1.顾名思义,继承就是“is a”的关系。就是某个东西得到另外一个东西的(属性)和(方法)!在java中就是一个类属于某个类的子类。
/*如果父类中的某个属性用private 关键字进行修饰之后,那这个属性或这是方法就不能被子类所继承。*/
2.继承的语法规则。
public class Animal {
public int age = 10;
public String name;
public void eat() {
System.out.println("动物具有吃东西的能力。");
}
public Animal() {
System.out.println("Animal类执行了!");
//age = 20;
}
}
public class Dog extends Animal {
public int age = 20;
public void eat() {
System.out.println("狗具有吃东西的能力!");
}
public Dog() {
System.out.println("Dog类执行了!");
}
public void method() {
eat();
}
//Dog类代码并不完整!!!!
在上述代码中,就是Dog类继承Animal这个父类!
class 子类名 extends 父类名 {...........}
加上extends关键字,两个类之间的继承关系就成立了!
3.子类方法的重写。
如果对父类的方法不满意,可以在子类中重写此方法,在调用方法是会优先调用子类的方法。
方法重写的语法规则:
返回值类型;
方法名;
参数类型及其个数;
都要与父类方法相同才可以。
4.继承时的初始化顺序。
先初始化父类再初始化子类。
先执行初始化对象的属性,再执行构造方法中的初始化!
5.final关键字的使用。
final可以修饰类,属性,方法,变量。
final 就是不可修改不可变化。final修饰类,则该类不能被继承。
final修饰方法,则该方法不允许被覆盖(重写)。
final修饰属性,则该类的属性就不会被进行隐式初始化(类的属性初始化必须有值)
或在构造方法中被初始化(赋值)(只能任选其一)。
final修饰变量,则该变量就只能被赋值一次,即变为常量。
6.继承中super关键字的使用。
在继承中会经常用到super关键字来简化代码。
访问父类的属性:
super.属性名;
访问父类的方法:
super.方法名;
super应用:子类的构造过程当中必须调用其父类的构造方法。
public class Dog extends Animal {
public int age = 20;
public void eat() {
System.out.println("狗具有吃东西的能力!");
}
public Dog() {
super();
System.out.println("Dog类执行了!");
}
public void method() {
eat();
}
在Dog()的构造方法中,正因为有super()才会调用父·类的构造方法。但是就算程序里不写super(),运行的的时候依然会调用父类的构造方法。因为在继承的子类程序中系统会隐式的写上super(),所以这里写不写super()它都会调用父·类的构造方法。
如果想要显示,那么super()就要放在子类构造方法中的第一行。
(如果子类的构造方法中既没有显示调用父类的构造方法,而父类又没用无参的构造方法,就会编译错误!)
7.Object类
Obuject是所有类的父类,在一个类没有明确用extends关键字指明与另外一个类的关系时,那么系统默认它为Object的子类!
Object类是所有类的子类,它的方法也同样适用于所有类。
常见的方法有toString()方法。返回对象的 haxicode码。haxicode码就是一个对象的储存地址字符串化。比如:
public class Initail {
public static void main(String[] args) {
Dog dog = new Dog();
Dog dog2 = new Dog();
dog.age = 15;
dog2.age = 15;
/*if(dog.equals(dog2)) {
System.out.println("两个对象是相同的");
} else {
System.out.println("两个对象并不相等");
}*/
System.out.println(dog);
}
test2.Dog@3c679bde 这个就是haxicode码是dog这个对象的地址。
equals()方法。
equals()方法类似 “==”。
public class Initail {
public static void main(String[] args) {
Dog dog = new Dog();
Dog dog2 = new Dog();
dog.age = 15;
dog2.age = 15;
if(dog.equals(dog2)) {
System.out.println("两个对象是相同的");
} else {
System.out.println("两个对象并不相等");
}
}
}
如果我单独用equal()方法来判断dog和dog2对象是否相等,结果是不相等的。
因为直接用equal()方法进行比较,比较的是dog对象和dog2对象的地址,可他们的地址是肯定不相等啊!
所以要单独写equal()方法。
public class Dog extends Animal {
public int age = 20;
public void eat() {
System.out.println("狗具有吃东西的能力!");
}
public Dog() {
super();
System.out.println("Dog类执行了!");
}
public void method() {
eat();
}
@Override
public boolean equals(Object obj) {
if (this == obj) //看两个引用的值是否相同(地址是否相同)!
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())//判断两个类的类型是否相同!
return false;
Dog other = (Dog) obj;
if (age != other.age)//两个对象的属性值是否相同!
return false;
return true;//这样就可以判断两个对象是否相同了。
}
}
这样在执行原代码结果就是相同的了!
if (getClass() != obj.getClass())//判断两个类的类型是否相同!
getClass()是可以得到一个类对象。这个有区别于Dog dog = new Dog();这种类的对象。
类对象描述的是类的代码信息;类的对象更关注类的属性值的信息,简言之就是数据信息!