1.基础复习超市购物小票案例

1.1超市购物小票需求分析

image.png

模拟真实购物逻辑,以上述图片为需求原型,根据不同购买物品,完成购物小票内容打印到控制台。(简化项目逻辑,票脚部分只完成数据统计)
数据:
将超市购物小票案例中零散数据(名称、货号、单价、数量、计价单位、金额)封装为货物对象。
所有的货物对象放置到集合中统一管理。
逻辑:
用户循环进行三个操作:
 输入购买数量,代表为所购买货物的数量赋值,从而计算每项商品金额
 打印小票,将已有数据打印
 退出系统(因为该程序为循环操作,无法终止,如果不想再进行操作,则退出系统)

1.2超市购物小票知识点分析

复习知识点:
变量定义:记录部分数据
集合的使用:用于存储多个完整数据
运算符的使用:计算变量
流程控制语句的使用:
if语句:用于判断是否购买了商品
switch语句:用于进行三个操作(输入购买数量、打印小票、退出系统)的分支
for语句:switch外部使用for循环,当执行一个操作后,继续进行下一个操 作选择
方法封装:
由于代码量比较多,可以将输入购买数量、打印小票封装为方法使用
字符串/键盘录入:
打印小票完整过程均为字符串的拼写及打印,数量输入为键盘录入Scanner 完成
步骤:
定义GoodsItem类(名称,货号,单价,数量,计价单位,金额)
成员位置定义集合,定义方法向集合中存储所有GoodsItem数据
实现主干逻辑
打印欢迎语句
使用for/while进行循环进行操作
使用switch给出操作选择:1输入购买数量2打印小票3退出
完成switch中三个case的逻辑
运用方法封装功能:将1输入购买数量、2打印小票封装为独立方法,在case中 调用,提高代码可读性。

  1. import java.util.ArrayList;
  2. import java.util.Scanner;
  3. /**
  4. * @author Lynn
  5. * @create 2020-11-28-15:14
  6. */
  7. public class ShoppingReceipt {
  8. //定义集合:成员位置定义集合,存储所有的商品项对象
  9. static ArrayList<GoodsItem> list=new ArrayList<GoodsItem>();
  10. public static void main(String[] args) {
  11. //为集合准备数据--调用方法
  12. initDate();
  13. //打印欢迎语
  14. System.out.println("欢迎使用超市管理系统!");
  15. //实现主干
  16. //使用死循环完成反复操作
  17. while (true){
  18. System.out.println("请输入您要进行的操作:1输入购买数量 2打印小票 3退出");
  19. //键盘录入
  20. Scanner sc=new Scanner(System.in);
  21. int n=sc.nextInt();
  22. //switch--case
  23. switch (n){
  24. case 1:
  25. //System.out.println("给所有数据量赋值");
  26. enterNum();
  27. break;
  28. case 2:
  29. //调用打印购物小票的方法
  30. print();
  31. break;
  32. case 3:
  33. //退出
  34. System.out.println("欢迎下次光临");
  35. System.exit(0);//正常退出
  36. default:
  37. System.out.println("请输入正确的数字!");
  38. break;
  39. }
  40. }
  41. }
  42. //写一个方法为集合赋值
  43. public static void initDate(){
  44. //创建多个商品对象
  45. GoodsItem sls=new GoodsItem("少林寺核桃", "090115", 15.5, 0, "个", 0);
  46. GoodsItem shk = new GoodsItem("尚康饼干", "090027", 14.5, 0, "个", 0);
  47. //添加到集合
  48. list.add(sls);
  49. list.add(shk);
  50. }
  51. //赋值数量与金额
  52. public static void enterNum(){
  53. //遍历集合
  54. for (int i = 0; i < list.size() ; i++) {
  55. //获取每一个商品
  56. GoodsItem thisGoods= list.get(i);
  57. //输入数量
  58. //先要获取该商品的名称
  59. String thisName= thisGoods.getName();
  60. //键盘录入数量
  61. Scanner sc=new Scanner(System.in);
  62. System.out.println("请输入"+thisName+"的数量:");
  63. int num=sc.nextInt();
  64. //计算金额
  65. double thisMoney= thisGoods.getPrice()*num;
  66. //为该商品的数量与金额赋值
  67. thisGoods.setCount(num);
  68. thisGoods.setMoney(thisMoney);
  69. }
  70. }
  71. //打印小票
  72. public static void print(){
  73. //票头
  74. System.out.println(" 欢迎光临");
  75. System.out.println("品名\t商品号\t售价\t数量\t单位\t金额");
  76. System.out.println("-------------------------------------------");
  77. //票体
  78. //定义变量,记录所有商品数量
  79. int totalNum=0;
  80. //记录所有金额
  81. double totalMon=0;
  82. //遍历集合
  83. for (int i = 0; i < list.size(); i++) {
  84. //获取每一个商品
  85. GoodsItem g= list.get(i);
  86. //打印商品项
  87. System.out.println(g.getName()+g.getId()+"\t"+g.getPrice()+"\t"+g.getCount()+" "+g.getUnit()+"\t"+g.getMoney());
  88. //累加数量与金额
  89. totalNum+=g.getCount();
  90. totalMon+=g.getMoney();
  91. System.out.println("-------------------------------------------");
  92. //票脚
  93. System.out.println("共"+list.size()+"项商品");
  94. System.out.println("共"+totalNum+"件商品");
  95. System.out.println("共"+totalMon+"元");
  96. System.out.println();
  97. }
  98. }
  99. }

2.复习:

2.1面向对象(oop)

一个类拥有的成员包括:
成员变量
构造方法:方法名与类名相同,有参和无参构造;没有返回值类型(即没有return),不能用void修饰;其主要作用是给成员变量赋值
普通方法
get/set

注重的是结果
对象都有两个内容:
属性(特征):名词
方法(行为):动词
在面向对象中注重:属性私有化,行为公开化
属性修饰符:private—如果需要访问,提供get/set方法
行为修饰符:public—公开的,所有的对象都可以访问

面向对象的三大特征:封装、继承、多态
封装一个实体类:
属性(私有),构造函数(无参和有参),get/set方法,toString()
目的:对象是需要被实例化的,实例化对象之前我们要保证对象是存在的

3.this关键字

tips:
在当前的类中导入igeek_03中的实体类—跨包的调用

  • 作用域:在当前的igeek_02包下没有Person实体类,可以通过导包的形式获取到(自动导包)
  • 在系统的api中经常使用 ```java package com.igeek_02;

/**

  • @author Lynn
  • @create 2020-11-30-9:32 */

import com.igeek_03.Person;//就是自动导包

/**

  • 在当前的类中导入igeek_03中的实体类—跨包的调用 *
  • 作用域:在当前的igeek_02包下没有Person实体类,可以通过导包的形式获取到(自动导包)
  • 在系统的api中经常使用 */ public class PersonDemo { public static void main(String[] args) {
    1. Person s=new Person();
    2. s.showName();
    } }
  1. <a name="iH2QB"></a>
  2. ### 3.1this作用:
  3. - **使用this可以区分成员变量和局部变量,处理成员变量和局部变量同名的情况**
  4. - 如果一个方法内访问不带this的变量,则遵循以下的顺序,先查找局部变量,再去查找成员变量
  5. - 如果一个方法内访问带this的变量,在只在成员变量中查找
  6. - this代表的就是当前对象的引用:
  7. - 类的方法定义过程中定义this,代表调用这个方法的对象,是一个不确定的对象
  8. - 可以简单的理解为:**哪个对象调用这个方法,this代表的就是那个对象**
  9. ```java
  10. Person类(省略)
  1. package com.igeek_03;
  2. /**
  3. * @author Lynn
  4. * @create 2020-11-30-9:42
  5. */
  6. /**
  7. * this作用:
  8. * 使用this可以区分成员变量和局部变量,处理成员变量和局部变量同名的情况
  9. *
  10. * 如果一个方法内访问不带this的变量,则遵循以下的顺序,先查找局部变量,再去查找成员变量
  11. * 如果一个方法内访问带this的变量,在只在成员变量中查找
  12. *
  13. * this代表的就是当前对象的引用:
  14. * 类的方法定义过程中定义this,代表调用这个方法的对象,是一个不确定的对象
  15. * 可以简单的理解为:哪个对象调用这个方法,this代表的就是那个对象
  16. */
  17. public class ThisDemo {
  18. public static void main(String[] args) {
  19. //创建对象
  20. //this表示p1
  21. Person p1=new Person("王嘉尔",25);
  22. p1.showName();
  23. //this表示p2
  24. Person p2=new Person("嘎嘎",25);
  25. p2.showName();
  26. }
  27. }

4.编程中两种结构关系

4.1组合关系—将某一个对象作为成员变量时,两种数据就存在了组合关系

  1. package igeek_04;
  2. /**
  3. * @author Lynn
  4. * @create 2020-11-30-9:38
  5. */
  6. /**
  7. * this版本的实体类
  8. */
  9. /**
  10. * 演示组合关系:
  11. * 在编程中有两种结构关系
  12. * 1.组合关系:将某一个对象作为成员变量时,两种数据就存在了组合关系
  13. * 2.继承关系:子级继承父级的内容
  14. */
  15. public class Person {
  16. private String name;
  17. private int age;
  18. private Pet pet;//定义一个(宠物)对象(对象注入)
  19. public Person() {
  20. }
  21. public Person(String name, int age,Pet pet) {
  22. this.name = name;
  23. this.age = age;
  24. this.pet=pet;
  25. }
  26. public String getName() {
  27. return name;
  28. }
  29. public void setName(String name) {
  30. this.name = name;
  31. }
  32. public int getAge() {
  33. return age;
  34. }
  35. public void setAge(int age) {
  36. this.age = age;
  37. }
  38. @Override
  39. public String toString() {
  40. return "Person{" +
  41. "name='" + name + '\'' +
  42. ", age=" + age +
  43. '}';
  44. }
  45. //调用的是一个成员方法,可以用this调用
  46. public void showName(){
  47. System.out.println("我的名字是:"+this.name+",我今年"+this.age);
  48. System.out.println("我的宠物叫:"+name+",它是"+pet.getColor()+"品种是"+ pet.getBrand());
  49. }
  50. }
  1. package igeek_04;
  2. /**
  3. * @author Lynn
  4. * @create 2020-11-30-10:07
  5. */
  6. /**
  7. * 这是一个宠物对象
  8. * 成员属性:
  9. * 姓名,颜色,种类
  10. */
  11. public class Pet {
  12. //成员属性
  13. private String name;
  14. private String brand;
  15. private String color;
  16. public Pet() {
  17. }
  18. public Pet(String name, String brand, String color) {
  19. this.name = name;
  20. this.brand = brand;
  21. this.color = color;
  22. }
  23. public String getName() {
  24. return name;
  25. }
  26. public void setName(String name) {
  27. this.name = name;
  28. }
  29. public String getBrand() {
  30. return brand;
  31. }
  32. public void setBrand(String brand) {
  33. this.brand = brand;
  34. }
  35. public String getColor() {
  36. return color;
  37. }
  38. public void setColor(String color) {
  39. this.color = color;
  40. }
  41. }
  1. package igeek_04;
  2. /**
  3. * @author Lynn
  4. * @create 2020-11-30-10:13
  5. */
  6. /**
  7. * 测试组合关系
  8. */
  9. public class CompositionDemo {
  10. public static void main(String[] args) {
  11. //准备对象
  12. String name="杨戬";
  13. int age=2000;
  14. //准备pet
  15. Pet pet=new Pet("哮天犬","中华田园犬","黑色");
  16. //创建person对象
  17. Person ps=new Person(name,age,pet);
  18. //调用方法
  19. ps.showName();
  20. }
  21. }

4.2继承关系—子级继承父级的内容

继承关系:

  • 从语法上来说就是子类继承父类的属性和方法,并且可以拓展父类的功能(方法)
  • 从结构上来说就是类与类之间的关系—发生在类与类之间的(层级结构关系)

  • 补充:类—java中最基本层级结构

  • 比如:
  • 人:定义一些共性内容的类—父类
  • 共性的特征(成员变量):姓名,年龄,身高,体重···········
  • 共性的行为(成员方法):吃饭,睡觉··········
  • 子类:
  • 程序员,老师,工人可以定义为子类,子类在父类的基础上可以拓展新的属性和方法

  • 子类在继承父类的属性和方法后,可以直接访问父类的属性和方法—-?错误
  • 子类在继承父类的属性和方法后,可以直接访问父类的非私有的属性和方法
  • 如果父类中的属性和方法是私有的,则需要调用get/set方法申请访问
  • 子类在继承父类的内容时,是全部继承过来的,由于访问权限的问题,子类访问不到

  • 继承的作用:
  • 1.为了让子类继承父类之后复用父类的方法
  • 2.为了便于子类拓展父类的功能

  • 继承的语法:
  • public class 子类 extends 父类{
  • }
  • 注意:jsva中所有的类都是默认继承自Object ```java package com.igeek_01;

/**

  • @author Lynn
  • @create 2020-11-30-10:38 */

/**

  • 父类:
  • 姓名,年龄
  • 吃饭,睡觉 */ public class Person { String name; int age;

    public void eat(){

    1. System.out.println("ganfan");

    } public void sleep(){

    1. System.out.println("sleep");

    } } java package com.igeek_01;

/**

  • @author Lynn
  • @create 2020-11-30-10:41 */

/**

  • 程序员—子类 *
  • 继承自人类
  • 在人类的基础上进行拓展 */ public class Coder extends Person { public void codding(){
    1. System.out.println("helloworld");
    } } java package com.igeek_01;

/**

  • @author Lynn
  • @create 2020-11-30-10:43 */

import java.sql.SQLOutput;

/**

  • 老师—-子类 */ public class Teacher extends Person { public void teach(){
    1. System.out.println("传道受业解惑");
    } } java package com.igeek_01;

/**

  • @author Lynn
  • @create 2020-11-30-10:31 */

/**

  • oop中的特征:封装、继承、多态 *
  • 继承关系:
  • 从语法上来说就是子类继承父类的属性和方法,并且可以拓展父类的功能(方法)
  • 从结构上来说就是类与类之间的关系—发生在类与类之间的(层级结构关系) *
  • 补充:类—java中最基本层级结构 *
  • 比如:
  • 人:定义一些共性内容的类—父类
  • 共性的特征(成员变量):姓名,年龄,身高,体重···········
  • 共性的行为(成员方法):吃饭,睡觉··········
  • 子类:
  • 程序员,老师,工人可以定义为子类,子类在父类的基础上可以拓展新的属性和方法 *
  • 子类在继承父类的属性和方法后,可以直接访问父类的属性和方法—-? *
  • 继承的作用:
  • 1.为了让子类继承父类之后复用父类的方法
  • 继承的语法:
  • public class 子类 extends 父类{ *
  • }
  • 注意:jsva中所有的类都是默认继承自Object */ public class ExtendsDemo { public static void main(String[] args) {

    1. //创建子类对象
    2. Coder c=new Coder();
    3. //子类继承了父类的属性
    4. c.name="詹姆斯.高斯林";
    5. c.age=60;
    6. System.out.println(c.name+","+c.age);
    7. //子类继承了父类的方法
    8. c.eat();
    9. c.sleep();
    10. //子类访问自己的方法
    11. c.codding();

    } } ```

    4.3继承的特点

  • java中的继承只支持单继承—一脉相承
  • java中的继承支持隔代继承—继承爷爷 ```java package com.igeek_03;

/**

  • @author Lynn
  • @create 2020-11-30-11:14 */

/**

  • 父类1 */ public class Fu1 extends Object{ private String name;

    public void eat(){

    1. System.out.println("干饭啦!");

    }

    public String getName() {

    1. return name;

    }

    public void setName(String name) {

    1. this.name = name;

    } } java package com.igeek_03;

/**

  • @author Lynn
  • @create 2020-11-30-11:14 */

/**

  • 父类2 */ public class Fu2 extends Object{ private String name;

    public void eat(){

    1. System.out.println("干饭啦!");

    }

    public String getName() {

    1. return name;

    }

    public void setName(String name) {

    1. this.name = name;

    } } java package com.igeek_03;

/**

  • @author Lynn
  • @create 2020-11-30-11:15 */

/**

  • 子类1 *
  • 子类一次只能继承一个父类 */ public class Zi1 extends Fu1{ } java package com.igeek_03;

/**

  • @author Lynn
  • @create 2020-11-30-11:18 */

/**

  • 孙子类1
  • java中只支持单继承,Sun1类只能继承Zi1 *
  • 隔代继承—多层继承 */ public class Sun1 extends Zi1{ } java package com.igeek_03;

/**

  • @author Lynn
  • @create 2020-11-30-11:13 */

import sun.security.provider.Sun;

/**

  • java中继承的特点:
  • java中的继承只支持单继承—一脉相承
  • java中的继承支持多层(隔代)继承—继承爷爷(间接继承) */ public class ExtendsDemo { public static void main(String[] args) {

    1. //直接创建孙子类
    2. Sun1 sun=new Sun1();
    3. //孙子类直接调用爷爷类的成员
    4. sun.setName("林更新");
    5. System.out.println(sun.getName());
    6. sun.eat();

    } } ```

    5.重写

    5.1方法的重写:

  • 重写:其实就是覆盖
  • 当子类继承父类的时候,子类继承父类中的方法,可以增强父类中的方法的功能

  • 格式:
  • 定义一个与父类方法完全一致的方法,方法体{}中内容重写

  • 方法重写后,调用该方法时不在调用父类的方法,而调用子类中重写后的方法
  • 方法重写注意事项:1.方法名称必须相同,参数列表必须相同

2.子类访问权限大于等于父类的(public > 默认 )
3.返回值一般必须相同

  1. package com.igeek_01; /**
  2. * @author Lynn
  3. * @create 2020-11-30-14:01
  4. */
  5. /**
  6. * 父类
  7. * 动物父类中有方法
  8. */
  9. public class Animal {
  10. //吃
  11. public void eat(){
  12. System.out.println("动物在吃东西");
  13. }
  14. //睡觉
  15. public void sleep(){
  16. System.out.println("动物在睡觉");
  17. }
  18. }
  1. package com.igeek_01; /**
  2. * @author Lynn
  3. * @create 2020-11-30-14:03
  4. */
  5. import com.igeek_01.Animal;
  6. /**
  7. * 子类--狗
  8. *
  9. * 继承父类的方法,然后在这个方法的基础上进行拓展--通过方法的重写
  10. */
  11. public class Dog extends Animal {
  12. //方法的重写
  13. //这是一个重写的检查标记,利用这个标记修饰的方法必须是重写的,要不然会出错
  14. @Override
  15. public void eat(){
  16. System.out.println("哮天犬在啃骨头");
  17. }
  18. }
  1. package com.igeek_01; /**
  2. * @author Lynn
  3. * @create 2020-11-30-13:59
  4. */
  5. import com.igeek_01.Dog;
  6. /**
  7. * 方法的重写:
  8. * 重写:其实就是覆盖
  9. * 当子类继承父类的时候,子类继承父类中的方法,可以增强父类中的方法的功能
  10. *
  11. * 格式:
  12. * 定义一个与父类方法完全一致的方法,方法体{}中内容重写
  13. *
  14. * 方法重写后,调用该方法时不在调用父类的方法,而调用子类中重写后的方法
  15. *
  16. */
  17. public class OverRideDemo {
  18. public static void main(String[] args) {
  19. //测试重写
  20. //创建子类
  21. Dog d=new Dog();
  22. d.eat();//哮天犬在啃骨头---子类中的方法
  23. d.sleep();//动物在睡觉-----这个方法是父类中的方法,因为没有重写
  24. }
  25. }

5.2注意

成员属性(方法)不加任何的修饰符,表示默认的范围—-不加任何的修饰符
默认的范围比public要小,默认的表示可以在本类和本包中被访问

继承父类的方法,然后在这个方法的基础上进行拓展—通过方法的重写

  • 方法的重写中注意一个事项:
  • 访问权限的问题:
  • 父类中方法的访问权限小于等于子类中的方法的访问权限,
  • 默认(即没有权限修饰符)<public

  • 注意:
  • private修饰的属性,可以被继承,但是如果子类要访问需要通过get/set方法申请
  • privave修饰的方法,不能被重写—原因是权限修饰符的存在 ```java package com.igeek_01_up; /**
    • @author Lynn
    • @create 2020-11-30-14:01 */

/**

  • 父类
  • 动物父类中有方法 *
  • 成员属性(方法)不加任何的修饰符,表示默认的范围—-不加任何的修饰符
  • 默认的范围比public要小,默认的表示可以在本类和本包中被访问 */ public class Animal { //吃 void eat(){

    1. System.out.println("动物在吃东西");

    } //睡觉 public void sleep(){

    1. System.out.println("动物在睡觉");

    }

    //私有的方法只能在本类中被访问 private void drink(){

    1. System.out.println("喝水");

    }

}

  1. ```java
  2. package com.igeek_01_up; /**
  3. * @author Lynn
  4. * @create 2020-11-30-14:03
  5. */
  6. /**
  7. * 子类--狗
  8. *
  9. * 继承父类的方法,然后在这个方法的基础上进行拓展--通过方法的重写
  10. *
  11. * 方法的重写中注意一个事项:
  12. * 访问权限的问题:
  13. * 父类中方法的访问权限小于等于子类中的方法的访问权限,
  14. * 默认(即没有权限修饰符)<public
  15. *
  16. * 注意:
  17. * private修饰的属性,可以被继承,但是如果子类要访问需要通过get/set方法申请
  18. * privave修饰的方法,不能被重写--原因是权限修饰符的存在
  19. */
  20. public class Dog extends Animal {
  21. //方法的重写
  22. //这是一个重写的检查标记,利用这个标记修饰的方法必须是重写的,要不然会出错
  23. @Override
  24. public void eat(){
  25. System.out.println("哮天犬在啃骨头");
  26. }
  27. /* @Override
  28. private void drink(){
  29. System.out.println("hehehsui");
  30. }*/
  31. }
  1. package com.igeek_01_up; /**
  2. * @author Lynn
  3. * @create 2020-11-30-13:59
  4. */
  5. /**
  6. * 方法的重写:
  7. * 重写:其实就是覆盖
  8. * 当子类继承父类的时候,子类继承父类中的方法,可以增强父类中的方法的功能
  9. *
  10. * 格式:
  11. * 定义一个与父类方法完全一致的方法,方法体{}中内容重写
  12. *
  13. * 方法重写后,调用该方法时不在调用父类的方法,而调用子类中重写后的方法
  14. *
  15. */
  16. public class OverRideDemo {
  17. public static void main(String[] args) {
  18. //测试重写
  19. //创建子类
  20. Dog d=new Dog();
  21. d.eat();//哮天犬在啃骨头---子类中的方法
  22. d.sleep();//动物在睡觉-----这个方法是父类中的方法,因为没有重写
  23. // d.drink();
  24. }
  25. }

6.构造函数测试类

  1. /**
  2. * @author Lynn
  3. * @create 2020-11-30-14:32
  4. */
  5. /**
  6. * 当前案例用于演示继承中的内层操作
  7. *
  8. * 在继承的过程中其实是对构造函数的使用
  9. */
  10. public class Fu {
  11. //属性
  12. private String name;
  13. //无参构造函数
  14. public Fu(){
  15. System.out.println("父类的无参构造函数被调用了");
  16. }
  17. //有参构造函数
  18. public Fu(String name){
  19. this.name=name;
  20. System.out.println("父类的有参构造函数被调用了");
  21. }
  22. public String getName() {
  23. return name;
  24. }
  25. public void setName(String name) {
  26. this.name = name;
  27. }
  28. }
  1. /**
  2. * @author Lynn
  3. * @create 2020-11-30-14:35
  4. */
  5. /**
  6. *
  7. */
  8. public class Zi extends Fu{
  9. /*//无参构造函数
  10. public Zi(){
  11. System.out.println("子类的无参构造函数被调用了");
  12. }*/
  13. public Zi() {
  14. //super这个关键字用于调用父类中的内容
  15. super();//父类的无参构造函数
  16. }
  17. }
  1. /**
  2. * @author Lynn
  3. * @create 2020-11-30-14:37
  4. */
  5. import javax.naming.Name;
  6. /**
  7. * 构造函数的测试类
  8. *
  9. * 实现继承的原因是:
  10. * 子类在继承父类的时候会自动调用父类的无参构造函数--通过super()这个方法调用了父类的无参构造函数
  11. * 使得父类和子类之间产生了继承关系
  12. */
  13. public class ConstructorDemo {
  14. public static void main(String[] args) {
  15. //创建一个子类对象
  16. new Zi();//父类的空参构造方法被调用了
  17. //子类的构造方法被调用了
  18. }
  19. }

7.super&this

this:当前对象

  • this.成员变量—调用当前对象的内容(访问本类对象的成员变量)
  • this.成员方法()—调用本类中的构造函数(访问本类对象的成员方法)—写在构造函数的第一行

    super:父类的对象(父类的对象空间)

  • super.—调用父类对象的内容

  • super()—调用父类中的构造函数—写在构造函数的第一行

super()在子类中调用父类中的构造函数
this()在子类中调用子类(本类)的其它构造函数

子类的构造函数中,要么第一行是super()调用父类的构造函数,要么是this()用于调用子类(本类)中的其它构造函数

子类中每一个构造函数都有一个默认的super()调用了父类的无参构造函数,如果手动调用会将自动生成的覆盖

  1. package igeek_03;
  2. /**
  3. * @author Lynn
  4. * @create 2020-11-30-15:00
  5. */
  6. public class Person {
  7. private String name;
  8. private int age;
  9. public Person() {
  10. super();//调用父类的无参构造函数
  11. System.out.println("父类中的构造函数被子类调用了");
  12. }
  13. public Person(String name, int age) {
  14. this();
  15. this.name = name;
  16. this.age = age;
  17. }
  18. public String getName() {
  19. return name;
  20. }
  21. public void setName(String name) {
  22. this.name = name;
  23. }
  24. public int getAge() {
  25. return age;
  26. }
  27. public void setAge(int age) {
  28. this.age = age;
  29. }
  30. }
  1. package igeek_03;
  2. /**
  3. * @author Lynn
  4. * @create 2020-11-30-15:02
  5. */
  6. /**
  7. * 子类--中国人
  8. *
  9. * 在父类的基础上,拓展一个地址属性
  10. */
  11. public class Chinese extends Person{
  12. private String address;
  13. public Chinese() {
  14. }
  15. public Chinese(String name,int age,String address) {
  16. //必须写在构造函数的第一行
  17. super(name,age);//手动调用父类的有参构造函数
  18. /*this.name=name;
  19. this.age=age;*/
  20. //直接拿到父类中的属性
  21. this.address = address;
  22. }
  23. public String getAddress() {
  24. return address;
  25. }
  26. public void setAddress(String address) {
  27. this.address = address;
  28. }
  29. }
  1. package igeek_03;
  2. /**
  3. * @author Lynn
  4. * @create 2020-11-30-15:10
  5. */
  6. /**
  7. * this:当前对象
  8. * this.--调用当前对象的内容
  9. * this()--调用本类中的构造函数--写在构造函数的第一行
  10. *
  11. * super:父类的对象(父类的对象空间)
  12. * super.--调用父类对象的内容
  13. * super()--调用父类中的构造函数--写在构造函数的第一行
  14. *
  15. * Person--父类
  16. * name,age
  17. * Chinese--子类
  18. * address
  19. */
  20. public class ThisSuperDemo {
  21. public static void main(String[] args) {
  22. //创建子类--调用子类的构造函数
  23. Chinese c=new Chinese("黄药师",80,"桃花岛");
  24. System.out.println(c.getName()+","+c.getAge()+","+c.getAddress());
  25. }
  26. }
  1. package igeek_04;
  2. /**
  3. * @author Lynn
  4. * @create 2020-11-30-15:30
  5. */
  6. /**
  7. * 父类
  8. */
  9. public class Person {
  10. //声明属性的时候直接赋值(那么默认就是rose和16)
  11. private String name="Rose";
  12. private int age=16;
  13. public void eat(){
  14. System.out.println("可乐鸡翅I like");
  15. }
  16. //无参
  17. public Person() {
  18. System.out.println("调用父类的无参构造方法");
  19. }
  20. //有参
  21. public Person(String name, int age) {
  22. this.name = name;
  23. this.age = age;
  24. System.out.println("调用父类的有参构造方法");
  25. }
  26. public String getName() {
  27. return name;
  28. }
  29. public void setName(String name) {
  30. this.name = name;
  31. }
  32. public int getAge() {
  33. return age;
  34. }
  35. public void setAge(int age) {
  36. this.age = age;
  37. }
  38. }
  1. package igeek_04;
  2. /**
  3. * @author Lynn
  4. * @create 2020-11-30-15:34
  5. */
  6. /**
  7. * 子类
  8. */
  9. public class Chinese extends Person{
  10. //构造
  11. public Chinese(){
  12. //调用的是子类本类中的其他构造函数
  13. this("默认",20);
  14. System.out.println("子类的无参构造函数");
  15. }
  16. public Chinese(String name,int age){
  17. //调用的是父类中的有参构造
  18. super(name,age);
  19. System.out.println("子类的有参构造函数");
  20. }
  21. //重写父类中的方法
  22. @Override
  23. public void eat(){
  24. System.out.println("深井烧鹅");
  25. }
  26. }
  1. package igeek_04;
  2. /**
  3. * @author Lynn
  4. * @create 2020-11-30-15:26
  5. */
  6. /**
  7. * super()在子类中掉头父类中的构造函数
  8. * this()在子类中调用子类(本类)的其它构造函数
  9. *
  10. * 子类的构造函数中,要么第一行是super()调用父类的构造函数,要么是this()用于调用子类(本类)
  11. * 中的其它构造函数
  12. *
  13. * 子类中每一个构造函数都有一个默认的super()调用了父类的无参构造函数,如果手动调用会将自动生成的覆盖
  14. */
  15. public class ThisSuperConstructor {
  16. public static void main(String[] args) {
  17. //测试:子类调用父类中的有参构造
  18. Chinese c=new Chinese("王嘉尔",27);
  19. System.out.println(c.getName()+","+c.getAge());
  20. //调用父类的有参构造方法
  21. //子类的有参构造函数
  22. //王嘉尔,27
  23. System.out.println("---------------------------------");
  24. Chinese c1=new Chinese();
  25. System.out.println(c1.getName()+","+c1.getAge());
  26. //调用父类的有参构造方法(有this,先调用子类本类中的其他构造方法(有参)-->super调用父类的有参
  27. //-->子类的有参-->子类的无参-->再输出
  28. //子类的有参构造函数
  29. //子类的无参构造函数
  30. //默认,20
  31. }
  32. }

就近原则:
局部 > 本类成员 > 父类成员

  1. package com.igeek_04;
  2. /**
  3. * @author Lynn
  4. * @create 2020-12-12-11:18
  5. */
  6. public class Test {
  7. public static void main(String[] args) {
  8. //创建子类对象,测试子类中成员的访问方法
  9. Chinese c = new Chinese();
  10. c.testAccess();
  11. }
  12. }
  13. class Person{
  14. String name = "Rose";
  15. /**
  16. * @Fields age : 年龄
  17. */
  18. int age = 16;
  19. /**
  20. * @Fields i : 父类中的测试变量
  21. */
  22. int i = 300;
  23. /**
  24. * @Title: Person
  25. */
  26. public Person() {
  27. super();
  28. }
  29. /**
  30. * @Title: Person
  31. * @param name
  32. * @param age
  33. */
  34. public Person(String name, int age) {
  35. super();
  36. this.name = name;
  37. this.age = age;
  38. }
  39. /**
  40. * @Title: eat
  41. * @Description: 吃饭的方法
  42. */
  43. public void eat() {
  44. System.out.println("吃饭");
  45. }
  46. }
  47. class Chinese extends Person{
  48. String address = "北京";
  49. /**
  50. * @Fields i : 子类中的测试变量
  51. */
  52. int i = 200;
  53. /**
  54. * @Title: Chinese
  55. */
  56. public Chinese() {
  57. super();
  58. }
  59. //定义三个参数的构造方法,无需了解细节,在super的讲解时会详细介绍
  60. /**
  61. * @Title: Chinese
  62. * @param name
  63. * @param age
  64. * @param address
  65. */
  66. public Chinese(String name, int age,String address) {
  67. super(name, age);
  68. this.address = address;
  69. }
  70. /**
  71. * @Title: eat
  72. * @Description: 子类吃饭的方法
  73. * @see com.igeek_01.Person#eat()
  74. */
  75. @Override
  76. public void eat() {
  77. System.out.println("子类吃饭");
  78. }
  79. /**
  80. * @Title: testAccess
  81. * @Description: 测试访问成员的方法
  82. */
  83. public void testAccess() {
  84. //访问成员时,在不考虑private修饰的情况下
  85. //本类对象成员用this.调用
  86. //父类成员用super.调用
  87. System.out.println(this.address);//北京
  88. System.out.println(super.name);//Rose
  89. System.out.println(super.age);//16
  90. this.eat();//子类吃饭
  91. super.eat();//吃饭
  92. int i = 100;
  93. System.out.println(i);//100
  94. System.out.println(this.i);//200
  95. System.out.println(super.i);//300
  96. }
  97. }