JAVA面向对象—–super关键字

1:定义Father(父类)类

1:成员变量int x=1;

2:构造方法无参的和有参的,有输出语句

2:定义Son类extends Father类

1:成员变量int y=1;

2:构造方法无参和有参的。有输出语句this.y=y+x;

3:创建Son类对象

Son son=new Son(3);
System.out.println(son.y); //4

class Father {
int x = 1;
Father() {
System.out.println("这是父类无参构造");
}
Father(int x) {
this.x = x;
System.out.println("这是父类有参构造");
}
void speak() {
System.out.println("我是父亲");
}
} class Son extends Father {
int y = 1;
Son() {
System.out.println("这是子类的无参构造");
}
Son(int y) {
this.y = y + x;
System.out.println("这是子类的有参构造");
}
void run() {
super.speak(); // 访问父类的函数
System.out.println("我是儿子");
}
} class Demo6 {
public static void main(String[] args) {
Son s = new Son(3);
System.out.println(s.y);// 4
}
}
4:子类对象为什么可以访问父类的成员。
1:this.y=y+x;有一个隐式的super super.x 5:super关键字作用
1:主要存在于子类方法中,用于指向子类对象中父类对象。
2:访问父类的属性
3:访问父类的函数
4:访问父类的构造函数
6:super注意

this和super很像,this指向的是当前对象的调用,super指向的是当前调用对象的父类。Demo类被加载,执行main方法,Son.class加载,发现有父类Father类,于是Father类也加载进内存。类加载完毕,创建对象,父类的构造方法会被调用(默认自动无参),然后执行子类相应构造创建了一个子类对象,该子类对象还包含了一个父类对象。该父类对象在子类对象内部。this super只能在有对象的前提下使用,不能在静态上下文使用。

2:子类的构造函数默认第一行会默认调用父类无参的构造函数,隐式语句super();

1:父类无参构造函数不存在,编译报错。

Son(int y) {
//super();隐式语句
this.y = y + x;
System.out.println("这是子类的有参构造");
}
3:子类显式调用父类构造函数

在子类构造函数第一行通过super关键字调用父类任何构造函数。如果显式调用父类构造函数,编译器自动添加的调用父类无参数的构造就消失。构造函数间的调用只能放在第一行,只能调用一次。super()

和this()不能同时存在构造函数第一行。

Son(int y) {
super(y);// 子类显式调用父类构造函数
this.y = y + x;
System.out.println("这是子类的有参构造");
} Son(int y) {
this(); //不能同时存在构造函数第一行
super(y);
this.y = y + x;
System.out.println("这是子类的有参构造");
}
4:super思考

如果开发者自定义了一个类,没有显示的进行类的继承,那么该类中成员函数是否可以使用super关健健字?可以使用,继承了Object类,Object类是所有类的父类。

class Demo7 {
public void print(){
System.out.println(super.toString());
}
public static void main(String[] args){
new Demo7().print();
System.out.println();
}
}
5:继承练习

7:重写(Override)

1:定义Father类

1:姓名,吃饭方法,吃窝窝头。

2:定义Son类,继承Father

1:Son类中不定义任何成员,子类创建对象,仍然可以调用吃饭的方法。

2:父类的吃饭的方法,Son不愿吃。Son自己定义了吃饭的方法。

1:此时父类中有一个吃饭的方法,子类中有2个吃饭的方法,一模一样,只是方法体不一样。

2:一个类中两个函数一模一样,是不允许的。

1:编译运行,执行了子类的方法。

2:使用父类的方法,在子类方法中,使用super.父类方法名。

class Father {
String name; void eat() {
System.out.println("吃窝窝");
}
} class Son extends Father { public void eat() { // 继承可以使得子类增强父类的方法
System.out.println("来俩小菜");
System.out.println("来两杯");
System.out.println("吃香喝辣");
System.out.println("来一根");
}
} class Demo8 { public static void main(String[] args) {
Son s = new Son();
//执行子类的方法
s.eat(); }
}

3:该现象就叫做重写(覆盖 override)

1: 在继承中,子类可以定义和父类相同的名称且参数列表一致的函数,将这种函数

称之为函数的重写.

4:前提

1:必须要有继承关系

5:特点

1:当子类重写了父类的函数,那么子类的对象如果调用该函数,一定调用的是重写过后的函数。

可以通过super关键字进行父类的重写函数的调用。

2: 继承可以使得子类增强父类的方法

6:细节

1: 函数名必须相同

2:参数列表必须相同

3: 子类重写父类的函数的时候,函数的访问权限必须大于等于父类的函数的访问权限否则编译报错

4:子类重写父类的函数的时候,返回值类型必须是父类函数的返回值类型或该返回值类型的子类。不能返回比父类更大的数据类型: 如子类函数返回值类型是Object

    1:定义 A B  C 类 B extends A
2:Father类中定义A getA();
3:Son 类中重写getA(); 方法,尝试将返回值修改为B,C ,Object
1:B编译通过
2:C 编译失败 ,没有继承关系
3:Object编译失败,比父类的返回值类型更大
class A {

}

class B extends A {

}

class C {

}
class Father {
String name; void eat() {
System.out.println("吃窝窝");
} // 定义一个函数,获取A类的对象,
A getA() {
return new A();
} } class Son extends Father { public void eat() { // 继承可以使得子类增强父类的方法
System.out.println("来两杯");
System.out.println("来俩小菜");
super.eat();
System.out.println("来一根");
} // B类是A类的子类
B getA() {
return new B();
}
} class Demo8 { public static void main(String[] args) {
Son s = new Son();
s.eat(); }
}

7:子类对象查找属性或方法时的顺序:

原则:就近原则。

如果子类的对象调用方法,默认先使用this进行查找,如果当前对象没有找到属性或方法,找当前对象中维护的super关键字指向的对象,如果还没有找到编译报错,找到直接调用。

8:重载和重写的不同

1:重载(overload):

1:前提: 所有的重载函数必须在同一个类中

2:特点:函数名相同,参数列表不同,与其他的无关(访问控制符、返回值类型)

3:不同:个数不同 、 顺序不同、 类型不同

2:重写(override):

1:前提: 继承

2:特点:

函数名必须相同、参数列表必须相同。

子类的返回值类型要等于或者小于父类的返回值

9:重写练习

描述不同的动物不同的叫法

1:定义动物类

有名字,有吃和叫的方法

2:定义狗继承动物重写父类吃和叫的方法

3:定义猫继承动物重写父类吃和叫的方法

class Animal{
int x=1;
String name;
void eat(){
System.out.println("吃东西");
}
void shout(){
System.out.println("我是动物");
}
} class Dog extends Animal{ void eat(){
System.out.println("啃骨头");
}
void shout(){
System.out.println("旺旺");
}
void eat(String food){
System.out.println("吃:"+food);
}
}
class Cat extends Animal{ void eat(){
System.out.println("吃老鼠");
}
void shout(){
System.out.println("喵喵");
}
} class Demo9{ public static void main(String[] args){
Dog d=new Dog();
d.shout();
d.eat(); Cat c=new Cat();
c.shout();
c.eat();
System.out.println();
}
}

【正在看本人博客的这位童鞋,我看你气度不凡,谈吐间隐隐有王者之气,日后必有一番作为!下面有个“顶”字,你就顺手把它点了吧(要先登录CSDN账号哦 )】


—–乐于分享,共同进步!

—–更多文章请看:http://blog.csdn.net/duruiqi_fx


JAVA面向对象-----super关键字的更多相关文章

  1. JAVA面向对象-----final关键字

    JAVA面向对象-–final关键字 1:定义静态方法求圆的面积 2:定义静态方法求圆的周长 3:发现方法中有重复的代码,就是PI,圆周率. 1:如果需要提高计算精度,就需要修改每个方法中圆周率. 4 ...

  2. Java面向对象-static关键字、静态方法与普通方法、静态成员变量

    Java面向对象-static关键字.静态方法与普通方法 static关键字的基本作用:方便在没有创建对象的情况下来进行调用(方法/变量). 很显然,被static关键字修饰的方法或者变量不需要依赖于 ...

  3. [Java学习]面向对象-super关键字;final关键字

    super关键字 super代表的是当前子类对象中的父类型特征,可以看做是this的一部分.与this不同,不是引用,不存储对象内存地址. super可以用在什么位置 1 可以用在成员方法中.不能用在 ...

  4. Java面向对象之关键字super 入门实例

    一.基础概念 (一)super关键字 super关键字的用法和this相似.this代表的是当前对象.super代表的是父类中内存空间. 子父类中是不会出现同名属性的情况. (二)继承中.成员变量问题 ...

  5. Java面向对象重要关键字

    面向对象过程接触的重要关键字:extends   super   this   final   static  extends 关键字用作继承功能,可以申明一个类是从另外一个类继承而来的,一般形式如下 ...

  6. Java基础super关键字、final关键字、static关键字、匿名对象整理

    super关键字 10.1子父类中构造方法的调用 public class Test { public static void main(String[] args) { new Zi(); } } ...

  7. java之super关键字

    super关键字: 在java中使用super来引用基类的成分. 程序code: class FatherClass{ public int value; public void f(){ value ...

  8. java面向对象之关键字,权限修饰符

    1.关键字:this,static,package,importthis:1.表示对当前对象的引用!2.表示用类的成员变量,而非函数参数,注意在函数参数和成员变量同名是进行区分!其实这是第一种用法的特 ...

  9. Java中super关键字的作用与用法

    Java中的super是什么?java中的super关键字是一个引用变量,用于引用父类对象.关键字“super”以继承的概念出现在类中.主要用于以下情况: 1.使用super与变量:当派生类和基类具有 ...

随机推荐

  1. PHPCMS v9.6.0 任意文件上传漏洞分析

    引用源:http://paper.seebug.org/273/ 配置了php debug的环境,并且根据这篇文章把流程走了一遍,对phpstorm的debug熟练度+1(跟pycharm一样) 用户 ...

  2. [Codeforces 863E]Turn Off The TV

    Description Luba needs your help again! Luba has n TV sets. She knows that i-th TV set will be worki ...

  3. TopCoder SRM 558 Div 1 - Problem 1000 SurroundingGame

    传送门:https://284914869.github.io/AEoj/558.html 题目简述  一个人在一个n * m棋盘上玩游戏,想要占领一个格子有两个方法: 在这个格子放一个棋子.  这个 ...

  4. hdu 5919 主席树(区间不同数的个数 + 区间第k大)

    Sequence II Time Limit: 9000/4500 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Tot ...

  5. Codeforces Round #438 B. Race Against Time

    Description Have you ever tried to explain to the coordinator, why it is eight hours to the contest ...

  6. bzoj3622已经没有什么好害怕的了 dp+组合+容斥(?)

    3622: 已经没有什么好害怕的了 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1033  Solved: 480[Submit][Status][ ...

  7. 容器化分布式日志组件ExceptionLess的Angular前端UI

    写在前面 随着微服务架构的流行,日志也需要由专门的分布式日志组件来完成这个工作,我们项目使用的是 ExceptionLess 这个组件,它是前后端分离的:这篇文章我们就来实践容器化 Exception ...

  8. Python Django rest framework

    本节内容 Django rest framework 安装 Django rest framwwork 环境配置 简单举例说明 Django中使用 rest framework 1.1 安装 Djan ...

  9. break用法

    break用于循环,则是终止循环 break用于switch,则终止switch break不能用于if.当break用于if语句,但是终止的是if的外部循环 break 只能终止最近的循环

  10. ionic3-ng4学习见闻--(自定义ion-tab图标)

    学习混合开发语言,目的就是为了快速开发一个适用于多平台的app. app基本都会有footer,也就是tabbar,用来快速导航不同的页面. ionic也有这个组件,ion-tab. 常用方法如下: ...