面向过程和面向对象
类和对象
类的结构
发现类的共有属性(成员变量)
创建并使用对象
构造方法
构造方法名与类名相同,且没有返回值,且不需要使用void修饰
作用: 在构造方法中为创建的对象成员变量初始化赋值
方法的重载
对象与引用
值传递
形参数类型是基本数据类型,方法调用时,实际把它自己的值传给形式参数,是两个不同的存储单元,所以形参值的改变不影响实参的值。
public class Test1 { public static void main(String[] args) { int a = 20; Test1 test1 = new Test1(); test1.add(a); System.out.println("a= "+a); } public void add(int x){ x = 65; System.out.println("x="+x); } }
引用传递
形参数类型是引用数据类型参数,实际传递的只是地址,实参和形参指向的是同一地址,任何一方改变对象的值,另一方也会改变。
public class Test2 { String name; public void set(String n){ name = n; System.out.println("name = "+n); } public static void main(String[] args) { Test2 test2 = new Test2(); test2.name = "小黑"; test2.set("小黄"); System.out.println("name = "+test2.name); } }
基本类型传递的是该数据值本身。引用类型传递的是对对象的引用,而不是对象本身 。但是无论是值传递还是引用传递,其本质都是传值,所以也都统称值传递.
this关键字
this在类中表示当前正在表示的对象
this.成员变量名---->显示的访问当前对象的成员变量,常常用来区分同名的成员变量和局部变量
使用this关键字也可以引用成员方法或者构造方法
static关键字
static:被称为静态,可以修饰类中的成员变量,成员方法,代码块,内部类。
静态成员不依赖于类的示例,可以被所有实例共享,只要这个类被加载,静态成员就会被创建
特点:
1、随着类的加载而加载
2、优先于对象存在
3、修饰的成员。被所有对象共享
4、可不创建对象,直接使用类名调用
static属性:静态属性是类的所有对象共享的,可以通过类名.静态变量直接访问,也可以通过对象.静态变量的方式访问(但是更推荐使用类名.静态变量的方式)。
static修饰的方法,称为静态方法,可以直接使用类名调用,静态的方法中只能使用静态的成员变量,因为他们都是随着类的加载而加载,一旦方法中使用了非静态的成员变量,那么此方法不能定义为静态的方法,非静态的方法中可以使用静态的成员变量。
static修饰成员方法,修饰的成员方法称为类方法,可以直接使用类名访问。
静态方法中也不能使用this关键字,也不能使用super。
代码块
在类中声明的一个没有名字的代码块。
代码块分为:实例代码块和静态代码块
实例代码块在每次创建对象时执行
静态代码块在类被加载时会自动执行,运行类中的main方法,访问类中的静态成员变量或者静态成员方法,创建类的对象时会加载类。
public class Demo { static String s ="静态"; { System.out.println("实例代码块,创建对象时执行"); } static { System.out.println("静态代码块,类加载时执行"); } static { System.out.println(s); } public static void main(String[] args) { new Demo(); } }
包
包名命名,目前至少三级
第一级:项目名称 com org edu
第二级:公司名称 baidu sun huawei
第三级:项目名称 oa cms erp
第四级:功能模块 web service dao config
包的作用:
1、按照不同的功能管理类
2、避免类重名
3、控制访问权限,在不同的包中对不同权限的成员进行访问限制
当在一个类中,使用了另一个包中的类,使用前必须使用import关键字导入;使用本包的类以及java.lang包中的类时不需要导入
访问权限修饰符
访问权限修饰符可以修饰类、成员变量、成员方法、内部类
访问权限修饰符四种
public:公共权限;可以修饰类、成员变量、成员方法、内部类,可以在任意地方访问到。
protected:受保护权限;在本类中,同包的其他类中,不同包的子类中可以访问到
什么都不写:默认权限;在本类中,同包的类中可以访问到
private:私有权限;不可以修饰类,只能在本类中访问到。
访问权限修饰符,修饰类、成员变量、成员方法
变量的分类(按数据类型分)
基本类型变量
byte、short、int、long、float、double、char、boolean这8种关键字声明的
引用类型变量
类、数组等持有的是对象的引用地址
按照位置分
成员变量
定义在类中,可以使用权限修饰符修饰
在构造方法中进行自动的初始化赋值
生命周期:非静态的随着对象的创建而创建,随着对象的销毁而销毁;静态的随着类的加载而加载,销毁而销毁
存储位置:非静态在堆中;静态的在方法区中
局部变量
定义在方法中,不可以使用权限修饰符修饰
必须我们自己进行初始化
生命周期:方法调用时创建,运行结束时销毁
存储位置为栈
面向对象特征
面向对象语言的三大特征:封装、继承、多态
封装
一般意义封装,将重复出现的代码抽取为一个函数,称为代码的封装(包装)。
面向对象语言中的封装是将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问 。方便加入控制语句,主动权在类自己手中
将构造方法私有化,外界不能随便调用
向外界提供一个使用此对象的方法
继承
继承就是将同一类事物中共性的属性和行为进行抽取,定义在一个类中(基类),其他的类可以继承基类,就可以拥有基类中的功能,实现代码的复用性,以及可以在子类中扩展自己特有的功能而不影响其他类。
比如猫和狗都是动物,就可以抽取一个动物类,让猫和狗继承动物类
只要符合is-a(什么是什么)关系就可以使用继承
继承的语法
优点:
1.提高了代码的复杂性
2:减少了代码的冗余
3.继承的出现,更有利于功能的扩展。
4.继承的出现让类与类之间产生了is-a的关系,为多态的使用提供了前提
*子类 :使用extends(关键字)继承另一个类;
*一个类只能继承一个类,但可以间接的继承类,成为继承的传递性;子类继承父类后,拥有了父类的成员变量和成员方法,但是不能访问父类的私有成员。
*当一个类没有显示的继承,那么这个类默认继承object类。
*object类是java类体系中最大的类。
方法重写:
*当父类中的实现不能满足子类需求时,可以在子类中对父类的方进行重写(覆盖),这样调用时,就会调用子类中重写的方法。
方法重写的要求:
*子类重写的方法的结构必须和父类方法和名字一致,方法名,参数列表,返回值必须一致,访问权限应该大于父类方法权限。
@Override使用说明:
@Override是java中定义的注解标签,用来进行标记(进阶部分细讲) 写在方法上面,表示此方法是从父类重写而来,用来检测是不是满足重写方法的要求。
这个注解就算不写,只要格式满足要求,也是正确的方法覆盖重写。
建议保留:
1.这 样编译器可以帮助我们检查格式,
2.可以让阅读源代码的程序员清晰的知道这 是一个重写的方法
super:在子类中调用父类中的成员。
在Java类中使用super来调用父类中的指定操作:
1.super可用于访问父类中定义的属性
2.super可用于调用父类中定义的成员方法
3.super可用于在子类构造器中调用父类的构造器
注意:
尤其当子父类出现同名成员时,可以用super表明调用的是父类中的成员 super的追溯不仅限于直接父类还可以是父类的父类 super和this的用法相像,this代表本类对象的引用,super代表父类的内存空间的标识。
误区: 不要把super误认为是父类对象,在创建子类对象时,不会创建父类对象.只会将父类中的信息加载到子类对象中存储
·如果子类构造器中既未显式调用父类或本类的构造器,且父类中又没有空参 的构造器,则编译出错
抽象
抽象方法是一种特殊的方法:
它只有声明,而没有具体的实现. 抽象方法必须用abstract关键字进行修饰。
在一些体系结构的顶端类中,有些功能没必要实现,
抽象类:
*使用abstract修饰的类就是抽象类,一个类中如果包含抽象方法,那么这个类必定是抽象类,反之不一定。
特点:抽象类不能创建对象,其他功能于正常类相同。
程序员都是来继承这些抽象类并 覆盖抽象方法,实现具体功能
多态
·父类引用指向子类对象,从而产生多种形态 :
Animal dog = new Dog(); Animal cat = new Cat();
同一种事物,在不同时刻表现不同状态;
二者存在直接或者间接的继承关系时,父类引·用指向子类的对象,即形成多态
“当编译期类型是父类,
运行期类型是子类时,
被称为父类引用指向子类对象”
class Animal{ …… } class Cat extends Animal{ …… } class Dog extends Animal { …… } Animal c = new Cat() //Animal 的引用指向Cat的对象 Animal d = new Dog() //Animal 的引用指向Dog的对象
向上转型
class Animal{ void eat(){ } } class Cat extends Animal{ void eat() { System.out.println("狗吃骨头"); } }
Animal x=new Cat()
//向上造型,Cat对象提升到Animal对象 x.eat()
//在编译奇迹只能调用父类中定义的方法, 如果子类重写了父类方法,那么运行时调用子类重写的方法
多态性的好处:
提高代码的扩展性
//方法的形式参数类型是父类类型,而传递的实际参数可以是任意子类的对象 method(Animal animal){ animal .eat(); }
用父类型表示任意的子类类型对象,利于程序扩展
多态环境下对成员方法的调用
class Animal{ void show() { System.out.println(“Anmial"); } } class Cat extends Animal{ void show() { System.out.println(“cat"); } }……. Animal x = new Cat() x.show()
//调用的是子类中的方法; 简单的说:编译看左边,运行看右边
但是,对于静态,编译·运行都看左边;
(静态方法不存在重写)
一旦转为父类类型,就不能调用子类中特有的方法了;
可以向下转型
instanceof关键字
final
用于修饰类,方法,参数,和属性 r5(常量)
类:不能被定义为抽象类或是接口,不可被继承
方法:子类里不可以重写
参数:参数值在方法中不可被修改
属性:定义时就必须直接赋值或者在构造方法中进行赋值,
并且后期都不能修改
常量一般建议全部使用大写字母,多个字母之间用下划线联系
接口
从本质上讲,接口是一种特殊的抽象类,这种抽象类中包含抽象方法。
例:
USB接口本身没有实现任何功能
USB接口规定了数据传输的要求
USB接口可以被多种USB设备实现
面向接口编程:
关心实现类有何能力,而不关心实现细节
面向接口的约定而不考虑接口的具体实现