第六章 面向对象编程 下
1.关键字 static
- static 可以用来修饰属性,方法,代码块,内部类
1.1 static 修饰属性
- static 修饰的变量也称为静态变量
- 按照是否使用static修饰可以分为
静态变量(类变量) vs 非静态变量(实例变量)
非静态变量:创建了类的多个对象,每个对象都独立的拥有一套类的非静态属性,改变其中一个对象的非静态属性时,不会导致其他对象同样的属性修改。
静态变量:创建了类的多个对象,多个对象共享一个静态变量,当通过一个对象修改静态变量的值的时候,其他对象调用此变量是,是修改过的。 - static修饰的属性
- 静态变量随着类的加载而加载,可以直接通过类.静态变量的方法调用
- 静态变量的加载早于对象的加载
- 由于类只会加载一次,所以静态变量在内存中也只会有一份,存在于方法区的静态域中
- 举例
System.out
Math.PI;
类变量 |
实例变量 |
|
类 |
可以调用 |
不可以调用 |
对象 |
可以调用 |
可以调用 |
public class StaticTest1{
public static void main(String[] args){
Chinese c1 = new Chinese();
= "张三";
c1.age = 20;
Chinese c2 = new Chinese();
= "李四";
c2.age = 45;
c2.nation = "CHN";
System.out.println(c1.nation);
}
}
class Chinese{
String name;
int age;
static String nation ;
}
1.2 static修饰方法-
- static修饰的方法叫静态方法
- 随着类的加载而加载,可以通过类.静态方法的方式进行调用
静态方法 |
非静态方法 |
|
类 |
yes |
no |
对象 |
yes |
yes |
- 静态方法中只能调用静态的方法或属性
非静态方法中,既可以调用非静态的方法。也可以调用静态的方法。
public class StaticTest2{
publiv static void main(String[] args){
}
}
**static注意点 **
- 在静态方法内,不能使用this关键字和super关键字
1.3 如何确定属性或方法要不要声明成静态的
- 属性
属性可以被多个对象所共享的,不会随着对象的变化而变化的
类中的常量通常定义为static的
- 方法
操作静态属性的方法,通常设置为静态的
工具类中的方法,通常定义为static的,如Math,Arrarys。
2.main方法的语法
- main()方法是程序的入口
- main()方法也是一个普通的静态方法
- main()方法可以作为跟控制台交互的方式
3.类的成员之四:代码块
用来初始化类,对象
如果要用修饰符修饰的话只能用static
4.关键字 final
final修饰的类不可以有子类,但是可以有父类,final修饰的方法不可以被覆盖,但是可以被继承,当final修饰变量的时候,一旦赋值之后就不可以更改
final修饰属性时,保护的是属性的值不受改变,当final修饰的是引用数据类型时,保护的是引用的地址不发生改变
5. 抽象类与抽象方法
- 抽象类
抽象类表示这个类不形象不具体,特点是不允许创建对象
抽象类也是类,也有构造方法,但是不可以用来创建对象,是给子类构造器首行的super()调用的
- 抽象方法表示这个类型一定会这个方法,但是现在给不出来具体的实现,待留给子类去实现当一个类中出现了抽象方法以后,这个类一定变成抽象方法,
public abstract Animal{
//抽象方法的特点是不能有方法体,直接()结束
public abstract void eat();
}
抽象方法里边既可以出现抽象方法又可以出现普通方法
6. 接口(interface)
- 接口相当于工业生产中的规范
- 接口不允许创建对象但是可以用匿名实现类
class、interface、enum、@interface在编译之后都
可以生成class文件
//如何定义一个接口
interface XXX{
//属性
//接口默认加上三个修饰符
//public static final
int x = 34;
//方法:返回类型 +方法签名
//接口默认加上两个修饰符
//public abstract
void show();
}
两两之间的关系
类和类之间:extends
类和接口之间:implements
接口和就扣之间:extends
java中的类只允许单根继承,但是接口允许多重继承,一个类在继承另外一个类的同时还可以实现多个接口
6.1接口和抽象类之间的区别
- 是java中的两个类型,抽象类属于类是class,接口是interface
- 里边边定义的属性不一样
抽象类里边定义的属性就是普通属性,最多加上一个default,
接口里边定义的属性都是静态的**[public static final]**
- 里边定义的方法不一样
抽象类里边既可以定义抽象方法,又可以定义普通方法
接口里边只能定义抽象方法从jdk8.0开始可以出现普通方法了
6.2 接口的应用
- 代理模式
- 工厂模式
- 简单工厂模式
7.类的成员之五:内部类
- java中允许把一个类声明在另外一个类中
class Person{
static class Phone{
}
class PC{}
}
// Person.Phnone p = new Person.Phone();
//Person p = new Person();
//Person.PC p1 = p.new PC();
在局部内部类的方法中(show),如果调用局部内部类所声明的方法(method)的局部变量(num),要求变量必须声明成final的
public class Test{
pubilc void method(){
//JDK 7及以前需要显示的声明为final的 8及以后则不需要
final int num = 1;
class AA{
public void show(){
System.out.println(num);
}
}
}
}
7.1 成员内部类
如果成员内部类不是静态的,那么内部类中也不能出现静态的属性或方法
7.4 匿名内部类
匿名内部类创建对象:
new 父类/接口(参数){
抽象方法的具体实现
}
8. 单例模式
- 在某一个类中只能存在一个对象实例
实现单例模式
- 私有化构造器,
避免在其他类调用构造器
- 内部创建静态的类的对象
- 提供静态的公共的方法,返回类的对象
8.1 懒汉模式
//懒汉式
public class Singleton1{
public static void main(String[] args){
Order order1 = Order.getInstance();
Order order2 = Order.getInstance();
Order1 == Order2;//true
}
}
class Order{
//1.私有化构造器
private Order();
//2.声明当前类的对象,没有初始化
//4.此对象也必须声明为静态的(static)
private static Order instance = null;
//3.声明公共的静态的返回当前对象的方法
publicstatic synchronized Order getInstance(){
if(instance == null){
instance = new Order();
}
return instance;
}
}
8.2 饿汉模式
//饿汉式
public class Singleton{
public static void main(String[] args){
Bank bank1 = Bank.getInstance();
Bank bank2 = Bank.getInstance();
bank1 == bank2;//true
}
}
class Bank{
//私有化构造器
private Bank();
//内部创建类的将静态对象
private static Bank instance = new Bank();
//提供公共的静态方法,返回类的对象
public static Bank getInstance(){
return instance;
}
}
好处 |
坏处 |
|
懒汉式 |
延迟对象创建 |
目前的写法是线程不安全的,用synchronized修饰即可 |
饿汉式 |
饿汉式是线程安全的 |
对象加载时间过长 |