第3课 面向对象 上

3课 面向对象 上

需要掌握内容:

1、什么是面向过程?

在一个结构体重定义窗口的大小位置颜色背景等属性对窗口操作的函数和窗口本身没有任何关系 如hidewindows等函数需要接手一个代表要被操作的窗口参数 是一种谓语和宾语之间的关系

2、什么是面向对象?

定义窗口时 除了要制定在面向过程中规定的那些属性如大小颜色位置背景等除外 还要制定窗口可能具有的动作 如隐藏移动最小化等 这些函数被调用时候都是以某个窗口要隐藏某个窗口要移动的语法格式来使用的 这事一种主语和谓语之间的关系

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

3、类与对象 类是对某一类失望的描述 是抽象的概念上的定义 而对象是实际存在的个体 是实例

class Person
{
int age;
void shout()
{
System.out.println(oh,my god! I am “ + age);
}
}
age是类的属性 ,也叫类成员变量 。
shout是方法也叫类的成员函数。
shout方法可以直接访问同一个类中的age变量 ,如果一个方法中有与成员变量同名的局部变量,该方法中对这个变量名的访问是局部变量,而不再是成员变量。 

 4、对象 由类来定义Person p1 = new Person(); 当一个对象被创建时候 其内部各种成员变量自动进行初始化 创建了对象之后就可以使用对象名点对象成员 或者对象名点属性与方法对对象的成员进行访问

5==运算符与equals()方法的区别和比较

==运算符比较对象是否相等 其中比较的是对象的首地址  也即是栈中的内容

equals()比较的是对象的内容是否相等 不比较对象的地址  也即是堆中的内容

class Compare

{

 public static void main(String[] args)

  {

String str1 = new String("abc");

String str2 = new String("abc");

String str3 = str1;

if(str1==str2)

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

else

System.out.println("str1!=str2");

if(str1==str3)

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

else

System.out.println("str1!=str3");

}

}

class Compare

{

 public static void main(String[] args)

  {

String str1 = new String("abc");

String str2 = new String("abc");

String str3 = str1;

if(str1.equals(str2))

System.out.println("str1 equal str2");

else

System.out.println("str1 not equal str2");

if(str1.equals(str3))

System.out.println("str1 equal str3");

else

System.out.println("str1 not equal str3");

}

}

6、匿名对象 

可以不经过定义对象就可以调用这个对象的方法 这样的对象就叫做匿名类如:new Person().shout();如果对一个对象只需要进行一次方法调用 那么就可以使用匿名对象

实现类的封装

为了不使外界对类中的成员随意更改 使用private关键字说明成员的访问权限 这个成员为类的私有成员 只能被这个类的其他成员方法调用 不能被其他类中的方法调用

类外面的类是不能访问类内部的私有变量 为了访问内部的私有变量 可以采用setget 函数来实现对变量的操作 也就是读取和赋值

class Person

{

private int age;

public void setAge(int i)

{

if(i<0 || i>130)

return;

age = i; 

}

public int getAge()

return age;

}

}

public class TestPerson

{

public static void main(String args[])

{

Person p1 = new Person();

p1.setAge(3);

p1.setAge(-6);

System.out.println(p1.getAge());

}

}

类的封装可以隐藏类的实现细节 同时便于修改 增强代码的可维护性 也可以很方便地加入控制逻辑 限制对属性的不合理操作

7、构造函数

构造函数具有和类相同的名字 不包含返回值 不能再方法中使用return语句返回一个值 更不能使用void修饰

构造方法的作用是当一个类的实例对象刚产生的时候 这个类的构造对象就会被自动调用 我们可以在这个方法中完成初始化的工作代码 

构造方法的重载 构造方法的重载时候可以有不同个数和不同类型的参数 编译器可以根据这一点判断出new关键字产生对象时候该调用哪一个构造方法了 

重载构造方法可以完成不同初始化的操作如如:p3=new Person(Tom,18);语句,会做这样几件事:创建指定类的新实例对象,在堆内存中为实例对象分配内存空间,并调用指定类的构造方法,最后将实例对象的首地址赋值给引用变量p3

注意 :一旦重载构造方法 类就不会自动定义一个无参数的构造方法 但是定义的构造函数可以是没有参数的

8This 关键字 

一个方法被调用 一定在之前有一个存在的对象将这个方法调用

在方法内部也能引用别的对象 同样也能引用该方法所属的那个对象

在方法中 自己所属的那个对象的引用的名称就是this this在函数内部就是这个函数所属的对象的引用变量

This关键字在java程序里的定义和他的词义很相近 在函数内部就是这个函数所属的对象的引用变量 每个成员方法的内部 都有一个this引用变量指向调用这个方法的对象

9、垃圾回收过程分析
java中的finalize()方法类似于c++中的析构方法

 当对象编程垃圾之后 程序自动调用finalize()函数

System.gc 就是垃圾清理器 使用这个方法使得finalize()函数的使用变得清晰显而易见

10、函数的参数传值

对象的引用变量作为参数传值 利用对象传值 

数组对象作为参数传值是与对象的引用变量传值类似

11Static静态变量

当我们编写类的时候是对其对象的属性和行为的一种描述而非产生实质的对象 只有通过new关键字才会擦很难升出对象 这事系统才会分配内存空间给对象 其方法才能让外部调用 但是有些数据只能是空间的一部分 是不能轻易改变和被调用的 我们可以加上关键字static使之成为静态变量

12Static静态方法

静态方法中只能调用其本身的静态成员变量与成员方法 而不能访问类中的非静态成员 因为非静态变量成员和方法必须先创建类的实例对象后才可以使用 而静态方法在使用前是不用创建任何对象的

静态方法不能以任何方式引用thissuper关键字 因为当静态方法被调用时候 this所引用的对象根本没有产生

Main方法是静态的所以jvm在执行main方法时不创建main方法的类的对象 所以在main方法中不能直接访问该类中的非静态成员 必须创建一个实例对象之后才能通过这个对象去访问类中的非静态变量 

13、静态代码块 当类被载入时 静态代码块被执行 而且只执行一次 静态块经常用来进行类属性的初始化

类中的静态代码块被自动执行 当一个程序中用到了其他的类 类是在第一次被使用时候才被装载 而不是程序启动时装载

14、设计模式就是在大量的实践中总结和理论化之后优选出来的代码结构 编程风格以及解决问题的思考方式 

类的单态设计模式就是采取一定的方法保证在整个软件系统中对某个类只能存在一个对象实例 并且该类只提供一个取得对象实例的方法 如果要让类只能产生一个对象 则我们必须将构造方法的访问权限设置为private 如此 就不能用new操作符在类的外面产生类的对象了 但是在类的内部可以产生该类的对象 类的外部可以选择调用该类的某个静态方法以返回类内部创建的对象 静态方法只能访问类中的静态成员变量 所以 指向类内产生的该类对象的变量也必须定义为静态的

15Main方法

虚拟机需要调用main方法 所以访问权限必须是public 但是虚拟机执行main方法时不需要创建对象 所以该方法必须是static 该方法接收一个string类型的数组参数 该数组参数中执行java命令时传递给所运行类的参数

16、内部类----在类中直接定义的内部类

Static修饰的一个内部类 就相当于是一个外部定义的类 所以static内部类可以声明static成员 但是非static内部类中的成员不能声明为static  static的内部类不能使用外层封装类的非static成员变量 因而static嵌套类很少使用

嵌套类可以直接访问嵌套它的类的成员 包括private成员 但是嵌套类的成员区不能被嵌套它的类直接访问

在内部类对象保存了一个对外部类对象的引用 当内部类的成员方法中访问某一个变量时如果在该方法和内部类中没有定义过这个变量 内部类中对this的引用会被传递给那个外部类对象的引用

如果函数的局部变量(函数的形参也是局部变量),内部类的成员变量,外部类的成员变量重名,我们应该按下面的程序代码所使用的方式来明确指定我们真正要访问的变量。 
public class Outer
{
 private int size;
 public class Inner
{
      private int size;
      public void doStuff( int size)
{
       size++; // 引用的是doStuff函数的形参
     this.size++; //引用的是Inner类中的成员变量
     Outer.this.size++; // 引用的Outer类中的成员变量
   }
}
}

再如:

class Outer
{
    private int size=10;
    public class Inner
    {
    public void doStuff()
    {
        System.out.println(++size);
    }
    }
}
    public class TestInner
    {
    public static void main( String[] args)
    {
    Outer outer = new Outer();
    Outer.Inner inner = outer.new Inner();
    inner.doStuff();
    }
    }

在方法中定义的内部类只能访问方法中的final类型的局部变量 用final定义的局部变量相当于一个常量 

17使用Java的文档注释

文档注释以“/**”开始,以“*/”标志结束,相应的信息和批注所对应的位置很重要! 类的说明应在类定义之前,方法的说明应在方法的定义之前。 
批注参数来标记一些特殊的属性及其相应的说明 。
@author<作者姓名>
@version<版本信息>
@param<参数名称><参数说明>
 @return<返回值说明>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值