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. [AHOI 2016初中组]迷宫

    Description 小雪和小可可被困在了一个无限大的迷宫中. 已经知道这个迷宫有 N 堵环状的墙,如果把整个迷宫看作是一个二维平面,那么每一堵墙都是平面上一个圆.任意两个圆不相交,不重合,也不会相 ...

  2. 组合数问题(zyys版)

    [问题描述]定义"组合数"S(n,m)代表将 n 个不同的元素拆分成 m 个非空集合的方案数.举个栗子,将{1,2,3}拆分成 2 个集合有({1},{2,3}),({2},{1, ...

  3. Linux下用程序实现统计cpu和内存的利用率

    Linux下没有直接可以调用系统函数知道CPU占用和内存占用.那么如何知道CPU和内存信息呢.只有通过proc伪文件系统来实现. proc伪文件就不介绍了,只说其中4个文件.一个是/proc/stat ...

  4. C++多态实现原理

    C++的多态性用一句话概括就是:在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数.如果对象类型是派生类,就调用派生类的函数:如果对象类型是基类 ...

  5. Python中模块之logging & subprocess的讲解

    subprocess & logging模块的介绍 1. subprocess 该模块替代了os.system & os.pawn*所实现的功能. 2. logging 1. 日志五大 ...

  6. VS2012代码对齐快捷键

    1.选中想要对齐的代码 2.全选代码后按住Ctrl+K,Ctrl+F键,就可以了

  7. TensorFlow + Keras 实战 YOLO v3 目标检测图文并茂教程

    运行步骤 1.从 YOLO 官网下载 YOLOv3 权重 wget https://pjreddie.com/media/files/yolov3.weights 下载过程如图: 2.转换 Darkn ...

  8. 【图文详解】linux下配置远程免密登录

    linux下各种集群搭建往往需要配置远程免密登录,本文主要描述了CentOs6.3系统下配置免密登录的详细过程. ssh远程登录,两种身份验证: 用户名+密码 密钥验证 机器1生成密钥对并将公钥发给机 ...

  9. UMAIL安装教程

    UMAIL安装教程 一.UMAIL虚拟机的创建与安装 首先在VM中选择新建虚拟机 选择下一步 选择稍后安装操作系统 选择Linux系统 版本CentOS 7 64位 选择名称与安装位置 选择下一步 选 ...

  10. vue+node.js+webpack开发微信公众号功能填坑——组件按需引入

    初次开发微信公众号,整体框架是经理搭建,小喽喽只是实现部分功能,整体页面效果 整个页面使用两个组件:布局 FlexBox,搜索框 Search,demo文档 http://vue.ydui.org/d ...