day8_自我总结

一、回顾

1.idea debug调试
  A.设置断点
  B.使用debug运行
  C.观察代码的执行  以及变量的变化
  D.发现问题 解决问题
2.面向对象
   面向过程思想:注重于过程 注重于步骤 每一步都是亲力亲为(员工)
   面向对象思想 注重于解决问题的主体 注重于对象 不注重于步骤(老板) 偷懒
   面向对象思想与面向过程思想是相辅相成
   面向对象三大特征: 封装  继承 多态.....
3.类:是一组属性与行为的集合
     属性:用于描述事物的特征
     行为:用于描述事物的执行动作
4.对象: 类的具体的表现  对象肯定具有类的属性与行为
5.关系: 类是对象的抽象 对象是类的具体表现
6.定义类:
     访问修饰符 class 类名{
         属性 ==>成员变量
         方法 ==>成员方法
     }
7.实例化对象
    语法: 类名 对象名 = new 类名();
    访问成员变量
       赋值 对象名.属性名
       取值 对象名.属性
    访问成员方法
        对象名.方法名(参数列表)
8.一个对象创建的内存图
9.两个引用指向同一个堆内存图
10.引用数据类型作为方法的参数
11.匿名对象
    语法: new  类名()
    使用场景:
      A.使用匿名对象调用方法 只调用一次
      B.作为方法的实际的参数
      C.作为方法的返回值
     
   
 

二、成员变量与局部变量比较

A.定义的位置不同
   成员变量定义在类中方法外  局部变量是定义在方法中
B.生命周期不同
   成员变量随着对象的加载而加载  随着对象的消失而消失
   局部变量随着方法的调用而加载  随着方法的结束而结束
C.存的位置不同
   成员变量是存在堆内存中  局部变量是存在栈内存中
D.是否有默认值
   局部变量没有默认值  局部变量必须先赋值 才能使用
   成员变量是有默认值
      整数类型 0  小数类型0.0 字符类型'\u0000' 布尔类型false 引用数据类型 null
         

三、封装

1. 对属性进行封装 使用关键字 private
   a.关键字: private 私有 私人
   b.修饰成员 类 方法  变量   ......
   c.使用private进行修饰 只能本类进行访问
2. 方案:
   问题:
     使用private修饰的成员 只能本类进行访问
   解决:
      提供两个对外访问方法  setxxx() getxxx() ==>xxx 表示的是属性的名称
       setxxx() ==>用于来设置值
       getxxx()==> 用于来获取值
3. 方案
   问题:方法的参数名与成员变量的名称相同 导致成员变量赋值失败
   原因:
      变量访问是离声明变量最近的位置
      在方法中 局部变量优先级大于成员变量  ==>优先访问局部变量 
   解决:
      使用关键字 this  表示当前对象的引用==>就是当前对象
      this.变量名==>访问的是成员变量
      this.方法名==>访问的是成员方法
      this()==>访问是构造方法
4. 快捷键
  alt +insert

代码-01

package com.qf.test04;

public class Student {
     private String name;
     private int age;

    //设置值
    public void setName(String n) {
        name = n;
    }

    //获取值
    public String getName() {
        return name;
    }


    public  void setAge(int a) {
        age =a;
    }

    public int getAge(){
        return age;
    }

}

代码-01

package com.qf.test04;

public class Test01 {
    public static void main(String[] args) {
        //实例化对象
        Student boduo  = new Student();
        //给成员变量赋值
       // boduo.name="波多老师";
        //调用set方法进行赋值
        boduo.setName("小泽老师");
        System.out.println(boduo.getName());

        //boduo.age=18;
        boduo.setAge(20);
        System.out.println(boduo.getAge());
    }
}

代码-02

package com.qf.test04;

public class Student {
     private String name;
     private int age;

    //设置值
    public void setName(String name) {
        this.name = name;
    }

    //获取值
    public String getName() {
        return name;
    }


    public  void setAge(int age) {
        if (age < 0 || age  >120){
            this.age=18;
        }else {
            this.age =age;
        }

    }

    public int getAge(){
        return age;
    }
}

代码-02

package com.qf.test04;

public class Test01 {
    public static void main(String[] args) {
        //实例化对象
        Student boduo  = new Student();
        //给成员变量赋值
       // boduo.name="波多老师";
        //调用set方法进行赋值

        boduo.setName("小泽老师");
        System.out.println(boduo.getName());

        //boduo.age=18;
        boduo.setAge(10);
        System.out.println(boduo.getAge());
    }
}

四、构造方法

  1. 作用:
    a.构造方法用于来实例化对象
    b.构造方法用于 接下来能够给成员变量赋值的操作
    c.所有实例化对象 都要执行构造方法(即:在实例化一个对象的时候,其会默认直接执行 方法中存在的无参构造)

  2. 分类:
    a.无参构造
    b.有参构造

  3. 语法:

    访问修饰符 类名(参数列表) {
    	//给成员变量赋值
    }
    
  4. 例子:

    public Student(){
    
    } 
    
  5. 说明:
    A.构造方法的方法名必须是类名
    B.构造方法是可以使用return; 用于结束构造方法 但不能具体return返回具体的数据
    C.构造方法不能自身进行调用 必须由jvm来进行调用

  6. 注意点:
    A.在一个类中 如果不提供任何的构造方式 系统默认会提供一个无参构造方法
    B.在一个类中 如果提供了(存在)任何的构造方法 系统则不会提供默认的无参构造方法
    C.构造方法是可以重载
    D.在实际开发中 一般会提供两种构造方法 一种是有参构造 一种无参构造

  7. 快捷键 alt + insert

  8. set方法与构造方法比较
    a.相同点:都可以用于来给成员变量赋值
    b.不同点:
    构造方法只能在创建对象的时候 给成员变量赋值一次
    set方法可以多次给成员变量赋值

五、案例

step01 需求:定义一个企鹅类 属性:名称 性别 爱心值 健康值 方法: 打印对象的属性值

​ 实例化5个企鹅对象 通过键盘录入信息 将企鹅对象保存到数组 并且打印企鹅的信息(get方法获取)

​ 通过构造方法给属性赋值

step02 分析

A.定义一个企鹅类
B.定义一个数组  数组类型 企鹅类
C.使用键盘录入企鹅对象的信息 将企鹅对象保存数组中
D.使用循环遍历 数组 获取属性值

step03 代码-定义企鹅类

package com.qf.test06;

public class Penguin {
    //私有的属性
    private String name;
    private String sex;
    private  int health;
    private  int love;
    //提供两个构造方法 有参  无参构造
    public  Penguin(){}

    public  Penguin(String name,String sex,int health,int love){
        this.name=name;
        this.sex=sex;
        this.health=health;
        this.love=love;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getHealth() {
        return health;
    }

    public void setHealth(int health) {
        this.health = health;
    }

    public int getLove() {
        return love;
    }

    public void setLove(int love) {
        this.love = love;
    }

    //定义一个方法打印属性值
    public   void  print(){
        System.out.println(name+"\t"+sex+"\t"+health+"\t"+love+"\t");
    }
}

step04 -代码-测试类

package com.qf.test06;

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        //实例化Scanner
        Scanner  input  = new Scanner(System.in);
        //定义一个数组
        Penguin [] penguins = new Penguin[2];
        //使用循环给对象的属性进行赋值
        for (int i=0;i<penguins.length;i++) {
            System.out.println("请输入企鹅的名称");
            String name =input.next();
            System.out.println("请输入企鹅性别");
            String sex = input.next();
            System.out.println("请输入企鹅健康值");
            int health = input.nextInt();
            System.out.println("请输入企鹅的爱心值");
            int love = input.nextInt();
            //实例化对象并且给成员变量赋值
            Penguin p  = new Penguin(name,sex,health,love);
            //将对象存入的数组
            penguins[i] =p;

        }

        //使用循环遍历 获取数组中每一个对象
        for (int i=0;i<penguins.length;i++) {
            Penguin p =penguins[i];
            //System.out.println(p.getName()+"\t"+p.getSex()+"\t"+p.getHealth()+"\t"+p.getLove());
            p.print();
        }


    }
}

六、静态

6.1 概念

1.静态的关键字:static 
2.修饰的成员 
   a.类 
   b.方法
   c.变量
3.好处:
   没有静态之前:
    多个对象相同的属性值的时候 需要开辟多个空间开进行存储  浪费内存空间  修改数据比较麻烦
    有静态之后:
     多个对象相同的属性值 只需要在方法区中静态区间开辟一块空间  实现所有对象共享  节省内存空间
     修改数据比较方便
      

没有静态之前

image-20220720142016287

有静态之后

image-20220720143345771

6.2 静态变量

1.语法: static  数据类型  变量名 
2.静态变量优先与对象先进行加载
3.静态变量是存在方法区中的静态区间中
4.静态变量的访问方式
   a.通过类名来进行访问  语法: 类名.静态变量名称  例子: Actor.country  提倡
   b.通过对象名来进行访问 语法: 对象名.静态变量的名称 例子: a1.country  不提倡使用
5.静态变量所属类变量 随着类的加载而加载  静态变量不容易被gc进行回收(最后被回收)

6.3 静态方法

1.语法:
   访问修饰符  static  返回值类型 方法名称(参数列表) {
       方法体;
       return 返回值;
   }
2.例子:
   public   static   void  showInfo(){}
3.注意点:
   A.静态的方法不能访问非静态的变量
     原因: 静态资源优先与对象存在
   B.静态方法不能调用非静态的方法
     原因:与上面同理
   C.静态方法不能访问this关键
      原因:与上面同理
   总结: 静态方法不能访问非静态的资源

6.4 静态变量与成员变量的比较

1.所属不同
   静态变量属于类变量  成员变量属性对象变量
2.存储的位置不同
   静态变量是存在方法区中静态区间中   成员变量是存在堆内存中
3.生命周期不同
  A.静态的变量是随着类的加载而加载 最后被gc进行回收 
  B.成员变量是随着对象的加载而加载 随着对象的销毁而销毁
4.访问的方式不同
  A.静态变量调用方式  a.直接通过类名来进行访问(推荐) b.通过对象名来进行访问
  B.成员变量的调用方式 只能通过对象名来进行访问

七、继承

7.1继承概念

image-20220720151513496

1.继承中至少有两个类 一个是父类   一个是子类
2.继承关键字 extends
3.继承:就是共性的抽取 
4.满足is  a 的关系才能使用继承   我是你爸爸 就可以使用继承
5.子类可以获取父类的资源 但是父类不能获取子类的资源

step01 -定义一个类员工类

package com.qf.test08;

public class Emp {

    String  name;
    int  age;

}

step02 定义老师类

package com.qf.test08;

public class Teacher extends  Emp {

    public void work(){
        System.out.println("授课......");
    }
}

step03 定义类-助教类

package com.qf.test08;

public class Assistant extends  Emp {
    public void  work(){
        System.out.println("辅导..........");
    }
}

step04 -测试类

package com.qf.test08;

public class Test {
    public static void main(String[] args) {
        //实例化老师类
        Teacher t1 = new Teacher();
        t1.name="小野老师";
        t1.age=18;
        System.out.println(t1.name);
        System.out.println(t1.age);
        //实例化助教类
        Assistant as = new Assistant();
        as.name="吴荣俊";
        as.age=20;
        System.out.println(as.name);
        System.out.println(as.age);

        //实例化父类对象
        Emp e = new Emp();




    }
}

7.2 继承的注意点

1.子类不能继承到父类私有(private)的资源
  原因:使用private修饰的资源 只能本类进行访问
2.子类不能继承到父类的构造方法
  子类不能继承到父类的构造方法  但是可以调用父类的构造方法 通过关键字super
  访问父类的无参构造  super()
  访问父类的有参构造  super(参数列表)

7.3 java单继承问题

1.在java中 一个类只能有一个直接的父类(亲爸爸)  但是可以有间接的父类(爷爷类)
  java只支持单继承  不支持多继承  但是支持多层继承
2.如果一个类没有继承任何类 那么这个类默认继承Object Object类是所有的类的直接爸爸或者是间接爸爸
3.想象成一叉数

image-20220720160935120

7.4 继承中访问成员变量的特点

1.特点:
   优先访问子类的成员变量 如果子类没有 则向上进行查找 一直查找到Object类  如果Objet类都没有则报错

step01 -代码-父类

package com.qf.test09;

public class Fu extends  Object{

    int  numFu=100;
    int num=200;

}

step02 -代码-子类

package com.qf.test09;

public class Zi extends  Fu {
     int numZi =300;
//     int num =400;

}

step03-代码-测试类

package com.qf.test09;

public class Test {
    public static void main(String[] args) {
        //实例化子类对象
        Zi  z = new Zi();
        System.out.println(z.num);
        //一直向上进行查找 如果查找到Object  没有 则报错
       // System.out.println(z.kk);
    }
}

7.5 this与super

1.this 与super
  this ==> 表示的是当前对象的引用 super==>当前对象父类对象的引用
2.访问成员变量
    this 既可以获取自身的成员变量 也可以获取父类的成员变量
    super只能获取父类的成员变量
3.访问成员方法
    this 既可以获取自身的成员方法 也可以获取父类的成员方法
    super 只能获取父类的成员方法
4.访问构造方法
    this() ==>表示调用自身的无参构造方法    this(参数)==>表示调用自身的有参构造方法
    super()==>表示调用父类的无参构造方法    super(参数)==>表示调用父类的有参的构造方法

image-20220720165725533

step01 父类

package com.qf.test10;

public class Fu {
    int num =10;
    public void show(){
        System.out.println("我是父类的方法");
    }
}

step02 子类

package com.qf.test10;

public class Zi extends  Fu {
    int num =20;
    public  void  show(){
        //调用父类的show方法
        super.show();
        System.out.println("我是子类的show方法");
    }
    public  void showInfo(int num){
        System.out.println(num);
        System.out.println(this.num);
        System.out.println(super.num);

    }
}

step03 测试类

package com.qf.test10;

public class Test {
    public static void main(String[] args) {
        //实例化子类对象
        Zi  z = new Zi();
        z.show();
        z.showInfo(30);
    }
}

posted @ 2022-07-20 20:25  真lyz  阅读(36)  评论(0)    收藏  举报