Post

day08_面向对象

day08_面向对象 课前回顾: 1.匿名对象:没有等号左边的名字,只有new a.注意:如果涉及到赋值,别用 2.封装: a.概述:将细节隐藏起来(不让外界直接使用,随便使用),对外提供一个公共的接口(让外界通过这个接口间接使用封装起来的细节) b.体现:

javaSE 阅读 0 点赞 0 评论 0

day08_面向对象

课前回顾:
  1.匿名对象:没有等号左边的名字,只有new
    a.注意:如果涉及到赋值,别用
  2.封装:
    a.概述:将细节隐藏起来(不让外界直接使用,随便使用),对外提供一个公共的接口(让外界通过这个接口间接使用封装起来的细节)
    b.体现:
      将一段代码放到一个方法中
      比较有代表性的关键字:private
  3.快速掌握封装:
    a.知道private作用嘛?隐藏细节,外界不能直接使用
    b.知道set/get方法吗?setxxx是赋值,getxxx是取值
    c.知道this关键字的作用嘛?区分重名的成员变量和局部变量 -> this.后面的一定是成员的
    d.知道无参构造作用嘛?new对象,初始化成员 -> 每个类中默认都有一个空参构造,不写jvm自带一个
    e.知道有参构造作用嘛?new对象的同时为属性赋值 -> 如果写了有参构造,jvm将不再提供无参构造了,所以建议都手写出来
    f.知道如何生成一个标准javabean嘛?包含了私有的属性,有构造方法,有get/set方法 -> alt+insert
今日重点:
  1.all

第一章.JavaBean的作用

1.javabean的作用:封装数据(说白了就是将数据给javabean中的属性赋值)
2.在实际开发过程中:
  javabean类都是和数据库的表对应
 
3.javabean和表的对应关系:
  表名 -> 类名
  列名 -> 属性名
  列的类型 -> 属性的数据类型
  每一行数据 -> javabean的对象
    a.第一行数据 -> User user1 = new User(1,"tom","111")
    b.第二行数据 -> User user2 = new User(2,"jack","222")     
image-20260119090907542

1.1.javabean在开发中的实际运用_添加功能

image-20251025094007621

封装页面上发送过来的数据,一层一层传递到dao层,在dao层中调用javabean对象中的getxxx方法,将属性值获取出来,放到sql语句中

1.2.javabean在实际开发中运用_查询功能

image-20251025095448752

封装从数据库中查询出来的数据,然后一层一层返回给页面上进行展示

第二章.对象数组

需求:定义一个数组,存3个Person对象,遍历数组,将Person对象中的属性值获取出来
image-20260119093707477
public class Person {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        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;
    }
}

public class Test01 {
    public static void main(String[] args) {
        /*
           Person p = new Person()
           1.如果定义存储int型整数的数组: int[]
           2.如果定义存储double型的整数:double[]
           3.如果定义存储String型数据:String[]
           4.如果定义存储Person类型数据的数组:Person[]
         */

        //1.定义存储Person对象的数组
        Person[] arr1 = new Person[3];
        //2.创建三个Person对象
        Person p1 = new Person("小王", 10);
        Person p2 = new Person("小张", 20);
        Person p3 = new Person("小李", 30);
        //3.将三个对象放到数组中
        arr1[0] = p1;
        arr1[1] = p2;
        arr1[2] = p3;

        //4.遍历数组
        /*
           i = 0;arr[0]就是p1 -> Person p = p1
           i = 1;arr[1]就是p2 -> Person p = p2
           i = 2;arr[2]就是p3 -> Person p = p3
         */
        for (int i = 0; i < arr1.length; i++) {
            //System.out.println(arr1[i].getName() + "..." + arr1[i].getAge());
            Person p = arr1[i];
            System.out.println(p.getName() + "..." + p.getAge());
        }
    }
}

练习:定义一个学生类,声明姓名,年龄,分数,创建5个学生对象为属性赋值,放数组中,然后按照分数排序

第三章.继承

1.什么是继承

面向对象三大特征: 封装 继承 多态

1.父类怎么形成的:多个类中有相同的成员,我们就定义了一个父类,将相同的成员抽取到父类中,子类直接继承父类
然后直接使用父类抽取出来的成员

2.格式: 子类 extends 父类

3.注意:
  a.子类可以继承父类中私有和非私有成员,但是不能直接使用私有成员
  b.构造方法不能继承
  c.静态方法可以继承但是不能被重写

4.如何学继承:
  a.要从"是否能使用"方面来学;不要从"是否拥有"
    方面来学
  b.继承是"代码的设计理念",所以可用可不用
     但是用了就比不用强,所以建议使用
image-20260119104354594

2.继承如何使用

public class Employee {
    String name;
    int age;

    public void work() {
        System.out.println("员工正在工作...");
    }
    
    private void eat(){
        System.out.println("员工正在吃...");
    }
}

public class Teacher extends Employee{
}
public class Manager extends Employee{
}
public class Test01 {
    public static void main(String[] args) {
        Teacher t1 = new Teacher();
        t1.name = "涛哥";
        t1.age = 16;
        System.out.println(t1.name+"..."+t1.age);
        t1.work();
        //t1.eat();继承之后也不能直接使用父类中私有成员

        System.out.println("======================");
        Manager m1 = new Manager();
        m1.name = "许姐";
        m1.age = 18;
        System.out.println(m1.name+"..."+m1.age);
        m1.work();
        //m1.eat();继承之后也不能直接使用父类中私有成员
    }
}

3.继承中,成员变量和成员方法的访问特点

3.1 成员变量

3.1.1 子类和父类中的成员变量不重名:

public class Fu {
    public int numFu = 100;
}

public class Zi extends Fu{
    public int numZi = 10;
}
public class Test01 {
    public static void main(String[] args) {
        Fu fu = new Fu();
        System.out.println(fu.numFu);

        Zi zi = new Zi();
        System.out.println(zi.numFu);
        System.out.println(zi.numZi);
    }
}

2.1.2.子类和父类中的成员变量重名

public class Fu {
    public int numFu = 100;

    public int num = 10000;
}

public class Zi extends Fu{
    public int numZi = 10;

    public int num = 1000;
}

public class Test01 {
    public static void main(String[] args) {
        Fu fu = new Fu();
        System.out.println(fu.numFu);
        System.out.println(fu.num);//父类中的
        System.out.println("===========================");
        Zi zi = new Zi();
        System.out.println(zi.numFu);
        System.out.println(zi.numZi);
        System.out.println(zi.num);//子类中的

        System.out.println("============================");
        //多态
        Fu f = new Zi();
        System.out.println(f.num);
    }
}

看等号左边是谁,先调用谁中的成员变量;子类没有找父类

2.2 成员方法

2.2.1.子类和父类中的成员方法不重名:

public class Fu {
    public void numFu(){
        System.out.println("父类numFu方法");
    }
}
public class Zi extends Fu{
    public void numZi(){
        System.out.println("子类numZi方法");
    }
}

public class Test01 {
    public static void main(String[] args) {
        Fu fu = new Fu();
        fu.numFu();

        System.out.println("===========================");
        Zi zi = new Zi();
        zi.numZi();
        zi.numFu();
    }
}

2.2.2.子类和父类中的成员方法重名

public class Fu {
    public void numFu(){
        System.out.println("父类numFu方法");
    }

    public void num(){
        System.out.println("父类num方法");
    }
}

public class Zi extends Fu{
    public void numZi(){
        System.out.println("子类numZi方法");
    }

    public void num(){
        System.out.println("子类num方法");
    }
}
public class Test01 {
    public static void main(String[] args) {
        Fu fu = new Fu();
        fu.numFu();
        fu.num();//父类num方法

        System.out.println("===========================");
        Zi zi = new Zi();
        zi.numZi();
        zi.numFu();
        zi.num();//子类num方法

        System.out.println("===========================");

        //多态
        Fu f = new Zi();
        f.num();
    }
}

看new的是谁,先调用谁中的成员方法;子类没有,找父类

4.方法的重写

1.概述:
  子类中有一个和父类方法名以及参数列表都一样的方法,这个方法叫做重写的方法
2.怎么确定此方法是不是重写的:
  @Override -> 在方法上写 -> 如果这个单词不报错就是重写的,否则就不是重写的方法
3.使用:
  如果new的是子类对象,首先要调用子类重写的方法
public class Fu {
    public void numFu(){
        System.out.println("父类numFu方法");
    }

    public void num(){
        System.out.println("父类num方法");
    }
}


public class Zi extends Fu{
    public void numZi(){
        System.out.println("子类numZi方法");
    }

    /**
     * 重写的方法
     */
    @Override
    public void num(){
        System.out.println("子类num方法");
    }
}

public class Test01 {
    public static void main(String[] args) {
        Fu fu = new Fu();
        fu.numFu();
        fu.num();//父类num方法

        System.out.println("===========================");
        Zi zi = new Zi();
        zi.numZi();
        zi.numFu();
        zi.num();//子类num方法

        System.out.println("===========================");

        //多态
        Fu f = new Zi();
        f.num();
    }
}

4.1.注意事项

1. 子类方法重写父类方法,必须要保证权限大于等于父类权限。(权限修饰符)
   public  -> protected -> 默认 -> private 
2. 子类方法重写父类方法,方法名和参数列表都要一模一样。
3. 私有方法不能被重写,构造方法不能被重写,静态方法也不能重写
4. 子类重写父类方法之后,返回值类型应该是父类方法返回值类型的子类类型  
   一般情况下,子类重写父类方法之后,都一样
5.私有方法可以继承但是不能被重写,构造方法不能被继承,也不能被重写,静态的能继承,但不能重写
public class Fu {
    public void method(){
        System.out.println("父类方法");
    }

    public Fu method01(){
        return null;
    }
}

public class Zi extends Fu{
    @Override
    public void method(){
        System.out.println("父类方法");
    }

    @Override
    public Zi method01(){
        //返回的null没有什么特殊含义,仅仅是让方法有一个返回值而已
        return null;
    }
}

4.2.使用场景

1.在子类中对父类中的方法进行升级改造
image-20260119142705633
public class OldPhone {
    public void call(){
        System.out.println("打电话");
    }
    public void sendMessage(){
        System.out.println("发短信");
    }
    public void show(){
        System.out.println("显示手机号");
    }
}
public class NewPhone extends OldPhone{
    public void show(){
        System.out.println("显示手机号");
        System.out.println("显示归属地");
        System.out.println("显示头像");
    }
}

public class Test01 {
    public static void main(String[] args) {
        OldPhone oldPhone = new OldPhone();
        oldPhone.call();
        oldPhone.sendMessage();
        oldPhone.show();
        System.out.println("======================");
        NewPhone newPhone = new NewPhone();
        newPhone.call();
        newPhone.sendMessage();
        newPhone.show();
    }
}

5.继承的特点

1.继承支持单继承,不能多继承
  public class Zi extends Fu{}
  public class Fu extends Ye{}

  pubilc Zi extends Fu,Ye{} -> 不正确,不能多继承
      
2.继承支持多层继承:
  public class Zi extends Fu{}
  public class Fu extends Ye{}

3.继承支持一个父类有多个子类
  public class Zi extends Fu{}
  public class Bro extends Fu{}

6.继承中构造方法的特点

1.特点:创建子类对象时,先初始化父类
2.原因:每一个类中的构造方法第一行默认有一个super(),不写jvm自动提供一个
3.super():代表的是调用父类无参构造
public class Fu{
    public Fu(){
        //super()
        System.out.println("父类无参构造方法");
    }
}
public class Zi extends Fu{
    public Zi(){
        //super();
        System.out.println("子类无参构造方法");
    }

    public Zi(int num){
        //super();
        System.out.println("子类有参构造方法");
    }
}
public class Test01 {
    public static void main(String[] args) {
        Zi zi = new Zi();
        System.out.println("======================");

        Zi zi1 = new Zi(10);
    }
}

7.super和this的具体使用

1.super的概述:代表的是父类引用

7.1 super的具体使用

1.调用父类构造:只能在子类的构造中使用
  super():调用父类无参构造
  super(实参):调用父类有参构造
2.调用父类成员变量:
  super.成员变量名
3.调用父类方法
  super.方法名()    
public class Fu {
    public int num = 100;
    public Fu(){
        System.out.println("父类无参构造");
    }
    public Fu(int num){
        System.out.println("父类有参构造");
    }
    public void show(){
        System.out.println("父类show方法");
    }
}
public class Zi extends Fu{
    public int num = 10;
    public Zi(){
        super();//调用父类无参构造
        System.out.println("子类无参构造");
    }
    public Zi(int num){
        super(10);//调用父类有参构造
        System.out.println("子类有参构造");
    }
    @Override
    public void show(){
        super.show();//调用父类方法

        System.out.println(num);//子类num
        System.out.println(super.num);//父类num

        System.out.println("子类show方法");
    }
}
public class Test01 {
    public static void main(String[] args) {
        Zi zi = new Zi();
        System.out.println("======================");
        Zi zi1 = new Zi(10);
        zi1.show();
    }
}

注意:在构造中的super关键字,必须在构造第一行写

7.2 this的具体使用

1.概述:this代表的是当前对象->哪个对象调用的this所在的方法,this就代表哪个对象
1.调用当前对象的构造:在本类的构造中使用
  this() 调用本类无参构造
  this(实参) 调用本类的有参构造
2.调用当前对象的成员变量
  this.成员变量名  
3.调用当前对象的方法
  this.方法名()
public class Zi {
    public int num = 10;
    public Zi(){
        this(10);//调用本类有参构造方法
        System.out.println("无参构造方法");
    }
    public Zi(int num){
        //this();//调用本类无参构造方法
        System.out.println("有参构造方法");
    }
    
    public void show(){
        int num = 100;
        System.out.println(num);//100
        System.out.println(this.num);//10
    }
}

注意:在构造中使用this,那么this关键字也要求在构造第一行

​ 在构造中,不能this和super一起出现

8.问题:如何为父类中private的成员变量赋值

8.1.利用set赋值

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

    public Employee() {
    }

    public Employee(String name, int age) {
        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;
    }
}

public class Teacher extends Employee{
}

public class Test01 {
    public static void main(String[] args) {
        Teacher t1 = new Teacher();
        t1.setName("涛哥");
        t1.setAge(16);
        System.out.println(t1.getName()+"..."+t1.getAge());
    }
}

8.2.利用构造方法赋值

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

    public Employee() {
    }

    public Employee(String name, int age) {
        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;
    }
}

public class Teacher extends Employee{
    public Teacher() {
    }

    public Teacher(String name, int age) {
        super(name, age);
    }
}

public class Test01 {
    public static void main(String[] args) {
        Teacher t1 = new Teacher();
        t1.setName("涛哥");
        t1.setAge(16);
        System.out.println(t1.getName()+"..."+t1.getAge());

        System.out.println("======================");
        Teacher t2 = new Teacher("小王", 18);
        System.out.println(t2.getName()+"..."+t2.getAge());
    }
}

昨天课后作业:

public class MyDate {
    int year;
    int month;
    int day;
}
public class Citizen {
    String idCard;
    String name;
    MyDate birthday;
}
public class Test01 {
    public static void main(String[] args) {
        Citizen citizen = new Citizen();
        citizen.idCard = "111";
        citizen.name = "小王";
        MyDate myDate = citizen.birthday;
        myDate = new MyDate();
        myDate.year = 1999;
        myDate.month = 10;
        myDate.day = 10;
        System.out.println(citizen.idCard);
        System.out.println(citizen.name);
        System.out.println(myDate.year);
        System.out.println(myDate.month);
        System.out.println(myDate.day);
    }
}

继续阅读

全部归档
day17.集合
day17.集合

本文详细介绍了Java集合框架中的List、list及、set等和泛型相关知识。关键内容包括: 11集合简述: - ArrayList底层通过数组实现,初始容量动态扩展 - linkedList底层为双向链表,支持高效首尾插入删操作,但迭代时效率较低 -集合使用: - arrayList适合随机访问,但增删效率低下 - linkedlist迭代效率高但增删较慢 - hashmapset使得集合不遵循顺序 -linkedHashSet结合了两者优点 "st集合: - set不能保证元素顺序 - hashSet通过散列有效处理去重 -泛型应用: - 使用泛型可以统一类型,减少类型转换异常 -通配符?可以对不确定泛型类型 -上限? super多次类,下取限? super泛型类 -泛型类、方法、接口支持使用 本总结归纳了集合中各类数据结构的特点、应用及泛型使用方法,对于思考和应用Java集合框架&有着较好的指导和解释作用。

day16.集合
day16.集合

以下是根据提供的多段文档提炼的文章摘要: ### 摘要 本文详细介绍了Java多线和和、程序集合概念和和方法及其相关操作。文章首先回顾了了Java中的的基本概念,包括多线创建的方式——继承Thread或实现Runnable、以及Thread中的一些重要方法(如sleep、、start"和run∩∩。随后,文章介绍了多线同步机制,包括使用synchronized关键字和实现同步代码块以及使用同步方法的方式来控制多个线共同操作。 文章以较多篇幅介绍了函数流操作与以及相关函数接口和如Function、ConsumerPredicate#SupplierConsumerupplier。示例使用了Supupplier实现在最大值操作,展示了如何用Supplier流操作来过滤掉定定特定规则的材料集合。变量另外还展示了几种常用的函数流操作:如filter、filter、filter\和filterfilterfilter切片(long #和、limit值截止数量),以及流.aggregate方法来集合汇总生成新集合。 在**集合框架**部分,文章深入介绍了ArrayList与和LinkedList的基本概念与操作以及并发修改注意事项。文章同时讲解了了几种常见的数据结构**如数组、链表、以及树形结构**,并通过示例展示了这些数据结构的基本操作。 ### 操作条目如下: 11.多线述了了Jav中多合集分目的。 12简明介绍了集合的间操作以及几种重要的操作方法。 15.详细讲解了了�流操作以及相关接口的应用。 1.介绍合例操作优先。 55.以杰大量数据举例清晰解释了常见数据结构的与如上述这些操作。

评论