0
点赞
收藏
分享

微信扫一扫

【java基础16:static、this关键字】this什么时候不能省 java中变量的存储位置 类体中能放哪些东西的总结

目录

static关键字

this关键字

this作业1

this作业2

this什么时候不可以省略

java中变量的存储位置

综合作业1

综合作业2

总结:


static关键字

  1. static修饰的统一都是静态的,都是类相关的,不需要new对象,直接采用”类名.“访问

    /*
        static:
            1、static翻译为:“静态的”
            2、所有的static关键字修饰的都是类想关的,类级别的
            3、所有static 修饰的,都是采用“类名.”的方式访问
            4、static修饰的方法:静态方法
            5、static修饰的变量:静态变量
    
            变量的分类:
                变量根据声明的位置进行划分:
                    方法体中声明的变量:局部变量
                    方法体外声明的变量:成员变量
                成员变量又可以分为:
                    实例变量
                    静态变量
     */
    public class StaticText01 {
    
    }
    
    class VarText{
    
        //以下实例的,都是对象相关的,访问时采用“引用.”的方法访问,需要先new对象
        //实例相关的,必须现有对象才能访问,可能会出现空指针异常。
        //成员变量中的实例变量
        int i;
    
        //实例方法
        public void m2(){
            //局部变量
            int x = 200;
        }
    
        //以下静态的,都是类相关的,访问时采用“类名.”的方式访问,不需要new对象。
        //不需要对象的参与就可以访问,不会发生空指针异常
        //成员变量中的静态变量
        static int k;
        //静态方法
        public static void m1(){
            int m = 100;
        }
    }
    
  2. 当一个属性是类级别的属性,所有对象的这个属性的值都不会变化时,建议定义为“静态变量”

    /*
        什么时候变量声明为实例的,什么时候声明为静态的
            如果这个类中所有的对象的某个属性都是一样的,不定义为实例变量,太浪费内存空间。
            建议定义为类级别特征,定义为静态变量,在方法区中只保留一份,节省内存。
    
            一个对象一份的,定义为:实例变量
            每个对象都一样的,定义为:静态变量
    
     */
    
    public class StaticText02 {
        public static void main(String[] args){
    
            //访问中国人的国籍,country 是静态变量,静态变量应该使用:“类名.”的方式访问
    //        System.out.println(Chinese.country);
    
            Chinese c1 = new Chinese("123456789","张三");
            System.out.println(c1.idCard);
            System.out.println(c1.name);
            System.out.println(Chinese.country);
    
            Chinese c2 = new Chinese("987654321","李四");
            System.out.println(c2.idCard);
            System.out.println(c2.name);
            System.out.println(Chinese.country);
        }
    }
    
    
    //定义country为静态变量
    //定义一个类:中国人
    class Chinese{
        //身份证号
        //每个人的省份证号不同,一个对象一个号,所以idCard应该是实例变量。
        String idCard;
    
        //姓名
        //一个人有一个名字,所以name也是实例变量
          String name;
    
        //国籍
        //重点:加static的变量叫做静态变量
        //静态变量在类加载时初始化,不需要new对象,静态变量的空间就开创出来
        //静态变量存储在方法区
    
        //对于“中国人”这个类来说,国际都是“中国”,不会随着对象的改变而改变
        //国籍属于整个类的特征,整个族的特征
        //假设声明为静态变量,内存图
        static String country = "中国";
    
        //无参数
        public Chinese(){
    
        }
    
        //有参数
        public Chinese(String s1 ,String s2){
            idCard = s1;
            name = s2;
        }
    }
    
    
    
    /*      定义country为实例变量
    
    
    public class StaticText02 {
        public static void main(String[] args){
    
            Chinese c1 = new Chinese("123456789","张三","中国");
            System.out.println(c1.idCard);
            System.out.println(c1.name);
            System.out.println(c1.country);
    
            Chinese c2 = new Chinese("987654321","李四","中国");
            System.out.println(c2.idCard);
            System.out.println(c2.name);
            System.out.println(c2.country);
    
        }
    }
    
    
    //定义一个类:中国人
    class Chinese{
        //身份证号
        //每个人的省份证号不同,一个对象一个号,所以idCard应该是实例变量。
        String idCard;
    
        //姓名
        //一个人有一个名字,所以name也是实例变量
        String name;
    
        //国籍
        //对于“中国人”这个类来说,国际都是“中国”,不会随着对象的改变而改变
        //国籍属于整个类的特征,整个族的特征
        //假设声明为实例变量,内存图
        String country;
    
        //无参数
        public Chinese(){
    
        }
    
        //有参数
        public Chinese(String s1 ,String s2,String s3){
            idCard = s1;
            name = s2;
            country = s3;
        }
    }
     */
    

    在这里插入图片描述

    在这里插入图片描述

  3. 访问静态变量不会出空指针异常

    /*
            实例的:一定需要使用:“引用.”的方式访问。
    
            静态的:
                使用“类名.”的方式访问,但使用“引用.”的方式也可以访问,但不建议这样使用
                静态的如果使用“引用.”的方式访问,会让别人错以为:这个变量是实例变量。
    
            结论:
                空指针异常只有什么情况下才会发生呢?
                    只要是“空引用”访问“实例相关”时,都会出现空指针异常。
     */
    public class StaticText03 {
        public static void main(String[] args){
    
            //通过“类名.”的方式访问静态变量
            System.out.println(Chinese1.country);//中国
    
            //创建对象
            Chinese1 c1 = new Chinese1("123456","张三");
            System.out.println(c1.idCard);//123456
            System.out.println(c1.name);//张三
            System.out.println(c1.country);//中国
    
            c1 = null;
            //分析这里会不会出现空指针异常
            System.out.println(c1.country);//中国
            //没有出现空指针异常,因为静态变量不需要对象的存在
            //实际以上代码在运行时,还是:System.out.println(Chinese1.country);
    
            System.out.println(c1.name);
            //这个还是会出现空指针异常,因为name是实例变量。对象为空,空引用访问,所以出现空指针异常
    
    
        }
    }
    class Chinese1{
        //实例变量
        String idCard;
        String name;
    
        //静态变量
        static String country = "中国";
    
        //构造方法
        public Chinese1(String x , String y){
            idCard = x;
            name = y;
        }
    }
    
    
  4. 实例方法的调用

    public class StaticText04 {
        public static void main(String[] args){
            //静态方法的访问,正规:类名.
            StaticText04.doSome();
    
            //创建对象
            StaticText04 st = new StaticText04();
            //用“引用.”访问
            st.doSome();
    
            //空引用访问静态方法
            st = null;
            //访问静态方法永远不会出现空指针异常
            st.doSome();//这个代码在运行时会转变为:StaticText04.doSome();
    
            //实例方法doOther();
            //对象级别的方法(先new对象,通过“引用.”的方式访问)
            //StaticText04.doOther();  //编译报错
            //无法从静态上下文中引用非静态 方法 doOther()
    
            StaticText04 st2 = new StaticText04();
            st2.doOther();
    
            //空引用访问实例方法
            st2 = null;
            //空引用调用实例方法会出现:空指针异常。
            //st2.doOther();
        }
    
        //静态方法 (静态方法不需要new对象,直接使用“类名.”来访问)
        public static void doSome(){
            System.out.println("静态方法doSome()执行了!");
        }
    
        //实例方法(实例相关的都需要new对象,只能使用“引用.”来访问。)
        public void doOther(){
            System.out.println("实例方法doOther()执行了");
        }
    }
    /*
        类{
            //实例相关的都是需要new对象的,通过“引用.”访问
            实例变量
            实例方法
    
            //静态相关都是通过“类名.”访问。也可以通过“引用.”访问,但是用过引用访问会让别人误会这是个实力变量,所以一般不推荐使用
            静态变量
            静态方法
    
        }
     */
    
    
  5. 什么时候定义为实例方法,什么时候定义为静态对象。

    /*
        关于方法来说,什么时候定义为实例方法,什么时候定义为静态方法
    
            此方法一般都是描述了一个行为,如果说该行为必须去由对象去触发,那么该方法定义为实例方法。
    
            标准:当一个方法体当中,直接访问了实例变量,这个方法一定是实例方法。
                  以后的开发中,大部分情况下,如果是工具类的话,工具类当中的方法一般都是静态的。
                  (静态方法有一个优点,是不需要new对象,直接采用类名调用,很方便)
                  (工具类就是为了方便,所以工具类中的方法一般都是static的)
                  工具类就是为了方便编程而开发的一些类。
    
          什么时候方法定义为实例方法?
              张三考试,得分90
              李四考试,得分100
              不同的对象参加考试的结果不同
              我们可以认定“考试”这个行为是与对象相关的。
              建议将“考试”这个方法定义为实例方法
    
        类=属性+方法
            属性描述的是:状态
            方法描述的是:行为/动作
     */
    public class StaticText05 {
        public static void main(String[] args){
    
            User2 u = new User2();
            System.out.println(u.getId()); //0
    
    
        }
    }
    
    class User2{
        //实例变量,需要对象
        private int id;
    
        //
        public void setId(int i){
            id = i;
        }
        public int getId(){
            return id;
        }
    }
    
    
  6. 静态代码块

    /*
         1、使用static关键字可以定义“静态代码块”
    
         2、什么是静态代码块,语法是什么?
            static {
                java语句;
                java语句;
            }
    
         3、static静态代码块在什么时候执行呢?
            类加载时执行。并且只执行一次。
            静态代码块有这样的特征/特点。
    
         4、注意:静态代码块在类加载时执行,并且在main方法执行之前执行。
                 就算是写在main方法之后,也是先执行静态代码块。
    
         5、静态代码一般是自上而下的顺序执行。
    
         6、静态代码块有什么用?
            第一:静态代码块不是那么常用。(不是每一个类当中都要写的东西)
            第二:静态代码块这种语法机制实际上是SUN公司给我们java程序员的一个特殊的时刻/时机
                  这个时机叫做:类加载时机。
         具体的业务:
              项目经理说了:大家注意,所有编写的程序,只要是类加载了,请记录一下类加载的日志信息
              在哪年哪月哪日几时几分几秒 ,哪个类加载到JVM当中了。
     */
    public class StaticText06 {
        //静态代码块(特殊的时机:类加载时机。)
        //一个类当中可以编写多个静态代码块,但一般不会写多个,一般只写一个静态代码块
        static{
            System.out.println("aaa");
        }
        static{
            System.out.println("bbb");
        }
        //入口
        public static void main(String[] args){
            System.out.println("Hello World");
        }
        static{
            System.out.println("ccc");
        }
    }
    
    
  7. 类加载时代码执行的先后顺序为 自上而下。

    /*
          栈:方法只要执行,都会压栈。(局部变量 存储在 栈 )
          堆:new 出来的对象都在堆中。垃圾回收器主要针对堆中的垃圾数据 (实例变量 存储在 堆 )
          方法区:类的信息,字节码信息,代码片段 (静态变量 存储在 方法区 )
     */
    
    public class StaticText07 {
    
        //静态变量存储在 方法区 ,在类加载时 初始化,
        static int i = 100;
    
        //静态代码块在类加载时执行
        static{
            //这里可以访问静态变量i吗
            //可以,因为都是在类加载时进行的
            System.out.println("i="+i);
        }
    
        //实例变量
        int k = 111;
        static{
            //这里可以访问实例变量k吗?
            //System.out.println("k= " + k);//报错:无法从静态上下文中引用非静态 变量 k、
            //实例变量在 构造方法执行时(new对象)进行初始化
        }
    /*
        //静态变量在静态代码块下时,可以在静态代码块中访问name吗?
        //不可以,静态代码块 和 静态变量初始化 都在 类加载的时候 自上而下 执行,谁靠前谁先执行
        static{
            System.out.println("name=" +name);
            //报错: 非法前向引用
        }
        static String name = "eee";
     */
    
        //入口(main方法执行之前实际上执行了很多代码)
        public static void main(String[] args){
    
        }
    }
    
    /*
        总结:
            到目前为止,你遇到的所有java程序,有顺序要求的是哪些?
                第一:对于一个方法来说,方法体中的代码是有先后顺序的,遵循自上而下的顺序执行
                第二:静态代码块和静态变量是有先后顺序的
                第三:静态代码块1和静态代码块2是有先后顺序的。
     */
    
    
  8. 实例语句块

    /*
        1、除了静态代码块之外,还有一种语句叫做:实例语句块。
        2、实例语句在类加载时并不执行
        3、实例语句语法:
            {
                java语句;
                java语句;
                java语句;
            }
        4、实例语句块在什么时候执行?
            只要是构造方法执行,必然在构造方法执行之前,自动执行“实例语句块”中的代码
            实际上这也是SUN公司为java程序员准备的一个特殊的时机,叫做:对象创建时机。
        5、实例语句块也可以写多个,但一般只写一个。
     */
    public class InstanceCode {
        public static void main(String[] args){
            System.out.println("main begin!");
            new InstanceCode();
            new InstanceCode();
            new InstanceCode("abc");
        }
    
        //实例语句块
        {
            System.out.println("实例");
        }
        public InstanceCode(){
            System.out.println("无参数的构造方法执行");
        }
        public InstanceCode(String name){
            System.out.println("有参数的构造方法执行");
        }
        //尽管实例语句块在构造方法的下面,但也是在构造方法执行之前执行。
        {
            System.out.println("实例语句块执行了!");
        }
    
    }
    
    
  9. 判断以下代码的执行顺序

    /*
        判断以下代码的执行顺序
            静态代码块在类加载时执行——>方法执行——>调用构造方法——>实例语句块执行——>构造方法执行
    
     */
    public class CodeOrder {
    
        //静态代码块
        static{
            System.out.println("1AAA");//1
        }
    
        //入口
        public static void main(String[] args){
            System.out.println("3EEE");//3
            new CodeOrder();
            System.out.println("6FFF");//6
        }
        //构造方法
        public CodeOrder(){
            System.out.println("5BBB");//5
        }
    
        //实例语句块
        {
            System.out.println("4CCC");//4
        }
    
        //静态代码块
        static{
            System.out.println("2DDD");//2
        }
    }
    
    

this关键字

  1. this是一个关键字,是一个引用,保存内存地址,指向自身。
  2. this可以使用在实例方法中,也可以使用在构造方法中
  3. this出现在实例方法中,代表的是当前对象
  4. this不能使用于静态方法
  5. this. 大部分情况下可以省略,但是用于区分局部变量和实例变量时不能省。
  6. this()这种语法只能出现在构造方法的第一行,表示当前构造方法调用本类中另一个构造方法,目的:代码复用
    在这里插入图片描述
/*
    this 关键字:
        1、this是一个关键字,全部小写。
        2、this是什么?在内存方面是怎么样的?
            一个对象一个this
            this是一个变量,是一个引用。this保存当前对象的内存地址,指向自身。
            严格意义上说:this代表的就是“当前对象”,this存储在堆内存当中对象的内部

        3、this只能用在实例方法中,谁调用这个方法,this就是谁
           所以this代表的是:当前对象。

        4、“this”大部分情况是可以省略的

        5、为什么this不能使用在静态方法中
           this代表当前对象,静态方法中不存在当前对象。

 */
public class ThisText01 {
    public static void main(String[] args){
        Customer1 c1 = new Customer1("张三");
        c1.Shoopping();
        Customer1 c2 = new Customer1("李四");
        c2.Shoopping();
    }
}

//顾客类
class Customer1{
    //属性
    //实例变量(必须采用“引用.”的方式访问)
    String name;

    //构造方法
    public Customer1(){}
    public Customer1(String s){
        name = s;
    }

    //顾客购物的方法
    //实例方法
    public void Shoopping(){
        //这里的this就是:当前对象
        //c1调用shopping(),this是c1
        //c2调用shopping(),this是c2
        //System.out.println(this.name+"正在购物!");

        //this.是可以省略的。
        //this.省略的话,还是默认访问“当前对象”的name
        System.out.println(name+"正在购物!");
    }

    //静态方法
    public static void doSome(){
        //this代表的是当前对象,而静态方法的调用不需要对象,矛盾了
        //错误:无法从静态上下文中引用非静态 变量 this
        //System.out.println(this);
    }

}

class Student2{
    String name = "zhangsan";

    public static void m1(){
        //System.out.println(name);

        //this代表的是当前对象。
        //System.out.println(this.name);

        //除非你这样
        Student2 s = new Student2();
        System.out.println(s.name);
    }

    //为什么set和get方法是实例方法
    public String getName(){
        return name;
    }
    public void setName(String s){
        name = s;
    }
    //什么时候方法定义为实例方法,什么时候方法定义为静态方法?
    //如果方法中直接访问了实例变量,该方法必须是实例方法。
}

//分析i在main方法中能不能访问

public class ThisText02 {

    //实例变量
    int i = 100;

    //静态变量
    static int k = 111;
    //静态方法
    public static void main(String[] args){
        //错误: 无法从静态上下文中引用非静态 变量 i
        //System.out.println(i);

        //因为i是实例变量,所以要通过:引用.的方式访问。
        ThisText02 t = new ThisText02();
        System.out.println(t.i);

        //静态变量用“类名.”访问
        System.out.println(ThisText02.k);

        //类名.可以省
        System.out.println(k);
    }
}

this作业1

/*
    第五题:定义丈夫类 Husband 和妻子类 Wife,
    丈夫类的属性包括:身份证号,姓名,出生日期,妻子。
    妻子类的属性包括:身份证号,姓名,出生日期,丈夫。
    分别给这两个类提供构造方法(无参数构造方法和有参数构造方法都要提供),
    编写测试程序,创建丈夫对象,然后再创建妻子对象,丈夫对象关联妻子对象,
    妻子对象关联丈夫对象,要求能够输出这个“丈夫对象”的妻子的名字,
    或执行者能够输出这个“妻子对象”的丈夫的名字。要求能够画出程序过程的内存图。
    并且要求在程序中演示出空指针异常的效果。

       总结:类名/引用
            .后面只是一个单词,没有小括号,表示访问的是属性
            .后面有一个单词,单词后面有小括号,表示访问的是方法
 */
public class Work001 {
    public static void main(String[] args){
        //创建丈夫对象
        Husband hu = new Husband("123456","张三","2000-10-23",null);
        //创建妻子对象
        Wife wi = new Wife("654321","李四","2000-01-30",null);
        //让他们结婚
        //这里如果不结婚,通过丈夫找妻子名字时,会出现空指针异常,因为丈夫的妻子为null了,所以出现空指针异常
        hu.wife = wi;
        wi.husband = hu;


        //输出丈夫对象妻子的名字
        //这里不能直接用妻子的名字,可能他们不匹配,没结婚。必须是找妻子的名字
        System.out.println(hu.name+"de qi zi shi :"+ wi.name);
        //这里找妻子的名字是从丈夫里先找妻子,找到妻子后再去找妻子的名字
        System.out.println(hu.name+"的妻子是:"+hu.wife.name);
        System.out.println(wi.name+"的丈夫是:"+wi.husband.name);


    }
}

//丈夫类
class Husband{

    //身份证号
    String idCard;
    //姓名
    String name;
    //生日
    String birth;
    //妻子
    Wife wife;//这里是引用数据类型。

    public Husband(){

    }

    public Husband(String s1,String s2 ,String s3,Wife w){
        idCard = s1;
        name = s2;
        birth =s3;
        wife = w;
    }
    /*  有参数的构造方法也可以这样写
    public Husband(String s1,String s2 ,String s3){
        idCard = s1;
        name = s2;
        birth =s3;
        //wife = null;//这里为变量赋默认值:null
    }

     */

}

//妻子类
class Wife{
    //身份证号
    String idCard;
    //姓名
    String name;
    //生日
    String birth;
    //丈夫
    Husband husband;

    public Wife(){

    }

    public Wife(String s1,String s2 ,String s3,Husband h){
        idCard = s1;
        name = s2;
        birth =s3;
        husband = h;
    }
}

this作业2

/*
    一、请通过代码封装,实现如下需求:
	编写一个类Book,代表教材:
	1.具有属性:名称(title)、页数(pageNum)
	2.其中页数不能少于200页,否则输出错误信息,并赋予默认值200
	3.为各属性提供赋值和取值方法
	4.具有方法:detail,用来在控制台输出每本教材的名称和页数
	5.编写测试类BookTest进行测试:为Book对象的属性赋予初始值,并调用Book对象的detail方法,看看输出是否正确

 */
public class Work002 {
    public static void main(String[] args){
        //创建Book对象
        Book b1 = new Book("高三数学人教版",250);
        //调用 detail 方法
         b1.detail();
         //修改页数
        b1.setPageNum(100);
        b1.detail();


        Book b2 = new Book();
        b2.detail();
        /*
          这里出现——————教材名称:null的页数是:0
              解决方案:
                  1、把无参数的构造方法删掉
                  2、在无参数的构造方法中给他赋值代替系统赋的默认值
        */

    }
}

class Book{
    //题目要求封装,所以这里设置变量为私有的。
    private String title;
    private int pageNum;

    //无参以及有参构造方法
    public Book(){
        title = "weizhi ";
        pageNum = 200;
    }
    public Book(String s,int i){
        //或者在这里也可以对页数不足的进行错误判断
        title = s;
        if(i<200){
            System.out.println("错误");
            //默认赋值200
            pageNum = 200;
        }else{
            pageNum = i;
        }
    }

    //set 以及 get 构造方法
    public String getTitle(){
        return title;
    }
    public void setTitle(String s){
        title = s;
    }
    public int getPageNum(){
        return pageNum;
    }
    public void setPageNum(int i){
        if(i< 200){
            System.out.println("错误");
            //默认赋值200
            pageNum = 200;
            return;//结束该方法
        }
        //可以执行到这里说明页数大于等于200的,直接赋值
        pageNum = i;
    }

    //额外提供一个detail方法
    //这里不能加static ,因为里面的title与pageNum都是实例变量,所以要把detail定义为实例方法。
    //然后创建对象后再调用此方法。
    public void detail(){
        System.out.println("教材名称:"+title +"的页数是:"+ pageNum);
    }
}

this什么时候不可以省略

/*
    1、this可以使用在实例方法中,不能使用在静态方法中
    2、this关键字大部分情况下可以省略,什么时候不能省略呢?
        在实例方法、构造方法中,为了区分局部变量以及实例变量。
        这种情况下:this.是不可以省略的。
 */
public class ThisText03 {
    public static void main(String[] args){

        Student3 s = new Student3();
        s.setNo(111);
        s.setName("张三");
        System.out.println("学号:"+s.getNo());
        System.out.println("姓名:"+s.getName());

        Student3 s2 = new Student3(222,"李四");
        System.out.println("学号:"+s2.getNo());
        System.out.println("姓名:"+s2.getName());

    }
}


//分析以下代码,看哪里设置的不好
//学生类
class Student3{
    //学号、姓名
    private int no;
    private String name;

    //构造方法
    public Student3(){}
    
    /*
    public Student3(int i,String s){
        no = i;
        name = s;
    }
     */
    
    //这里也可以这样改,增强可读性。
    public Student3(int no,String name){
        this.no = no;
        this.name = name;
    }


    //set 和 get 方法
    //方法中i、s可读性差,
    public int getNo(){
        return no;
        //return this.no;    //这里实际上是这样写的。
    }
    
    /*
    public void setNo(int i){
        no = i;
    }
     */
    
    /*
    public void setNo(int no){//就近原则
        no = no;        //这里的两个no都是局部变量no,和实例变量no没有关系。
    }
     */
    
    //这个时候就用到this,this.的作用:区分局部变量和实例变量
    public void setNo(int no){
        //no是局部变量,this.no是实例变量
        this.no = no;// 当前对象的no = no; 后面这个no是赋值进来的
    }
    
    public String getName(){//getName实际上获取的是“当前对象”的名字
        //return this.name;     //严格来说,这里的代码实际上是有this.的,不过这里的this.可以省
        return name;

    }
    
    /*
    public void setName(String s){
        name = s;
    }
     */
    
    /*
    public void setName(String name){//就近原则
        name = name;        //这里的两个name都是局部变量name,和实例变量name没有关系
    }
     */
    
    public void setName(String name){
        this.name = name;
    }
}

java中变量的存储位置

在这里插入图片描述

this可以用于构造方法中

/*
    1、this除了可以用在实例方法中,还可以用在构造方法中。

    2、新语法:通过当前的构造方法去调用另一个本类中的构造方法,可以使用以下语法格式:
        this(实际参数列表);
        通过一个构造方法去调用另一个构造方法,可以做到代码复用
        注意:两个构造方法必须在同一个类当中。

    3、this()这个语法的作用:代码复用

    4、对于this()的调用只能出现在构造方法的第一行。
 */

public class ThisText04 {
    public static void main(String[] args){
        //调用无参数构造方法
        Date d1 = new Date();
        d1.detail();
        Date d2 = new Date(2020,11,22);
        d2.detail();
    }
}
/*
   需求:
       1、定义一个日期类,可以表示年月日信息
       2、如果调用无参的构造方法,默认创建日期为:1970/01/01,也可以用有参的构造方法创建日期对象
 */

class Date{//以后写代码都要封装,属性私有化,对外提供set get方法
    private int year;
    private int month;
    private int day;

    //构造方法
    public Date(){
        //错误:: 对this的调用必须是构造器中的第一个语句
        //System.out.println("1");
            //这里的this.可以省略
            /*
            this.year = 1970;
            this.month = 1;
            this.day = 1;
            这三行代码可以用以下一行代替。
             */
        this(1984,1,1);
    }
    public Date(int year , int month , int day){
        this.year = year;
        this.month = month;
        this.day = day;
    }
    //打印日期的方法
    public void detail(){
        System.out.println(year + "年" + month +"月" + day + "日");
    }
    //set get 方法
    public int getYear(){
        return year;
    }
    public void setYear(int year){
        this.year = year;
    }
    public int getMonth(){
        return month;
    }
    public void setMonth(int month){
        this.month = month;
    }
    public int getDay(){
        return day;
    }
    public void setDay(){
        this.day = day;
    }
}

综合作业1

/*
二、写一个名为Account的类模拟账户。
该类的属性和方法如下所示。
该类包括的属性:账户id,余额balance,年利率annualInterestRate;
包含的方法:各属性的set和get方法。取款方法withdraw(),存款方法deposit()

写一个测试程序
(1)创建一个Customer,名字叫Jane Smith,他有一个账号为1000,余额为2000,年利率为1.23%的账户
(2)对Jane Smith操作:
存入100元,再取出960元,再取出2000。
打印Jane Smith的基本信息
信息如下显示:
成功存入:100
成功取出:960
余额不足,取钱失败
Customer [Smith,Jane] has a account :id is 1000 annualInterestRate is 1.23% balance is 1140.0
 */
public class ThisHomework {
    public static void main(String[] args){
        //先创建一个账户
        Account a = new Account(1000,2000,1.23);
        //创建客户对象
        //传给构造方法a,让Customer2对象与Account对象产生关系
        //表示a这个账户是Smith的。 先创建账户,然后传给客户
        Customer2 c = new Customer2("Jane Smith",a);
        //这里因为封装,所以要用get方法去读取act账户
        //而通过getAct()方法读取的账户实际上就是账户a,但是因为属性私有化,不能c.a.deposit(100);这样去读改。
//        c.a.deposit(100);
//        c.a.withdraw(960);
//        c.a.withdraw(2000);
        c.getAct().deposit(100);
        c.getAct().withdraw(960);
        c.getAct().withdraw(2000);
    }
}
//以后都是封装,所有的类都是属性私有化,对外提供set和get方法。
class Customer2{
    //名字
    private String name;
    //银行账户,这里是引用数据类型。
    private Account act;
    //构造方法
    public Customer2(){}
    public Customer2(String name , Account act){
        this.name = name;
        this.act = act;
    }
    //get set 方法
    //为什么要写set和get?用的着吗?  用不着也得写,因为这是“封装”规定的。
    public String getName(){
        return name;
    }
    public void setName(String name){
        this.name = name;
    }
    public Account getAct(){
        return act;
    }
    public void setAct(Account act){
        this.act = act;
    }

}
class Account{
    private int id;
    private double balance;
    private double annualInterestRate;

    //构造方法
    public Account(){}
    public Account(int id,double balance,double annualInterestRate){
        this.id = id;
        this.balance = balance;
        this.annualInterestRate = annualInterestRate;
    }

    //set get方法
    //这里set方法是为了以后修改属性时候可以直接修改。
    public int getId(){
        return id;
    }
    public void setId(int id){
        this.id = id;
    }
    public double getBalance(){
        return balance;
    }
    public void setBalance(double balance){
        this.balance = balance;
    }
    public double getAnnualInterestRate(){
        return annualInterestRate;
    }
    public void setAnnualInterestRate(double annualInterestRate){
        this.annualInterestRate = annualInterestRate;
    }
        /*
    //存款方法
    public void deposit(double money){//钱这里设置为浮点类型,余额也是浮点类型的,钱不一定都是整数。
        //这里的this.可以省,但是这个方法实际上是实例方法,还是加上的好
        this.balance += money;
        System.out.println("成功存入:"+money);
    }
    //取款方法
    public void withdraw(double money){
        if (money<this.balance){
            this.balance -= money;
            System.out.println("成功取出:"+money);
        }else{
            System.out.println("余额不足,取钱失败");
        }
    }
    //取款方法也可以这样写
//    public void withdraw(double money){
//        if (money<this.balance){
//            this.balance -= money;
//            System.out.println("成功取出:"+money);
//            return;//成功取出后结束方法,不再运行。
//        }
//            System.out.println("余额不足,取钱失败");
//    }
     */

    //也可以调用set方法以及get方法 进行改查
    //存款
    public void deposit(double money){
        //调用方法
        this.setBalance(this.getBalance()+money);
        System.out.println("成功存入:"+money);
    }
    //取款
    public void withdraw(double money){
        if (money>this.balance){
            System.out.println("余额不足,取钱失败");
            return;//余额不足结束方法,不会再运行下面的命令
        }
        this.setBalance(this.getBalance()- money);
        System.out.println("成功取出:"+money);
    }
}

综合作业2

/*
    三、(封装)已知一个类 Student 代码如下:
class Student{
	String name;
	int age;
	String address;
	String zipCode;
	String mobile;
}
要求:
	1、把Student 的属性都作为私有,并提供get/set 方法以及适当的构造方法。
	2、为Student 类添加一个getPostAddress 方法,要求返回Student 对象的地址和邮编。
 */
public class ThisHomework2{
    public static void main(String[] args){
        Student4 s1 = new Student4();
        System.out.println(s1.getName()+"的"+s1.getPostAddress());

        //赋值
        s1.setName("张三");
        s1.setAge(18);
        s1.setAddress("北京朝阳区");
        s1.setZipcode("121212");
        s1.setMobile("15896542365");
        System.out.println(s1.getName()+"的"+s1.getPostAddress());

        Student4 s2 = new Student4("李四",130,"西天","147852","14785236985");
        System.out.println(s2.getName()+"的"+s2.getPostAddress());

    }
}
class Student4{//private修饰的东西在本类中是可以访问的。
    private String name;
    private int age;
    private String address;
    private String zipcode;
    private String mobile;
    //构造方法
    public Student4(){}
    public Student4(String name,int age,String address,String zipcode,String mobile){
        this.name = name;
        this.age = age;
        this.address = address;
        this.zipcode = zipcode;
        this.mobile = mobile;
    }
    //get set 方法
    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 String getAddress(){
        return address;
    }
    public void setAddress(String address){
        this.address =address;
    }
    public String getZipcode(){
        return zipcode;
    }
    public void setZipcode(String zipcode){
        this.zipcode = zipcode;
    }
    public String getMobile(){
        return mobile;
    }
    public void setMobile(String mobile){
        this.mobile = mobile;
    }
    public String getPostAddress(){
        return "地址:"+this.getAddress() + "\t邮编:"+this.getZipcode();
        //return "地址:"+this.address + "\t邮编:"+this.zipcode;
    }
}

总结:

/*
    类体{
        实例变量;
        实例方法;

        静态变量;
        静态方法;

        构造方法;

        静态代码块;
        实力语句块;

        方法(){
            //局部变量
            int i = 100;
        }
    }
 */
public class review {
    //类加载机制中,是这样的:在程序执行之前,凡是需要加载的类全部加载到JVM中
    //先完成类加载才会执行main方法。
    static{
        System.out.println("类加载时执行");
    }
    //静态方法    //程序入口
    public static void main(String[] args){
        //局部变量
        int i = 100;

        //完成一个对象的一连串动作
        //一个学生先在教室学习,学习完成之后去餐厅吃饭。
        Student5 s1 = new Student5();
        s1.study();
        Student5 s2 = new Student5();

    }

}

//学生类
class Student5{
    static{
        System.out.println("student类执行。");
    }
    //实例变量
    //私有的在本类中可以访问,其它类中必须使用set和get方法。
    private int no;
    private String name;

    //静态变量
    //类级别的属性
    static String job = "学习";

    {
        System.out.println("实例语句块,构造方法每执行一次,这个就执行一次");
    }
    //构造方法
    public Student5(){
        //假设调用无参构造方法,默认为:学号100,名字张三
        this(100,"张三");//this()在这里使用了。
    }
    public Student5(int no,String name){
        this.no = no;//这里使用了this
        this.name = name;
    }
    //封装
    //set get方法
    public int getNo(){
        return no;
    }
    public void setNo(int no){
        this.no = no;
    }
    public String getName(){
        return name;
    }
    public void setName(String name){
        this.name = name;
    }

    //提供两个实例方法
    public void study(){
//        System.out.println(this.name + "正在努力学习");
//        System.out.println(name + "正在努力学习");

        //在实例方法中调用本类中其他方法。
//        System.out.println(this.getName() + "正在努力学习");
        System.out.println(getName() + "正在努力学习");

        //学习完去干饭,执行到这里是学习完了
        //this.eat();//调用eat()方法, 这里的this.方法可以省
        //编译器检测到eat()方法是实例方法,会自动在eat()方法前添加this.
        eat();
    }
    public void eat(){
        System.out.println(this.getName()+"在餐厅干饭");
        //这里调用静态方法m1()
        //静态方法使用“类名.”方式访问,在同一个类中“类名.”可以省
//        Student5.m1();
        //java编译器会自动在m1()方法钱添加“类名.”,因为检测到m1()方法是一个静态方法。
        m1();
    }
    //提供两个静态方法
    public static void m1(){
        System.out.println("Student's m1 method execute");

        //调用m2方法
        m2();
    }
    public static void m2(){
        System.out.println("Student's m2 method execute");
        System.out.println("工作性质:"+job);
        //编译器检测到job是一个静态变量,所以这里会自动在job前添加:Student5.
        //System.out.println("工作性质:"+Student5.job);
    }
}

/*
    程序再怎么变化,万变不离其宗,有一个固定的规律:
        所有的实例相关的都是先创建对象,通过“引用.”来访问。
        所有的静态相关的都是直接采用“类名.”来访问。

    大结论:
        在一个方法中调用另一个方法,只要这两个方法在同一个类中:
            this. 和 类名. 就可以省略
        反之:
            静态方法要加类名.
            实例方法要先new对象,然后通过this.访问。
 */
public class review2 {
    int i = 100;
    static int j = 2000;
    public void m1(){}
    public void m2(){}
    //实例方法
    public void x(){//这个方法是实例方法,执行这个方法的过程中,当前对象是存在的。
        m1();
        m2();
        m3();
        m4();

        //t1是另一个类中的一个静态方法,可以通过类名.访问
        T1.t1();
        //t2是另一个类中的实例方法,先创建对象才能访问。
        //这两种方式都是错误的。
//        T1.t2();
//        t2();
        T1 t = new T1();
        t.t2();

        System.out.println(i);
        System.out.println(j);
    }
    public static void m3(){}
    public static void m4(){}
    /*
    分析:
        1、main方法是静态的,JVM调用main方法的时候直接采用的是“类名.”的方式,所以main方法中没有this.
        2、m1()和m2()都是实例方法,按照规则:实例方法必须先new对象再通过“引用.”的方式访问。
     */
    public static void main(String[] args){
        //报错:无法从静态上下文中引用非静态 方法
//        m1();
//        m2();
        m3();
        m4();
        //错误:无法从静态上下文中引用非静态 变量 i
        //System.out.println(i);
        System.out.println(j);

        //想要访问m1()、m2()和i,必须先new对象。
        review2 r = new review2();
        System.out.println(r.i);
        r.m1();
        r.m2();

        //局部变量,访问时不需要类名.
        int k = 10000;
        System.out.println(k);
    }
}
class T1{
    public static void t1(){}
    public void t2(){}
}
举报

相关推荐

0 条评论