Day7

 *
 * static jdk7在方法区,jdk8之后在堆上
 * 但是也是拿到了地址,而不是拷贝了值。
 *
 * 在类加载的最后一步进行初始化
 *
 * 使用场景:
 * static 修饰
 *
 * //statci想访问成员方法怎么办
 *   创建对象呗?!!!!!
 *
 * 不管是什么方法,  不存在静态局部变量
 *
 * 匿名对象:
 * 没有接收的对象,不能重复调用方法,适合调用一次方法。
 *   this调用构造器必须在第一行
 * 构造代码块:
 * 依赖于构造方法的执行。
 * 使用场景:当每个构造器都需要执行的语句,可以提取出来,放到构造代码块中。
 *
 * 静态代码块:用static修饰的构造代码块
 * static{}
 * 类加载的时机:
 * 1.new的时候
 * 2.调用类的静态成员、方法时。
 * 3.调用某个类的main方法
 * final static 会在常量池中,编译时就进去了,不需要类加载
 * final static方法  会进行类加载,没有常量池存他。
 *
 * 只有public修饰的类才能用main方法
 *
 * 访问权限修饰符:
 * 1.修饰类中成员的
 *     public protected  default(什么都不写,缺省状态,默认的),private
 2.修饰类
   class A 默认权限
public class

 封装

 为啥布尔类型不建议使用isMale?
 不希望外界随意修改
  private boolean isMale;//不推荐
 生成访问方法时,和访问方法重名。
  1. 创建两个类,分别用来表示长方形和正方形,同时定义所需的成员变量,

    代表长方形或者正方形的边长,在两个类中分别定义两个方法,用来求对应形状的面积和周长,

    并定义相应的get,set方法,获取和改变方形和正方形的变长。

package com.jiang.work.Day7;

/**
 * ============================
 * 一定要注意命名规则
 * 一定要注意命名规则
 * 一定要注意命名规则
 * ============================
 * TODO
 *
 * @version 1.0
 * @Description: 创建两个类,分别用来表示长方形和正方形,同时定义所需的成员变量,
 * @author: https://github.com/cqpsjsl
 * @date: 2021/1/7 19:31
 */

/**
 *
 * 1. 创建两个类,分别用来表示长方形和正方形,同时定义所需的成员变量,
 *
 *    代表长方形或者正方形的边长,在两个类中分别定义两个方法,用来求对应形状的面积和周长,
 *
 *    并定义相应的get,set方法,获取和改变方形和正方形的变长。
 */
public class WorkOne {
    public static void main(String[] args) {
        //创建对象
        //长方形
        Rectangle rectangle = new Rectangle();
        //正方形
        Square square = new Square();
        //设置长方形长宽
        rectangle.setLongs(3);
        rectangle.setWidth(6);
        //设置正方形边长
        square.setSideLength(8);
        //输出长方形信息
        System.out.println("长方形的长是: " + rectangle.getLongs());
        System.out.println("长方形的宽是: " + rectangle.getWidth());
        System.out.println("长方形的周长是: " + rectangle.perimeter());
        System.out.println("长方形的面积是: " + rectangle.area());
        //输出正方形信息
        System.out.println("正方形的边长是: " + square.getSideLength());
        System.out.println("正方形的周长是: " + square.perimeter());
        System.out.println("正方形的面积是: " + square.area());

    }
}

package com.jiang.work.Day7;

/**
 * ============================
 * 一定要注意命名规则
 * 一定要注意命名规则
 * 一定要注意命名规则
 * ============================
 * TODO
 *
 * @version 1.0
 * @Description: 正方形
 * @author: https://github.com/cqpsjsl
 * @date: 2021/1/7 19:33
 */
public class Square {
    private double sideLength;

    public double getSideLength() {
        return sideLength;
    }

    public void setSideLength(double sideLength) {
        this.sideLength = sideLength;
    }

    public double area() {
        return sideLength * sideLength;
    }

    public double perimeter() {
        return 4*sideLength;
    }
}

package com.jiang.work.Day7;

/**
 * ============================
 * 一定要注意命名规则
 * 一定要注意命名规则
 * 一定要注意命名规则
 * ============================
 * TODO
 *
 * @version 1.0
 * @Description: 长方形
 * @author: https://github.com/cqpsjsl
 * @date: 2021/1/7 19:32
 */
public class Rectangle {
    private double longs;
    private double width;

    public double getLongs() {
        return longs;
    }

    public void setLongs(double longs) {
        this.longs = longs;
    }

    public double getWidth() {
        return width;
    }

    public void setWidth(double width) {
        this.width = width;
    }
    public double area() {
        return longs * width;
    }
    public double perimeter() {
        return 2*(longs+width);
    }
}

运行结果:

长方形的长是: 3.0
长方形的宽是: 6.0
长方形的周长是: 18.0
长方形的面积是: 18.0
正方形的边长是: 8.0
正方形的周长是: 32.0
正方形的面积是: 64.0

Process finished with exit code 0
  1. 在com.cskaoyan.a包下,定义一个名为MyClazz的类如下

    public class  MyClazz {
       public void hello() {
       System.out.println("a包");
      }
    }
    

    同时,在com.cskaoyan.b包下,一个类名也为MyClazz

    public class  MyClazz {
      public void hello() {
      System.out.println("b包");
      }
    }
    

    同时在com.cskaoyan.b包下定义一个Test类如下:

    public class Test {
      public void static main(String[] args) {
      MyClazz myClazz = new MyClazz();
      myClazz.hello();
      }
    }
    

    毫无疑问,当执行Test中的main方法的时候输出的是: b包
    先要求,在不改变Test main方法中代码的情况下,让main方法运行之后输出 a包,应该怎么做?

答:

import com.cskaoyan.a.MyClazz
  1. 定义一个Student类,并要求其他类在使用Student类的时候,最多只能创建10个Student类的对象,如何实现?

提示: 首先,要实现该功能,就不能让外部类直接使用
new Student(...)的方式来创建对象,如何不能让其他类new Student(...),
只需将Student类的所 有构造方法的,权限改为private即可。

    接着,把创建对Student对象的工作,交给一个专门的方法去做(想想这个方法应该是怎样的方法)

活用static和访问权限修饰符

package com.jiang.work.Day7;

/**
 * ============================
 * 一定要注意命名规则
 * 一定要注意命名规则
 * 一定要注意命名规则
 * ============================
 * TODO
 *
 * @version 1.0
 * @Description: 定义一个Student类,并要求其他类在使用Student类的时候,最多只能创建10个Student类的对象
 * @author: https://github.com/cqpsjsl
 * @date: 2021/1/7 19:55
 */
public class WorkThr {
    public static void main(String[] args) {
        Student s = Student.createStudent();
        Student s1 = Student.createStudent();
        Student s2 = Student.createStudent();
    }
}

package com.jiang.work.Day7;

/**
 * ============================
 * 一定要注意命名规则
 * 一定要注意命名规则
 * 一定要注意命名规则
 * ============================
 * TODO
 *
 * @version 1.0
 * @Description: Student
 * @author: https://github.com/cqpsjsl
 * @date: 2021/1/7 19:55
 */
public class Student {
    private String name;
    private int age;
    private static int count = 0;

    private Student() {
    }


    private Student(String name) {
        this.name = name;
    }

    private Student(int age) {
        this.age = age;
    }

    private Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static Student createStudent() {
        if (count < 2) {//0 1 2
            count++;
            System.out.println("创建了一个学生类");
            return new Student("张三"+count);
        }else{
            System.out.println("学生类达到上限!");
        }
        return null;
    }

}

运行结果:

创建了一个学生类
创建了一个学生类
学生类达到上限!

Process finished with exit code 0

4.image-20210107214041986

posted @ 2021-01-07 22:04  多米_dmxq#top  阅读(96)  评论(0)    收藏  举报