类和对象

   类和对象

                 在面向对象编程中,将“具体的”称为“对象”,将“抽象”称为“类”

                 类和对象:类是抽象的,(人)       对象是具体的,(张三)

                          多个对象,可以抽象出类      

                           类可以产生多个对象

                   类和对象的组成部分: 静态:属性(属性名,属性值) :身高 体重 年龄 颜色 形状等 

                                                        动态(功能):方法:吃饭 睡觉 支撑等

                            例: 桌子:类 这个桌子:对象

                     类可以细分,但细分并不一定是对象。

                       例如 人:男人 女人 如果觉得抽象了那就是一个类,如果觉得是具体了那就是一个对象

                           类:可以根据范围的不同,在细分:对象:具体,不能再细分

                          类:由一组抽象的属性和方法构成    对象:由一组特定属性和方法构成

            类 zs=new 类();

              例: Person zs=new Person();

                      Person ls=new Person();

            方法是多个对象共享的 属性是各个对象独有的

                一般而言,对象 是指堆中的东西.... 栈里面zs的称为引用

               引用:相当与c语言的指针。持有对象的内存地址 但是根据Everything is an Object

 

              属性:就是全局变量

                     全局变量:方法以外,类以内;有初始值(数据类型的默认值 int 0)

                     局部变量:方法内部:没有初始值,在使用前必须赋初值

                                                         局部变量可以和全局变量重名,并且局部变量优先级高

package Demo02;

public class Person
{
   //类:由一组抽象的属性和方法构成 抽象 :没有具体的属性和方法,只看到名字和年龄但不知道值是多少
   //静态 属性
   String name;
   int age;
   //动态 方法
   //吃饭
   public void eat()
  {
       System.out.println("吃饭");
  }
   //睡觉
   public void sleep()
  {
       System.out.println("sleep");
  }
}
package Demo02;

public class TestPeson
{
   public static void main(String[] args)
  {
       // 对象:由一组特定属性和方法构成
       //看到张三这个人了,他叫张三,年龄28
     Person zs=new Person();  //产生这个人叫张三
       //张三有属性名和年龄
       //对象.属性
       zs.name="张三";
       zs.age=28;
       System.out.println(zs.name);  //赋完值就可直接用
       System.out.println(zs.age);

       //对象.方法 叫做对象调用方法 对象的调用
       zs.eat();
       zs.sleep();

       Person ls=new Person();
       ls.name="李四";
       ls.age=33;
       System.out.println(ls.name);
       System.out.println(ls.age);
       ls.eat();
       ls.sleep();

     //方法是多个对象共享的
     //属性是各个对象独有的
  }
}

             方法的调用的常见情况:

                                    一个类中:

                                               都有static ,或都没有static:或没的调有的:直接调用有static

                                                     有static 不能直接调用 没有static的方法

                                      调用没static:对象名.方法()      调用static:直接调用

                          不在同一个类:

                                万能方法:new 对象,通过对象点方法();

                                     类名.方法() 其中的方法必须是static 修饰符的

                                      static方法 是类级别的 ,属于类

                                     非static方法 是对象级别的,属于对象

                                 对象.static方法()   对象.非static方法()

                                                                 类.static方法()

                            类包含对象,类产生对象 例:类有的,对象也有,对象有的,类不一定有

                  静态方法: 有static

                 非静态方法:没有static修饰符

package Demo02;

public class Person2
{
   public static void eatFruit()
   //public void eatFruit()
   //{ System.out.println("吃水果");}
  {
       System.out.println("吃水果");
  }
   public void eatFood()  //非静态方法
   //public static void eatFood() 静态方法 报错
   //{eatFruit();} //不可以调用
  {
       System.out.println("吃主食");
       eatFruit(); //可以调用
  }
}
package Demo02;

public class TestPeson
{
   public static void main(String[] args)
  {
    Person2 p2=new Person2();
     p2.eatFood();
  }
}

           多个构造方法之间 不能循环调用

                      子类继承父类:

                                private,构造方法 是不能被继承的。但是 子类可以显示的调用父类构造super

                               private:本类 属性

                                public:全部 方法

                           protected:父子关系 子类继承父类

              子类引用父类的protected属性:

                                   1. 不要new,子类直接使用父类属性 (子类直接拿父类的东西)

                                             静态代码块:第一次执行,永远执行一次。初始化(人机猜拳:人 计算)

                                             普通代码块:在每次执行无惨构造之前执行。

package Demo02;

public class TestStatic
{
   public TestStatic()
  {
       System.out.println("无参构造");
  }
   static {  //静态代码块
       System.out.println("static");
  }
  { //普通代码块
       System.out.println("普通代码块....");
  }
   public static void main(String[] args)
  {
       new TestStatic();
       new TestStatic();
       new TestStatic();
       /*
       结果
          static
          普通代码块....
          无参构造
          普通代码块....
          无参构造
          普通代码块....
          无参构造
        */
  }
}

                  new Xxx():经历了以下过程

                                            父类static...

                                            子类static...

                                            父类普通代码块...

                                            父类无惨...

                                           子类普通代码块...

                                           子类无惨.....

package Demo02;

public class Father
{
   static {
       System.out.println("父类static...");
  }
  {
       System.out.println("父类普通代码块");
  }

   public Father()
  {
       System.out.println("父类无参...");
  }
}
package Demo02;

public class Son extends Father
{
   static {
       System.out.println("子类static...");
  }
  {
       System.out.println("子类普通代码块");
  }
   public Son()
  {
       //无参构造方法会默认执行了super();
       // 调用子参构造时会自动执行父类无参
       System.out.println("子类无参...");
  }
}

package Demo02;

public class TestSon
{
   public static void main(String[] args)
  {
       //在new 产生对象之前,经历了哪些过程(程序的初始化流程)
       Son son=new Son();  //调无惨构造
/*
 结果:
   父类static...
   子类static...
   父类普通代码块
   父类无参...
   子类普通代码块
   子类无参...
*/
  }
}
 

                    方法重载:方法名相同,参数列表不同(类型不同 或 个数不同 或 顺序不同)

                         注意两点:1.与返回值无关 2.与参数名无关

                         方法重写:父类有一个方法,子类重写了一遍 (父子关系)

                                 要求:1.方法名相同

                                            2.参数列表也相同

                       构造方法不能被重写

 

posted @ 2022-09-16 20:15  zjw_rp  阅读(51)  评论(0)    收藏  举报