疯狂java学习笔记之面向对象(七) - super关键字

super有以下两大作用:

  1、起限定作用:强制去访问父类的成员(Field、方法)

  2、起调用作用:指定/显示调用父类的某个构造器

super调用规则:

  1、子类构造器总会调用父类构造器一次,默认情况下子类构造器会自动调用父类无参数的构造器;

  2、若希望明确指定子类构造器调用父类哪个构造器,可以用super(参数,参数,....),到底调用哪个父类构造器取决于super后面传入的形参列表;

  3、this()调用与super()调用都必须出现在构造器的第一行,所以他们两个调用时不能同时出现的.

约定俗成:

  1、若没有super()调用,也没有this()调用,默认子类构造器会自动调用父类无参数构造器;

  2、若有super()调用,根据super()调用传入的形参列表去决定调用哪个父类构造器;

  3、若有this()调用,子类构造器会找到this()调用所对应的子类中被重载的构造器。

例1:在方法中使用super.起限定作用

 1 class Fruit{
 2     private String color;
 3     private double weight;
 4
 5     public Fruit(){}
 6     public Fruit(String color , double weight){
 7         this.color = color;
 8         this.weight = weight;
 9     }
10
11     public void info(){
12         System.out.println("这是一个水果哦!");
13         System.out.println("水果颜色是:" + color + ",重量为:" + weight);
14     }
15 }
16
17
18 public class Apple extends Fruit{
19     public void info(){
20         System.out.println("这是个苹果!");
21     }
22
23     public void test(){
24         System.out.println("~~Apple test 方法");
25         //this.info(); - 通过this. 调用info默认总是调用本类中定义的info()方法
26         super.info();  //- 通过super. 限定后强制调用父类中的info()方法
27     }
28
29     public static void main(String[] args){
30         Apple a = new Apple();
31         a.test();
32     }
33 }

例2:在Field中使用super. 同样起限定作用

 1 class Demo{
 2     int count = 2;
 3 }
 4
 5 public class TestDemo extends Demo{
 6     int count = 10;
 7     public void test(){
 8         //默认count(即count前不加this./super.)时,其前面默认省略了this
 9         //若一定要使用父类的count Field必须在其前面加上super.
10         System.out.println("test方法访问当前类的count为:" + this.count);
11         System.out.println("test方法访问父类的count为:" + super.count);
12     }
13
14     public static void main(String[] args){
15         TestDemo t = new TestDemo();
16         t.test();
17     }
18 }

例3:通过super调用父类构造器

 1 class Person{
 2     protected String name;
 3     protected int age;
 4     protected String sex;
 5
 6     //程序员定义了有参构造器,因此系统不会再为该类生成无参构造器
 7     public Person(String name , int age , String sex){
 8         this.name = name;
 9         this.age = age;
10         this.sex = sex;
11     }
12
13     //假如不定义方法,直接在main方法中调用name/age/sex 参数编译时会报错"staic方法不能引用非static变量"
14     public void info(){
15         System.out.println("老师的名字叫:" + name + ",年龄为:" + age + ",性别为:" + sex);
16     }
17 }
18
19 public class Teacher extends Person{
20     private String sex;
21
22     //若不指定构造器,默认会去调用父类的无参构造器,但父类又没有无参构造器则报错
23     public Teacher(String name , int age , String sex){
24         super(name,age,sex);
25     }
26
27
28     public static void main(String[] args){
29         Teacher tt = new Teacher("haha",30,"male");
30         tt.info();
31     }
32 }
时间: 2024-11-06 13:02:09

疯狂java学习笔记之面向对象(七) - super关键字的相关文章

疯狂java学习笔记之面向对象(四) - this关键字

Java中this关键字主要有以下两个方法: 1.this引用 - 可用于任何非static修饰的方法和构造器中,当this用于方法中时,它代表调用该方法的实例/对象;当this用于构造器中时,它代表构造器正在初始化的实例/对象 2.this调用 - 只能在构造器的第一行出现. 如何区分this引用与this调用呢? this引用写法为:this.  ;  而this调用写法为:this(); 例1: 1 class TestThis{ 2 private double weight; 3 pr

java学习笔记之面向对象static,final关键字

java学习笔记之面向对象static,final关键字 一.static关键字 1.概述: static静态的,被static修饰的成员属于类,不属于单个对象,被所有对象所共享,存在静态区中,静态的成员优先于对象加载到内存中. 2.statc修饰成员的使用方式:(被static修饰的成员变量有默认值) /* 1.可以通过对象直接使用,不推荐使用 2.通过类名调用静态成员 类名.静态成员变量 类名.静态成员方法 */ 3.static的特点 /* 1.在同一个类中,静态成员只能访问静态成员,非静

疯狂java学习笔记之面向对象(八) - static和final

一.static: 1.static是一个标识符: - 有static修饰的成员表明该成员是属于类的; - 没有static修饰的成员表明该成员是属于实例/对象的. 2.static修饰的成员(Field.方法.初始化块),与类共存亡:static修饰的成员建议总是通过类名来访问,虽然它也可以通过实例来访问(实质也是通过类来访问的),所以平时若在其他程序中见到通过实例/对象来访问static成员时,可以直接将实例/对象 替换成类名: 3.程序都是先有类再有对象的,有可能出现有类但没有实例/对象的

疯狂java学习笔记之面向对象-定义类、方法、构造器

Java面向对象 1.定义类 2.创建对象.调用方法 类和对象: 某一类对象的概念定义. 比如:人类 - 抽象出来的概念(不特指某个人) 对象 - 在类的概念下产生的一个实例,它就是一个对象了. java程序中,类是最小的程序单位 - 所有的java程序都必须从定义类开始 定义类的语法格式: [修饰符]  class  类名{ //0 ~ N 个 Field 定义 //0 ~ N 个 方法定义 //0 ~ N个 构造器定义 } 一个类中最多只能出现五种成分:Field.方法.构造器 一个类最常见

疯狂java学习笔记之面向对象(六) - 构造器重载、方法重载和方法重写

一.方法重载(Overload): Java允许同一个类中定义多个同名方法,只要形参不一样就可以,如果同一个类中包含了两个或两个以上方法名相同的方法,但形参列表不同,则被成为方法重载(两同一异). 同时这这里我们需要注意以下两点:  A.方法重载与返回值类型没有任何关系;  B.方法重载与是否有static修饰没有任何关系. 那我们如何才能确定到底调用的哪个方法呢?  A.主调者:明确是谁在调用这个方法,是类还是对象  B.方法名和形参:确定调用哪个方法(由方法名和形参共同决定) 例1: 1 p

疯狂java学习笔记之面向对象(三) - 方法所属性和值传递

方法的所属性: 从语法的角度来看:方法必须定义在类中 方法要么属于类本身(static修饰),要么属于实例 -- 到底是属于类还是属于对象? 有无static修饰 调用方法时:必须有主调对象(主语,调用者) 1 public class MathTest{ 2 public static void main(String[] args){ 3 System.out.println(Math.sin(1.57)); 4 System.out.println(Math.sin(Math.PI/2))

疯狂java学习笔记之面向对象 - 成员变量与局部变量

Java变量按其作用域可分为:成员变量和局部变量.注意:在Java中是没有全局变量这个概念的 一.成员变量: 成员变量是在类中定义的变量,具体可分为类变量与实例变量--有无static修饰 实例变量的特点: 没有创建实例前是不会分配内存空间的: 从有实例开始,实例变量就存在了: 实例被销毁,实例变量就不存在了: 0~N个实例变量,程序每创建一个实例,系统就为该实例分配一块内存 类变量的特点: 从有类开始,类变量就存在了,一个JVM中类信息只要一个即可. 每个JVM最多只加载一个类一次,系统就为该

Java学习笔记<3>面向对象相关

面向对象的基本思想 从现实世界客观存在的事务出发来构造软件系统,并在系统的构造中尽可能运用人类的自然思维方式,如抽象.分类 继承.聚合.多态等. 类和对象的关系 对象中存储了类规定的数据类型,并且对象可以调用类的方法. java面向对象 <1>对象是java程序的核心,一切皆对象. <2>对象可以看成静态属性(成员变量)和动态属性(方法)的封装体. <3>类是创新同一类型对象的模版,定义了该类型对象应具有的成员变量及方法. 类的定义 成员变量可以用java语言的任何一种

【疯狂Java学习笔记】【理解面向对象】

[学习笔记]1.Java语言是纯粹的面向对象语言,这体现在Java完全支持面向对象的三大基本特征:封装.继承.多态.抽象也是面向对象的重要组成部分,不过它不是面向对象的特征之一,因为所有的编程语言都需要抽象. 2.面向对象开发方法比较结构化开发方法的优势在于可以提供更好的可重用性.可扩展性.可维护性. 3.基于对象和面向对象的区别:基于对象也使用了对象,但是无法通过现有的对象作为模板来生成新的对象类型,继而产生新的对象,也就是说,基于对象没有继承的特点.而面向对象有继承,而多态则是建立在继承的基