1.基础复习超市购物小票案例
1.1超市购物小票需求分析
模拟真实购物逻辑,以上述图片为需求原型,根据不同购买物品,完成购物小票内容打印到控制台。(简化项目逻辑,票脚部分只完成数据统计)
数据:
将超市购物小票案例中零散数据(名称、货号、单价、数量、计价单位、金额)封装为货物对象。
所有的货物对象放置到集合中统一管理。
逻辑:
用户循环进行三个操作:
输入购买数量,代表为所购买货物的数量赋值,从而计算每项商品金额
打印小票,将已有数据打印
退出系统(因为该程序为循环操作,无法终止,如果不想再进行操作,则退出系统)
1.2超市购物小票知识点分析
复习知识点:
变量定义:记录部分数据
集合的使用:用于存储多个完整数据
运算符的使用:计算变量
流程控制语句的使用:
if语句:用于判断是否购买了商品
switch语句:用于进行三个操作(输入购买数量、打印小票、退出系统)的分支
for语句:switch外部使用for循环,当执行一个操作后,继续进行下一个操 作选择
方法封装:
由于代码量比较多,可以将输入购买数量、打印小票封装为方法使用
字符串/键盘录入:
打印小票完整过程均为字符串的拼写及打印,数量输入为键盘录入Scanner 完成
步骤:
定义GoodsItem类(名称,货号,单价,数量,计价单位,金额)
成员位置定义集合,定义方法向集合中存储所有GoodsItem数据
实现主干逻辑
打印欢迎语句
使用for/while进行循环进行操作
使用switch给出操作选择:1输入购买数量2打印小票3退出
完成switch中三个case的逻辑
运用方法封装功能:将1输入购买数量、2打印小票封装为独立方法,在case中 调用,提高代码可读性。
import java.util.ArrayList;
import java.util.Scanner;
/**
* @author Lynn
* @create 2020-11-28-15:14
*/
public class ShoppingReceipt {
//定义集合:成员位置定义集合,存储所有的商品项对象
static ArrayList<GoodsItem> list=new ArrayList<GoodsItem>();
public static void main(String[] args) {
//为集合准备数据--调用方法
initDate();
//打印欢迎语
System.out.println("欢迎使用超市管理系统!");
//实现主干
//使用死循环完成反复操作
while (true){
System.out.println("请输入您要进行的操作:1输入购买数量 2打印小票 3退出");
//键盘录入
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
//switch--case
switch (n){
case 1:
//System.out.println("给所有数据量赋值");
enterNum();
break;
case 2:
//调用打印购物小票的方法
print();
break;
case 3:
//退出
System.out.println("欢迎下次光临");
System.exit(0);//正常退出
default:
System.out.println("请输入正确的数字!");
break;
}
}
}
//写一个方法为集合赋值
public static void initDate(){
//创建多个商品对象
GoodsItem sls=new GoodsItem("少林寺核桃", "090115", 15.5, 0, "个", 0);
GoodsItem shk = new GoodsItem("尚康饼干", "090027", 14.5, 0, "个", 0);
//添加到集合
list.add(sls);
list.add(shk);
}
//赋值数量与金额
public static void enterNum(){
//遍历集合
for (int i = 0; i < list.size() ; i++) {
//获取每一个商品
GoodsItem thisGoods= list.get(i);
//输入数量
//先要获取该商品的名称
String thisName= thisGoods.getName();
//键盘录入数量
Scanner sc=new Scanner(System.in);
System.out.println("请输入"+thisName+"的数量:");
int num=sc.nextInt();
//计算金额
double thisMoney= thisGoods.getPrice()*num;
//为该商品的数量与金额赋值
thisGoods.setCount(num);
thisGoods.setMoney(thisMoney);
}
}
//打印小票
public static void print(){
//票头
System.out.println(" 欢迎光临");
System.out.println("品名\t商品号\t售价\t数量\t单位\t金额");
System.out.println("-------------------------------------------");
//票体
//定义变量,记录所有商品数量
int totalNum=0;
//记录所有金额
double totalMon=0;
//遍历集合
for (int i = 0; i < list.size(); i++) {
//获取每一个商品
GoodsItem g= list.get(i);
//打印商品项
System.out.println(g.getName()+g.getId()+"\t"+g.getPrice()+"\t"+g.getCount()+" "+g.getUnit()+"\t"+g.getMoney());
//累加数量与金额
totalNum+=g.getCount();
totalMon+=g.getMoney();
System.out.println("-------------------------------------------");
//票脚
System.out.println("共"+list.size()+"项商品");
System.out.println("共"+totalNum+"件商品");
System.out.println("共"+totalMon+"元");
System.out.println();
}
}
}
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) {
} }Person s=new Person();
s.showName();
<a name="iH2QB"></a>
### 3.1this作用:
- **使用this可以区分成员变量和局部变量,处理成员变量和局部变量同名的情况**
- 如果一个方法内访问不带this的变量,则遵循以下的顺序,先查找局部变量,再去查找成员变量
- 如果一个方法内访问带this的变量,在只在成员变量中查找
- this代表的就是当前对象的引用:
- 类的方法定义过程中定义this,代表调用这个方法的对象,是一个不确定的对象
- 可以简单的理解为:**哪个对象调用这个方法,this代表的就是那个对象**
```java
Person类(省略)
package com.igeek_03;
/**
* @author Lynn
* @create 2020-11-30-9:42
*/
/**
* this作用:
* 使用this可以区分成员变量和局部变量,处理成员变量和局部变量同名的情况
*
* 如果一个方法内访问不带this的变量,则遵循以下的顺序,先查找局部变量,再去查找成员变量
* 如果一个方法内访问带this的变量,在只在成员变量中查找
*
* this代表的就是当前对象的引用:
* 类的方法定义过程中定义this,代表调用这个方法的对象,是一个不确定的对象
* 可以简单的理解为:哪个对象调用这个方法,this代表的就是那个对象
*/
public class ThisDemo {
public static void main(String[] args) {
//创建对象
//this表示p1
Person p1=new Person("王嘉尔",25);
p1.showName();
//this表示p2
Person p2=new Person("嘎嘎",25);
p2.showName();
}
}
4.编程中两种结构关系
4.1组合关系—将某一个对象作为成员变量时,两种数据就存在了组合关系
package igeek_04;
/**
* @author Lynn
* @create 2020-11-30-9:38
*/
/**
* this版本的实体类
*/
/**
* 演示组合关系:
* 在编程中有两种结构关系
* 1.组合关系:将某一个对象作为成员变量时,两种数据就存在了组合关系
* 2.继承关系:子级继承父级的内容
*/
public class Person {
private String name;
private int age;
private Pet pet;//定义一个(宠物)对象(对象注入)
public Person() {
}
public Person(String name, int age,Pet pet) {
this.name = name;
this.age = age;
this.pet=pet;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
//调用的是一个成员方法,可以用this调用
public void showName(){
System.out.println("我的名字是:"+this.name+",我今年"+this.age);
System.out.println("我的宠物叫:"+name+",它是"+pet.getColor()+"品种是"+ pet.getBrand());
}
}
package igeek_04;
/**
* @author Lynn
* @create 2020-11-30-10:07
*/
/**
* 这是一个宠物对象
* 成员属性:
* 姓名,颜色,种类
*/
public class Pet {
//成员属性
private String name;
private String brand;
private String color;
public Pet() {
}
public Pet(String name, String brand, String color) {
this.name = name;
this.brand = brand;
this.color = color;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}
package igeek_04;
/**
* @author Lynn
* @create 2020-11-30-10:13
*/
/**
* 测试组合关系
*/
public class CompositionDemo {
public static void main(String[] args) {
//准备对象
String name="杨戬";
int age=2000;
//准备pet
Pet pet=new Pet("哮天犬","中华田园犬","黑色");
//创建person对象
Person ps=new Person(name,age,pet);
//调用方法
ps.showName();
}
}
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(){
System.out.println("ganfan");
} public void sleep(){
System.out.println("sleep");
} }
/**
- @author Lynn
- @create 2020-11-30-10:41 */
/**
- 程序员—子类 *
- 继承自人类
- 在人类的基础上进行拓展
*/
public class Coder extends Person {
public void codding(){
} }System.out.println("helloworld");
/**
- @author Lynn
- @create 2020-11-30-10:43 */
import java.sql.SQLOutput;
/**
- 老师—-子类
*/
public class Teacher extends Person {
public void teach(){
} }System.out.println("传道受业解惑");
/**
- @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) {
//创建子类对象
Coder c=new Coder();
//子类继承了父类的属性
c.name="詹姆斯.高斯林";
c.age=60;
System.out.println(c.name+","+c.age);
//子类继承了父类的方法
c.eat();
c.sleep();
//子类访问自己的方法
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(){
System.out.println("干饭啦!");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
} }
/**
- @author Lynn
- @create 2020-11-30-11:14 */
/**
父类2 */ public class Fu2 extends Object{ private String name;
public void eat(){
System.out.println("干饭啦!");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
} }
/**
- @author Lynn
- @create 2020-11-30-11:15 */
/**
- 子类1 *
- 子类一次只能继承一个父类
*/
public class Zi1 extends Fu1{
}
/**
- @author Lynn
- @create 2020-11-30-11:18 */
/**
- 孙子类1
- java中只支持单继承,Sun1类只能继承Zi1 *
- 隔代继承—多层继承
*/
public class Sun1 extends Zi1{
}
/**
- @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) {
//直接创建孙子类
Sun1 sun=new Sun1();
//孙子类直接调用爷爷类的成员
sun.setName("林更新");
System.out.println(sun.getName());
sun.eat();
5.重写
5.1方法的重写:
- 重写:其实就是覆盖
- 当子类继承父类的时候,子类继承父类中的方法,可以增强父类中的方法的功能
- 格式:
- 定义一个与父类方法完全一致的方法,方法体{}中内容重写
- 方法重写后,调用该方法时不在调用父类的方法,而调用子类中重写后的方法
- 方法重写注意事项:1.方法名称必须相同,参数列表必须相同
2.子类访问权限大于等于父类的(public > 默认 )
3.返回值一般必须相同
package com.igeek_01; /**
* @author Lynn
* @create 2020-11-30-14:01
*/
/**
* 父类
* 动物父类中有方法
*/
public class Animal {
//吃
public void eat(){
System.out.println("动物在吃东西");
}
//睡觉
public void sleep(){
System.out.println("动物在睡觉");
}
}
package com.igeek_01; /**
* @author Lynn
* @create 2020-11-30-14:03
*/
import com.igeek_01.Animal;
/**
* 子类--狗
*
* 继承父类的方法,然后在这个方法的基础上进行拓展--通过方法的重写
*/
public class Dog extends Animal {
//方法的重写
//这是一个重写的检查标记,利用这个标记修饰的方法必须是重写的,要不然会出错
@Override
public void eat(){
System.out.println("哮天犬在啃骨头");
}
}
package com.igeek_01; /**
* @author Lynn
* @create 2020-11-30-13:59
*/
import com.igeek_01.Dog;
/**
* 方法的重写:
* 重写:其实就是覆盖
* 当子类继承父类的时候,子类继承父类中的方法,可以增强父类中的方法的功能
*
* 格式:
* 定义一个与父类方法完全一致的方法,方法体{}中内容重写
*
* 方法重写后,调用该方法时不在调用父类的方法,而调用子类中重写后的方法
*
*/
public class OverRideDemo {
public static void main(String[] args) {
//测试重写
//创建子类
Dog d=new Dog();
d.eat();//哮天犬在啃骨头---子类中的方法
d.sleep();//动物在睡觉-----这个方法是父类中的方法,因为没有重写
}
}
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(){
System.out.println("动物在吃东西");
} //睡觉 public void sleep(){
System.out.println("动物在睡觉");
}
//私有的方法只能在本类中被访问 private void drink(){
System.out.println("喝水");
}
}
```java
package com.igeek_01_up; /**
* @author Lynn
* @create 2020-11-30-14:03
*/
/**
* 子类--狗
*
* 继承父类的方法,然后在这个方法的基础上进行拓展--通过方法的重写
*
* 方法的重写中注意一个事项:
* 访问权限的问题:
* 父类中方法的访问权限小于等于子类中的方法的访问权限,
* 默认(即没有权限修饰符)<public
*
* 注意:
* private修饰的属性,可以被继承,但是如果子类要访问需要通过get/set方法申请
* privave修饰的方法,不能被重写--原因是权限修饰符的存在
*/
public class Dog extends Animal {
//方法的重写
//这是一个重写的检查标记,利用这个标记修饰的方法必须是重写的,要不然会出错
@Override
public void eat(){
System.out.println("哮天犬在啃骨头");
}
/* @Override
private void drink(){
System.out.println("hehehsui");
}*/
}
package com.igeek_01_up; /**
* @author Lynn
* @create 2020-11-30-13:59
*/
/**
* 方法的重写:
* 重写:其实就是覆盖
* 当子类继承父类的时候,子类继承父类中的方法,可以增强父类中的方法的功能
*
* 格式:
* 定义一个与父类方法完全一致的方法,方法体{}中内容重写
*
* 方法重写后,调用该方法时不在调用父类的方法,而调用子类中重写后的方法
*
*/
public class OverRideDemo {
public static void main(String[] args) {
//测试重写
//创建子类
Dog d=new Dog();
d.eat();//哮天犬在啃骨头---子类中的方法
d.sleep();//动物在睡觉-----这个方法是父类中的方法,因为没有重写
// d.drink();
}
}
6.构造函数测试类
/**
* @author Lynn
* @create 2020-11-30-14:32
*/
/**
* 当前案例用于演示继承中的内层操作
*
* 在继承的过程中其实是对构造函数的使用
*/
public class Fu {
//属性
private String name;
//无参构造函数
public Fu(){
System.out.println("父类的无参构造函数被调用了");
}
//有参构造函数
public Fu(String name){
this.name=name;
System.out.println("父类的有参构造函数被调用了");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
/**
* @author Lynn
* @create 2020-11-30-14:35
*/
/**
*
*/
public class Zi extends Fu{
/*//无参构造函数
public Zi(){
System.out.println("子类的无参构造函数被调用了");
}*/
public Zi() {
//super这个关键字用于调用父类中的内容
super();//父类的无参构造函数
}
}
/**
* @author Lynn
* @create 2020-11-30-14:37
*/
import javax.naming.Name;
/**
* 构造函数的测试类
*
* 实现继承的原因是:
* 子类在继承父类的时候会自动调用父类的无参构造函数--通过super()这个方法调用了父类的无参构造函数
* 使得父类和子类之间产生了继承关系
*/
public class ConstructorDemo {
public static void main(String[] args) {
//创建一个子类对象
new Zi();//父类的空参构造方法被调用了
//子类的构造方法被调用了
}
}
7.super&this
this:当前对象
- this.成员变量—调用当前对象的内容(访问本类对象的成员变量)
this.成员方法()—调用本类中的构造函数(访问本类对象的成员方法)—写在构造函数的第一行
super:父类的对象(父类的对象空间)
super.—调用父类对象的内容
- super()—调用父类中的构造函数—写在构造函数的第一行
super()在子类中调用父类中的构造函数
this()在子类中调用子类(本类)的其它构造函数
子类的构造函数中,要么第一行是super()调用父类的构造函数,要么是this()用于调用子类(本类)中的其它构造函数
子类中每一个构造函数都有一个默认的super()调用了父类的无参构造函数,如果手动调用会将自动生成的覆盖
package igeek_03;
/**
* @author Lynn
* @create 2020-11-30-15:00
*/
public class Person {
private String name;
private int age;
public Person() {
super();//调用父类的无参构造函数
System.out.println("父类中的构造函数被子类调用了");
}
public Person(String name, int age) {
this();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
package igeek_03;
/**
* @author Lynn
* @create 2020-11-30-15:02
*/
/**
* 子类--中国人
*
* 在父类的基础上,拓展一个地址属性
*/
public class Chinese extends Person{
private String address;
public Chinese() {
}
public Chinese(String name,int age,String address) {
//必须写在构造函数的第一行
super(name,age);//手动调用父类的有参构造函数
/*this.name=name;
this.age=age;*/
//直接拿到父类中的属性
this.address = address;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
package igeek_03;
/**
* @author Lynn
* @create 2020-11-30-15:10
*/
/**
* this:当前对象
* this.--调用当前对象的内容
* this()--调用本类中的构造函数--写在构造函数的第一行
*
* super:父类的对象(父类的对象空间)
* super.--调用父类对象的内容
* super()--调用父类中的构造函数--写在构造函数的第一行
*
* Person--父类
* name,age
* Chinese--子类
* address
*/
public class ThisSuperDemo {
public static void main(String[] args) {
//创建子类--调用子类的构造函数
Chinese c=new Chinese("黄药师",80,"桃花岛");
System.out.println(c.getName()+","+c.getAge()+","+c.getAddress());
}
}
package igeek_04;
/**
* @author Lynn
* @create 2020-11-30-15:30
*/
/**
* 父类
*/
public class Person {
//声明属性的时候直接赋值(那么默认就是rose和16)
private String name="Rose";
private int age=16;
public void eat(){
System.out.println("可乐鸡翅I like");
}
//无参
public Person() {
System.out.println("调用父类的无参构造方法");
}
//有参
public Person(String name, int age) {
this.name = name;
this.age = age;
System.out.println("调用父类的有参构造方法");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
package igeek_04;
/**
* @author Lynn
* @create 2020-11-30-15:34
*/
/**
* 子类
*/
public class Chinese extends Person{
//构造
public Chinese(){
//调用的是子类本类中的其他构造函数
this("默认",20);
System.out.println("子类的无参构造函数");
}
public Chinese(String name,int age){
//调用的是父类中的有参构造
super(name,age);
System.out.println("子类的有参构造函数");
}
//重写父类中的方法
@Override
public void eat(){
System.out.println("深井烧鹅");
}
}
package igeek_04;
/**
* @author Lynn
* @create 2020-11-30-15:26
*/
/**
* super()在子类中掉头父类中的构造函数
* this()在子类中调用子类(本类)的其它构造函数
*
* 子类的构造函数中,要么第一行是super()调用父类的构造函数,要么是this()用于调用子类(本类)
* 中的其它构造函数
*
* 子类中每一个构造函数都有一个默认的super()调用了父类的无参构造函数,如果手动调用会将自动生成的覆盖
*/
public class ThisSuperConstructor {
public static void main(String[] args) {
//测试:子类调用父类中的有参构造
Chinese c=new Chinese("王嘉尔",27);
System.out.println(c.getName()+","+c.getAge());
//调用父类的有参构造方法
//子类的有参构造函数
//王嘉尔,27
System.out.println("---------------------------------");
Chinese c1=new Chinese();
System.out.println(c1.getName()+","+c1.getAge());
//调用父类的有参构造方法(有this,先调用子类本类中的其他构造方法(有参)-->super调用父类的有参
//-->子类的有参-->子类的无参-->再输出
//子类的有参构造函数
//子类的无参构造函数
//默认,20
}
}
就近原则:
局部 > 本类成员 > 父类成员
package com.igeek_04;
/**
* @author Lynn
* @create 2020-12-12-11:18
*/
public class Test {
public static void main(String[] args) {
//创建子类对象,测试子类中成员的访问方法
Chinese c = new Chinese();
c.testAccess();
}
}
class Person{
String name = "Rose";
/**
* @Fields age : 年龄
*/
int age = 16;
/**
* @Fields i : 父类中的测试变量
*/
int i = 300;
/**
* @Title: Person
*/
public Person() {
super();
}
/**
* @Title: Person
* @param name
* @param age
*/
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
/**
* @Title: eat
* @Description: 吃饭的方法
*/
public void eat() {
System.out.println("吃饭");
}
}
class Chinese extends Person{
String address = "北京";
/**
* @Fields i : 子类中的测试变量
*/
int i = 200;
/**
* @Title: Chinese
*/
public Chinese() {
super();
}
//定义三个参数的构造方法,无需了解细节,在super的讲解时会详细介绍
/**
* @Title: Chinese
* @param name
* @param age
* @param address
*/
public Chinese(String name, int age,String address) {
super(name, age);
this.address = address;
}
/**
* @Title: eat
* @Description: 子类吃饭的方法
* @see com.igeek_01.Person#eat()
*/
@Override
public void eat() {
System.out.println("子类吃饭");
}
/**
* @Title: testAccess
* @Description: 测试访问成员的方法
*/
public void testAccess() {
//访问成员时,在不考虑private修饰的情况下
//本类对象成员用this.调用
//父类成员用super.调用
System.out.println(this.address);//北京
System.out.println(super.name);//Rose
System.out.println(super.age);//16
this.eat();//子类吃饭
super.eat();//吃饭
int i = 100;
System.out.println(i);//100
System.out.println(this.i);//200
System.out.println(super.i);//300
}
}