写点什么

Java 面向对象

作者:GalaxyCreater
  • 2022 年 7 月 31 日
  • 本文字数:2053 字

    阅读完需:约 7 分钟

Super 关键字

package com.huo.object.oriented;
class Base { String name;
Base(String n) { name = n; }
void print() { System.out.println(getClass() + " name: " + name); }}

class D1 extends Base { String name;
D1(String n) { super(n + "-sub"); // 调用父类构造方法 name = n; }
void print() { super.print();// super 指向它上一个父类(Base),即便调用的对象是D2 System.out.println(getClass() + " name: " + name); // Java中允许子类中出现和父类一样的同名变量,如果想在子类中访问父类中的同名特征,那么super就不能省略 System.out.println(getClass() + " super name: " + super.name); }}
class D2 extends D1 { String name;
D2(String n) { super(n + "-sub"); name = n; }}

public class TestSuper { public static void run() { D1 d1 = new D1("d1"); D2 d2 = new D2("d2"); System.out.println("------------------------------------"); d1.print(); System.out.println("------------------------------------"); System.out.println("------------------------------------"); d2.print(); System.out.println("------------------------------------"); }}
复制代码


(1)super()表示通过子类的构造方法调用父类的构造方法。

(2)当一个构造方法第一行:既没有 this(),又没有 super()的话,会默认会有一个 super();表示通过当前子类构造方法调用父类的无参数构造方法。所以必须保证父类的无参数构造方法是存在的。

(3)this()和 super()不能共存,都是只能出现在构造方法第一行。

内存图:



类访问规则


类可声明两种访问级别:

  • 什么都不声明--class A

  • 这种类只能在包内被使用

  • 什么为 public-- public class A

  • 这种类可以在其他包中使用

  • 同一个文件中只能有一个 class 是 public


导入静态变量方式

import static  java.lang.Math.*;   // 导入java.lang包的Math类的所有静态变量import static  java.lang.Math.PI;  // 导入java.lang包的Math类的PI静态变量

复制代码


方法

重载

方法的返回类型,访问级别和 throws 子句对使其成为重载方法没有任何影响


public  class  Main {    public static int max(int x, int  y)  {    }        public static int max(int...num)  {    }}
int max = Main.max(12, 13); // Java将调用max(int x,int y)。 // Java首先尝试使用对参数数量的精确匹配来找到方法声明. // 即调用max(int x, int y)
复制代码


public class Main {  public static int max(int... num) {    return 0;  }
public static int max(double... num) { return 0; }}
int max = Main.max(); // 会导致编译错误
复制代码

参数传递

java 参数传递是引用传递(和 c++的引用一样的行为)

class Modify {    String name = "none";      static void modifyInstanceMember(Modify m, String name) {          m.name = name;  // 和c++的引用一样,指向同一个内存,对它对修改影响原值      }
static void modifyQuota(Modify m) { m = new Modify(); // 所指的对象被修改,后面对它对修改都不会影响原对象 m.name = "quota"; out.println("new quota value:" + m.name); }
static void forbidModifyQuota(final Modify m, String name) { // 禁止m更换成别的对象的引用 //m = new Modify(); // Cannot assign a value to final variable 'm' m.name = name; // 声明为final后,依然可以修改成员变量的值 }

public static void testModifyInstanceMember() { Modify m = new Modify(); out.println("old value:" + m.name); // old value:none modifyInstanceMember(m, "xxx"); out.println("current value:" + m.name); // current value:xxx }
public static void testModifyQuota() { Modify m = new Modify(); out.println("old value:" + m.name); // old value:none modifyQuota(m); // new quota value:quota out.println("current value:" + m.name); // current value:none }
public static void testForbidModifyQuota() { Modify m = new Modify(); out.println("old value:" + m.name); // old value:none forbidModifyQuota(m, "yyy"); out.println("current value:" + m.name); // current value:xxxx }}
复制代码


继承

访问级别

如果使用 protected 关键字将类成员声明为 protected,则可以从同一个包或从类的后代访问,即使后代位于不同的包中也是如此

用户头像

GalaxyCreater

关注

还未添加个人签名 2019.04.21 加入

还未添加个人简介

评论

发布
暂无评论
Java面向对象_Java_GalaxyCreater_InfoQ写作社区