小编这次要给大家分享的是用代码实例解析Java面向对象之继承性,文章内容丰富,感兴趣的小伙伴可以来了解一下,希望大家阅读完这篇文章之后能够有所收获。
A类继承B类,是指A类可以拥有B类的非私有属性和方法,同时A类也可以自己定义属性方法或重写方法以扩充自己的功能。
重写方法时,方法的方法名、返回值类型和参数个数及类型均需一致。
首先定义父类Animal,包含年龄、名字两个属性及吃的方法。
public class Animal {
int age;
String name;
public void eat(){
System.out.println("动物可以吃东西");
}
}
通过子类Dog继承父类Animal,并重写eat方法,在调用重写的eat方法之前,设置继承来的年龄属性值为10。
public class Dog extends Animal{
public void eat(){
System.out.println(age+"岁的狗狗可以吃东西");
}
public static void main(String[] args) {
Dog dog1 = new Dog();
dog1.age = 10;
dog1.eat();//10岁的狗狗可以吃东西
}
}
初始化即执行类的构造方法,在Java中,继承的初始化顺序如下:
父类的属性 > 父类的构造方法 > 子类的属性 > 子类的构造方法
public class Animal {
int age = 10;
public Animal(){
System.out.println("父类Animal执行了");
age = 20;
}
}
public class Dog extends Animal{
public Dog(){
System.out.println("子类Dog执行了");
}
public static void main(String[] args) {
Animal a = new Animal();
System.out.println(a.age);
Dog dog1 = new Dog();
}
}
运行结果如下图所示:
当使用final关键字后,变量就成了常量,值不能被改变;方法也不能被继承使用。
this关键字代表当前对象,this.属性代表操作当前对象的属性,this.方法代表调用当前对象的方法。
super在对象内部使用,代表父类对象。如果要调用父类的属性age,使用super.age;如果要调用父类的方法eat(),使用super.eat()。如下代码所示:
public class Dog extends Animal{
int age = 20;
public void eat(){
System.out.println(age+"岁的狗狗可以吃东西");
}
public Dog(){
System.out.println("子类Dog执行了");
}
public void method(){
super.eat();
}
public static void main(String[] args) {
Dog dog1 = new Dog();
dog1.method();//动物可以吃东西
}
}
子类构造的过程当中,必须调用其父类的构造方法。在子类的构造方法第一句隐式的写了一句super();。
public class Dog extends Animal{
int age = 20;
public Dog(){
super();//写与不写都一样,系统隐式调用
System.out.println("子类Dog执行了");
}
public static void main(String[] args) {
Dog dog1 = new Dog();
//父类Animal执行了
//子类Dog执行了
}
}
如果子类的构造方法中没有显示的调用父类的构造方法,则系统默认调用父类无参的构造方法。如果显示的调用构造方法,必须在构造方法的第一行。
所以,如果子类的构造方法中既没有显示的调用父类的构造方法,而父类又没有无参的构造方法,则编译出错。
Object类是所有类的父类,默认被所有类继承。
toString()方法返回对象的地址(即Hash码),如果要查看对象的属性及属性值,则可以重写toString()方法(通过eclipse菜单中source可自动生成)。
public class Dog extends Animal{
int age = 20;
@Override
public String toString() {
return "Dog [age=" + age + "]";
}
public static void main(String[] args) {
Dog dog1 = new Dog();
System.out.println(dog1.toString());//未重写方法前的结果:Dog@15db9742
System.out.println(dog1.toString());//Dog [age=20]
}
}
equals()方法比较的是两个对象的引用是否指向同一块内存地址。
public class Dog extends Animal{
public static void main(String[] args) {
Dog dog1 = new Dog();
Dog dog2 = new Dog();
if(dog1.equals(dog2)){
System.out.println("两个对象相同");
}else{
System.out.println("两个对象不同");
}
}
}
输出的结果是“两个对象不同”。如果仅需判断两个对象的属性值是否相等,可以通过eclipse重写equals方法。如下代码所示:
public class Dog extends Animal{
@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;
}
public static void main(String[] args) {
Dog dog1 = new Dog();
dog1.age = 15;
Dog dog2 = new Dog();
dog2.age = 15;
if(dog1.equals(dog2)){
System.out.println("两个对象相同");
}else{
System.out.println("两个对象不同");
}
}
}
最后输出结果是,两个对象相同。
看完这篇关于用代码实例解析Java面向对象之继承性的文章,如果觉得文章内容写得不错的话,可以把它分享出去给更多人看到。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。