网站建设技术合作合同,如何建企业仢网站,西安广告公司,特大新闻凌晨刚刚发生看到这句话的时候证明#xff1a;此刻你我都在努力 加油陌生人 个人主页#xff1a;Gu Gu Study专栏#xff1a;一步一步了解Java 喜欢的一句话#xff1a; 常常会回顾努力的自己#xff0c;所以要为自己的努力留下足迹 喜欢的话可以点个赞谢谢了。 作者#xff1a;小闭 …看到这句话的时候证明此刻你我都在努力 加油陌生人 个人主页Gu Gu Study专栏一步一步了解Java 喜欢的一句话 常常会回顾努力的自己所以要为自己的努力留下足迹 喜欢的话可以点个赞谢谢了。 作者小闭 继承的概念以及继承存在的意义 Java中的继承是一种面向对象编程OOP的基本概念它允许一个类称为子类或派生类继承另一个类称为父类或基类的属性和方法。继承提供了一种机制使得子类可以扩展或修改父类的行为。 意义 首先继承是面向对象编程的核心特性之一它体现了面向对象设计的原则如封装、抽象、继承和多态。其次继承可以提高代码的复用率让子类继承运用到父类的一些数据和方法。还可以实现多态使一个接口呈现不同的功能实现。还有实现程序的扩展性可以在一个代码的基础上进行扩展等等功能。当然继承还有好多意义这里使列举不完的。 子类继承
讲到继承我们首先还是先了解子类那么子类和父类如何分辨还有如何继承接下来都会讲到我们先看一下下面的代码 在这段代码中Animal为父类Dog是子类首先我们在生活中的逻辑上就是狗一定是动物而动物不一定是狗这就说明动物的范围更大所以Animal是父类Dog是子类。然后再从语法上分析首先我们看到extends这个关键字那么这个就代表继承那么我们看到一个类使用了这个关键字就说明它就是这个关键字后面那个类的子类extends后面的就是父类。比如 ** class Dog extends Animal{}**那么Dog就为子类Animal就是父类。
public class Animal {String type;int age;public void eat(){System.out.println(吃食物);}public void speak(){System.out.println(发出叫声);}}class Dog extends Animal{String name;public Dog(String name){type狗;this.namename;System.out.println(他是一只type 它的名字为:name);}public static void main(String[] args) {Dog dognew Dog(旺财);dog.speak();dog.eat();}}然后我们从上面的代码中也是发现子类能够使用父类的成员变量或给其赋值也可以调用父类的成员方法。
然后我们进入到第二个知识点如果父类中包含构造方法时子类要不要也定义一个构造方法如何构造那会不会与父类的构造方法冲突呢我们接下来往下看
public class Animal {String type;int age;
public Animal(String type,int age){this.typetype;this.ageage;}public void eat(){System.out.println(吃食物);}public void speak(){System.out.println(发出叫声);}}class Dog extends Animal{String name;public Dog(String type, int age, String name) {super(type, age);this.name name;}public static void main(String[] args) {Dog dognew Dog(狗,2,旺财);System.out.println(他是一只dog.type 它的名字为:dog.name);dog.speak();dog.eat();}}如上我们这次在父类加上构造方法那么我们就必须在子类里先完成父类的构造方法否则编译器会报错 那么该如何正确的定义子类的构造方法呢 那就是像上面的代码一样使用super关键字。 那么接下来我们就来了解一下super关键字。
super
super关键字在我现学的阶段有两个作用
访问父类成员当你在子类中重写了父类的方法或访问了父类的属性时你可以使用super来明确地调用父类中的版本。例如
复制
class Parent {void show() {System.out.println(Parents show());}
}class Child extends Parent {void show() {super.show(); // 调用父类的show()方法System.out.println(Childs show());}
}调用父类的构造方法在子类的构造方法中你可以使用super()来调用父类的构造方法。这通常在构造方法的第一行进行以确保在子类对象的初始化过程中父类的状态也被正确地初始化。
class Parent {Parent() {System.out.println(Parents constructor);}
}class Child extends Parent {Child() {super(); // 调用父类的构造方法System.out.println(Childs constructor);}
}第二点就是我所说的可以调用父类构造方法注意super的调用必须在第一位。 然后现在回过头来是不是就发现上面的代码就可以理解了 super和this的对比
相同点
都是Java中的关键字。都只能在类的非静态方法里使用用来访问类的非静态成员方法或成员变量。他们都要放在方法的第一句这就注定他们不能同时出现在一个方法里。
不同点
this关键字 this指的是当前对象的引用。它用于当前对象的方法或构造方法中来引用当前对象的成员属性、方法。this可以用来调用当前类的其他构造方法使用this()语法。this可以用来区分成员变量和局部变量当它们具有相同的名称时。
示例
class Example {int value;Example(int value) {this.value value; // 使用this来引用当前对象的成员变量}void setValue(int value) {this.value value; // 使用this来明确区分成员变量和参数}
}super关键字 super指的是当前对象的直接父类对象的引用。它用于访问父类的成员特别是当子类重写了父类的方法或变量时。super用于调用父类的构造方法使用super()语法。super可以用来引用父类的类型这在泛型和继承中特别有用。
示例
class Parent {void show() {System.out.println(Parents show());}
}class Child extends Parent {void show() {super.show(); // 调用父类的方法}Child() {super(); // 调用父类的构造方法}
}总结区别
this是指向当前对象的引用。super是指向当前对象的父类对象的引用。this用于引用当前类的成员或调用其他构造方法。super用于引用父类的成员或调用父类的构造方法。this通常用于当前类的作用域内。super通常用于子类中与父类交互。 代码块的初始化与构造方法实现的先后顺序
那么现在我们了解一下代码块。代码块分为静态代码块和示例代码块总所周知代码块和构造方法都可以给对象的成员赋值那么他们赋值的顺序我们真的了解吗接下来我们就可以来探索一下。 静态代码块 说到静态那么我们肯定要有static关键字了我们来看一下这段代码 中间的static的花括号里的就是静态代码块。 实例代码块 这样一个单独的花括号或者没有花括号都算是实例代码块。 然后构造方法大家都是知道的。
public Test(){System.out.println(执行了构造方法);}那么他们执行的顺序是什么呢我们继续往下看代码
public class Test {String namehaha;int age18;static{System.out.println(执行了静态代码块);}public Test(){System.out.println(执行了构造方法);}{System.out.println(执行了实例代码块);}}class Main{public static void main(String[] args) {Test testnew Test();}}如上我们得出结论在一个类中我们的初始化顺序是 静态代码块----实例代码块----构造方法。
那么我们又联想到子类在实例化的时候会先实现父类的构造方法那么如果在子类中实例化的顺序又是怎样呢
public class Test {String namehaha;int age18;static{System.out.println(执行了父类的静态代码块);}public Test(){System.out.println(执行了父类的构造方法);}{System.out.println(执行了父类实例代码块);}}class Test1 extends Test{String type狗;static{System.out.println(执行了子类的静态代码块);
}public Test1(){System.out.println(执行了子类的构造方法);}{System.out.println(执行了子类的实例代码块);}}class Main{public static void main(String[] args) {Test test1new Test1();}}又如上面代码又得出一个结论 子类的初始化顺序为父类静态代码块----子类的静态代码块----父类的实例代码块----父类的构造方法 ----子类的实例代码块----子类的构造方法
文章已到末尾喜欢的话可以点个赞哦