Day03:

new 的功能:

    当使用 new 时会 1,创建给定类的实例对象;2,为它分配内存;3,调用给定类定义的一个构造函数。

 

    构造函数: 是用于创建和初始化类实例的方法。构造函数初始化新对象及其变量。每个类在没有手动添加构造函数时,java都会默认有一个空的构造函数。

 

内存管理:

      当创建新的对象时,java会自动分配适当数量的内存,当对象使用完后,会指向一个null值,表示不再使用,(该对象中没有任何正在使用的或者被存储数组中的变量),java定期查询未被使用的对象,并收回这些对象占有的内存。(无用单位收集)

 

实例变量和类变量由两部分组成,句点左边是对象和类的引用,句点右边为变量。

 

类变量:是在类中定义和存储。适用于类及其所有实例对象。

 

类变量的修改会直接影响所有实例中的这个变量。

 

定义类变量的方法:在前面加上关键字 static 。

 

类变量用 :类.(句点)类变量

实例变量用 :实例对象.(句点)实例变量

这样便于调试。

 

格式输出方法:

    System.out.format();

    相当于 C语言中 printf();

%,d    格式化整数

%,f     格式化浮点数    %,11f  控制位数 

%n   换行

 

有返回值的方法也可以赋给变量

a.b().c();

a对象有个b方法,b方法的返回值是一个对象,该对象中有一个c方法,可以通过这个嵌套方法调用c方法。

 

lei.bl.fangf();

fangf() 方法是在实例变量 bl 储存的对象中定义,这个实例变量本身在对象 lei 中。

 

class test01{
public static void main(String[]args){
                       a lei = new a();
                       lei.bl.fangf();
          }
}
class a{
         b bl = new b();
}
class b{
          void fangf(){
          System.out.println("hhhhhh");
           }
}

关于 System.out.println(); 的详解:

println() 方法是在实例变量 out  储存的对象中定义,这个实例变量本身在对象 System  中。

out 是一个 PrintStream 类型实例变量 。

 

System 中有一个 public static final PrintStream out 实例变量 

out 是一个 PrintStream 类型实例变量。

PrintStream 类中有一个 println() 方法。

 

类方法:

    类方法作用于整个类,而且不需要实例化,可以直接使用。

 

堆栈内存数据问题:

         java 的基础类型存放在 stack(栈)上,new 出对象后,只把 对象 的 reference(引用)存放在 stack(栈)中用来指向某个对象,对象本身放在 heap(堆)中。

 

       还有,调用方法时传递的参数以及在调用中创建的临时变量都保存在 stack(栈)中,速度较快。

 

        其它变量,如(static)静态变量(类变量),实例变量等都在堆中创建,速度较慢。

 

  java 中引用可以看做是一种不需要操作且受限制的指针,引用无大小,不可计算,安全,强转要小心。

 

 

对象的引用:引用是一个地址,它指明了对象的变量和方法储存的位置。

 

强制类型转换:

       1.基础类型之间的转换

       2.类型实例对象之间的转换

       3.基础类型转和对象之间的转换

 

大转小必须强制类型转换,小转大不需要强制类型转换。

 

位数多的基础类型转成位数小的基础类型需要强制转换

 

父类转子类需要强制转换

class a{ 
}
class b extends a{ 
}
class test{
 public static void main(String[]args){
            a a1 = new a();
            b b1 = new b();
            a1 = b1;     //子类转父类
         a a2 = new a();
            b b2 = new b();
            b2 = (b)a2;    // 父类转子类  需要强制类型转换
a a3 = new b();    // 子类 new 一个父类对象 
            b b3 = (b)new a();   // 父类 new 一个子类对象 需要强制类型转换
       } 
}

基础类型和对象之间的转换

class test{
 public static void main(String[]args){
                Integer a = new Integer(7801);  // Integer 对象转成 int 基础类型
                int i = a.intValue();
                System.out.println(i);
               String str = "6500";   //String 对象转成 int 基础类型
               int w = Integer.parseInt(str);
               System.out.println(w);
      }
}

多态:

    必须满足三个要求:1.必须有继承;2.必须有重写;3.必须有父类引用指向子类对象

多态例子代码:

public class testdt {
 public static void main(String[]args){
 BaiDog bd = new BaiDog();   //new 一个子类对象
 HeiDog hd = new HeiDog();   //new 一个子类对象
 ZhuRen zr = new ZhuRen("bai",bd);  //将子类对象传入父类引用中(父类引用指向子类对象)
 ZhuRen zz = new ZhuRen("hei",hd);  //将子类对象传入父类引用中(父类引用指向子类对象)
 zr.wan();  //调用的是被重写后的方法
 zz.wan();   //调用的是被重写后的方法
 }
}
class Dog {                                 //父类 Dog
  public void jiao(){          //父类 jiao( )方法
  System.out.println("wang,wang。。。。");
 }
}
class BaiDog extends Dog {        //继承 Dog 父类的 BaiDog 子类
 public void jiao(){            //重写父类的 jiao( )方法
  System.out.println("baidog-jiao111,baidog-jiao111......");
 }
}
class HeiDog extends Dog {        //继承 Dog 父类的 HeiDog 子类
 public void jiao(){            //重写父类的 jiao( )方法
  System.out.println("heidog-jiao222,heidog-jiao222......");
 }
}
 
 
class ZhuRen {
 String name;
 Dog d;
 ZhuRen(String name,Dog d){   //需要传入一个父类 Dog对象
  this.name=name;
  this.d=d;
 }
 public void wan(){
  d.jiao();        //调用传入对象的jiao( )方法,必须是父类中有的方法,子类重写后会显示重写后的内容,子类没有重写显示的是父类这个方法中的内容
 }
}

执行结果:baidog-jiao111,baidog-jiao111......

                  heidog-jiao222,heidog-jiao222......  //显示的是子类重写后的方法内容

 

基础类型对应的对象:

boolean     Boolean

byte            Byte

short           Short

int               Integer

long            Long

char            Character

float           Float

double       Double

 

对象封装器

自动封装和拆封:一种自动转换过程,处理表示同一类值的基本类型和对象时更容易。

 

自动封装:就是自动的将基本类型转换为对象;自动拆封则是相反。

 

如果编写语句时,本来应该出现基本类型变量的地方使用了对象(或者相反),相应的值会自动被转换,以便能够成功执行。

 

两个对象之间的比较:

== 比较的是两个对象的地址,检查是否是同一个对象 

equals()是 Object 类的方法 两个对象引用相同则返回true(与==用法一样),如果子类重写equals( )方法用法请参考重写后的equals( )方法

 

把相同内容赋给多个 String,返回的还是同一个对象。

 

判断对象所在的类:

对象.getClass().getName();

获得对象所在类的类名。

getClass() 和 getName() 都是Object 类中定义的方法

 

判断对象是否是这个类的对象:

用 instanceof 判断,左边是对象引用,右边是类名

boolean pd = (b)对象 instanceof (a)类型;(b对象是否是一个a类型对象,返回boolean类型)