8.static关键字
概念
static被称为静态,可以用来修饰类的属性,方法,代码块,内部类。
随着类的加载而加载
优先于对象存在
修饰的成员,被所有对象所共享
可不创建对象,直接被类调用
static属性
静态属性是类的所有对象共享的,不管创建了多少个对象,静态属性在内存中只有一个。
static方法
可以使用对象调用,也可以直接用类名调用,建议用类名直接调用
在static方法内部只能访问类的static属性,不能访问类的非static属性,因为static属性先加载。
因为在类加载的时候加载方法,非static属性还没有加载,如果在静态方法中访问非static属性,该属性找不到。
代码块
代码块在类中声明,类似一个没有名称的方法体(代码块),代码分实例块和静态块
//实例块:每次创建对象时自动调用 { //任何符合语法的Java代码 } //静态块:类加载时自动调用,仅一次,与是否创建对象无关。 static { //任何符合语法的Java代码 }
9.类的加载执行
创建对象时,先执行静态代码块,在执行实例代码块,然后执行构造方法。
10.包
包的概念:
包就相当于一个文件夹
包的作用:
避免类重名
按照不同功能管理类
控制访问权限
包(package)的命名规范:
在包名中,可以使用 . 号来区分包的级别;包名一般情况下是小写
1.第一级 指该项目的类型,如com等,
2.第二级 指项目所开发或者运行的公司名称,如:oracle,sun,huawei等
3.第三级 指项目的名称。
4.第四级 指项目模块的名称。如:filter等表明这个包下类的功能
包可以更好得管理逻辑相关的类,可以控制不同包之间的访问权限
导入外部包的类,关键字import
访问权限修饰符
Java语言有四个权限访问修饰符,权限从大到小依次为:
1.public :公共权限 修饰类、属性、方法。可以被任意类访问
2.protected:受保护的权限 修饰属性、方法。可以被同包类访问,如果不是同包类,必须是该类的子类才可以访问。
3.default:同包权限 修饰类、属性、方法。只能被同包的类访问
4.private:私有权限 修饰属性、方法。 只能在本类中访问
11.面向对象语言的三大特征
1.封装
封装:有时称之为数据隐藏,将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问
好处:隐藏类的实现细节,方便加入控制语句,方便修改实现
具体表现是
1.属性使用private权限 (私有的)
2.方法使用public权限
例子:
public class Person { private String name; private String age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } }
我们可以发现上述代码用到了this关键字,那么什么是this关键字呢?
this关键字代表自身类的对象
功能:
1.使用this关键字引用成员变量
2.使用this关键字引用成员方法
注意:this关键字必须放在非静态方法里面
在一个类的方法或构造方法内部,可以使用“this.成员变量名”这样的格式来引用成员变量名,常常用来区分同名的成员变量和局部变量。
例如上面的:
this.name = name; //把局部变量赋值给自己类的成员变量
2.多态
多态是同一个行为具有多个不同表现形式或形态的能力
多态的优点
1.消除类型之间的耦合关系
2.可替换性
3.可扩充性
4.接口性
5.灵活性
6.简化性
多态存在的三个必要条件
1.继承
2.重写
3父类引用指向子类对象:Parent p = new Child();(Child类继承了Parent 类)
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。
public class Test { public static void main(String[] args) { show(new Cat()); show(new Dog()); } public static void show(Animal a) { a.eat(); // 类型判断 if (a instanceof Cat) { Cat c = (Cat)a; //向下转型 c.work(); } else if (a instanceof Dog) { Dog c = (Dog)a; c.work(); } } } public abstract class Animal { abstract void eat(); } public class Cat extends Animal { public void eat() { System.out.println("吃鱼"); } public void work() { System.out.println("抓老鼠"); } } public class Dog extends Animal { public void eat() { System.out.println("吃骨头"); } public void work() { System.out.println("看家"); } }
Test中的main方法输出:
同一个方法在不同情况下的表现不同,就是多态的体现。
3.继承
继承:继承是面向对象程序设计不可缺少的设计思想,是实现代码可重用的根基,是提高代码可扩展性的主要途径。
继承是从已有的类中派生出新的类,新的类能吸收已有类的属性和行为,并能扩展新的能力。
1.在JAVA中使用extends关键字来表示继承关系。
2.JAVA不支持多继承,单继承使JAVA的继承关系很简单,一个类只能有一个直接父类。
3.继承之后子类可以调用父类的所有非私有属性和非私有方法。
什么时候使用继承呢?
当你想用一些非本类的方法或属性时,可以使用继承,继承想使用的那个类,就可以将那个类中的属性方法拿过来用,可以让你少写一些代码。所以继承是代码重用的一种方式
public class Animal{ public static void eat(){ System.out.println("动物吃"); } } public class Dog extends Animal{ public static void main(String[] args) { Dog dog = new Dog(); dog.eat(); } }
专业术语:
Dog类是 Animal类的子类, Animal类是Dog类的父类(或者是) Dog类是 Animal类的派生类, Animal类是Dog类的基类。
继承的传递性
C类从B类继承,B类又从A类继承
那么C类就具有B类和A类的所有非私有的属性和方法
当一个没有继承任何一个类时,jvm(java虚拟机)会默认让类继承Object类
Object是 java为所有类提供的基类
继承中的构造方法
子类构造方法总是先调用父类构造方法,默认情况下,调用父类无参构造方法
可以在子类构造方法的第一行,使用super关键字调用父类任意一个构造方法
如果用super,必须写在方法的第一行
如果子类的构造方法中没有显式地(使用super)调用基类构造方法,则系统默认调用基类无参数的构造方法。
为什么要先创建父类:子类创建后需要调用父类的方法,所以在创建子类对象是父类也需要同时被创建.
我们又提到了一个新的关键字——super
super关键字用途
1.super关键字代表父类的引用,在程序中主要的用途
2.在子类构造方法中要调用父类的构造方法,需要注意:super语句只能出现在子类构造方法体的第一行。
3.用“super.成员变量名”来引用父类成员变量。
4.用“super.方法名(参数列表)”的方式访问父类的方法。
与this的区别,this通常指代当前对象,super通常指代父类。
方法的重写(OverRide)
在子类中可以根据需要对从基类中继承来的方法进行重写。
方法重写规则
1.方法名相同、参数列表相同;
2.返回值类型相同;
3.访问权限等于或大于父类中方法权限;
只有方法体不同(大括弧内的代码不同)
注意:构造方法不能重写
应用场景:
当父类的方法实现不能满足子类需求时,可以对方法进行重写( override)
12.类于类之间的关系
1.关联关系(has-a)
对象和对象之间的连接。在Java中,关联关系的代码表现形式为一个类做为另一个类的属性类型存在。
就是相当于我们在我们的类中定义了一个String类型的属性,那么,我们这个类和String类就是关联关系。
即“有”的关系:”has-a”。
关联关系分为单向关联和双向关联
1.单向关联: A类关联B类。
2.双向关联:A类关联B类,B类关联A类;
public class Phone { private Person per;//手机有主人 } public class Person { private Phone phone;//人拥有手机 }
关联关系的多重性
一对一关联:一个手机只能有一个主人
一对多关联:一个人,可以拥有多个手机。
解决一对多的关联的方案:集合或者数组
public List<Phone> phoneList;//集合 public Phone[] phones;//数组
2.依赖关系(uses-a)
依赖关系是指一个类A使用到了另一个类B,也就是说一个类的方法使用或者操作另一个类的对象
依赖关系的特性:
这种关系是具有偶然性的、临时性的、非常弱的,但是类B的变化会影响到类A。
依赖具体表现
1.在代码层面,依赖关系表现为类B作为参数被类A在某个方法中使用
例:
public class Person { public void travel(Bus bus){} }
注意:
应该尽量减少类与类之间有这种关系
3.继承关系(is-a)
这种关系在上文中有过解释,在这就不赘述了,写在这只是表明类与类还有这种关系。