Java——面向对象(小知识点)

主要内容:类和对象,方法详解,成员变量和局部变量,隐藏和封装,深入构造器,类的继承,多态,继承和组合,初始化块。

1.类和对象:

所有使用类定义的变量都是引用变量,引用变量里存放的仅仅是一个引用,它指向实际的对象。

Java支持面向对象的三大特征:封装、继承和多态

类里的各成员之间的定义顺序没有任何影响,static修饰的成员不能访问没有static修饰的成员(即static修饰的方法不能使用this引用)。

static对应类变量、类方法;不使用static修饰的成员变量对应实例变量、实例方法。

static修饰的方法和成员变量,既可以通过来调用,也可以通过实例来调用;没有static修饰的普通方法和成员变量,只可通过实例来调用。

普通方法可使用this调用本类中的普通方法,普通方法(即实例方法)需要通过对象访问,this即代表对象本身。this可以省略,但是依然存在。

对象可用调用static修饰的成员,但是不推荐!因为static为类修饰,用类名调用才符合实际。

2.方法详解:

java里的方法不能独立存在,所有的方法都必须定义在类里。方法在逻辑上,要么属于类,要么属于对象

不同对象调用static方法,都会得到相同的结果(因为static方法本质就是类的);非static方法,不同对象调用,结果可能不同。

java方法的参数传递只有一种:值传递。包括形参为类时,也是传递引用,即复制一个引用也指向存储对象的实际地址。

堆内存中保存对象本身,栈内存中保存引用该对象的引用变量。

形参个数可变的方法:

//以可变个数形参来定义方法   ①
public static void test(int a,String... books);

//以数组形式来定义方法       ②
public static void test(int a,String [] books);

//调用
test(5,"www","ddd");//①可用。简洁,但是也限制了个数可变的形参只能处于形参列表的最后

test(5,new String []{"qqq","www"});//①②都可用

递归一定要向已知方向递归。

方法重载:只和形参列表有关,和返回值、修饰符等都无关。

//重载
public void test(String msg)

public void test(String... bookls)

//一个参数会自动调用第一种,若一个参数想调用第二种,应传入数组

3.隐藏和封装

排序:private<default<protected<public

private:当前类

default(没有修饰符):当前包

protected:当前包+不同包的子类

public:公共访问权限

不是有了目录结构,就等于有了包名。java的包机制需要两个方面的保证:①源文件里用packge语句指定包名 ②class文件必须放在对应路径下 。 缺一不可

packge语句必须作文源文件的第一条非注释性语句。

父包和子包确实存在了某种内在的逻辑关系,但是在用法上不存在任何关系。不论处于何种文件层次,调用一个包(特别是子包)都要使用全名,不能省略父包部分。

import lee.*;只会调用lee包下的所有类,而不包含lee包的子包的类。

import后可以省略写包名;而import static后则可以连类名都省略。(因为import 引入包,static修饰后引入类)

import static java.lang.System.*;

//之后使用   out.println();即可

当程序员调用构造器时,系统会先为对象分配内存,在为这个对象执行默认初始化。这些操作在构造器执行之前就完成了。

下面代码实现了在一个构造器中直接使用另一个构造器来初始化代码:

public Apple(String name,String color,double weight)//三个形参的构造函数
{
this(name,color);//调用含有两个形参的构造函数
this.weight=weight;
}

5:类的继承

java是单继承。java只能有一个直接父类,可以有无数个间接父类。

java的子类不能获得父类的构造器。但是可以调用——super(size,name)

方法重写要遵循“两同两小一大”:方法名、形参列表相同;子类方法返回值类型、声明抛出的异常类应比父类方法更小或相等;子类方法的访问权限应比父类的更大或相等。

可以使用super父类类名调用父类中被覆盖的方法。(super访问实例,父类类名访问static)(或者向上转型—((parent)d).tag—)

如果子类定义了一个与父类方法具有相同方法名,但参数列表不同的方法,就会形成父类方法和子类方法的重载

当程序创建有一个子类对象时,系统不仅会为该类中定义的实例变量分配内存,也会为它从父类继承得到的所有实例变量分配内存。

6.多态:

java引用变量有两个类型:编译时类型,运行时类型

如图将子类对象直接赋值给父类引用变量,成为向上转换,由系统自动完成。四种情况

如图④情况,因为引用变量只能调用它编译类型的方法,所以要想调用运行时的方法,需要向下转型——(type)variable

这种类型转换注意:①基本类型之间的转换只能在数值类型之间进行。②引用类型之间转换只能在具有继承关系的两个类型才行,这个对象必须是子类实例!否则会classCastException异常

if(objPri instanceof String)  //使用instanceof运算符来判断是否可以成功转换
         //使用要求:运算符前面操作数的编译时类型要么与后面的类相同,要么与后面的类有父子继承关系
        //判断要求:运算符前面操作数的运行时类型要么与后面的类相同,要么有父子孙关系,其他全部false

{
    String str=(String)objPri;
}

7.继承和组合:

类复用:继承(破坏封装性),组合

继承:

继承:鸵鸟类继承鸟类

组合:胳膊类组合到人的类

8.初始化块

①变量无论先定义还是后定义,都是先分配内存,在从头读代码初始化

②先执行初始化块、声明变量时指定的值(按代码顺序),后执行构造器

③先从上而下执行所有的静态初始化块,再从上而下的执行普通初始化块和构造器。静态初始化块只需要初始化一次!(静态初始化,即类初始化,只需初始化一次,就会保存在java虚拟机-jvm)

猜你喜欢

转载自my.oschina.net/u/3786691/blog/1633110