课程回顾:
面向对象:是一种思想
类:方法和属性,抽象的、模板、概念上的定义
对象:类的实例化,实实在在的具体的实例
this:
1、代表本类对象
2、可以调用构造方法
属性的封装
1、私有的属性
2、并且提供公有的get和set方法
今日内容:
方法的参数传递
1、基本数据类型:传递的是数据的本身
2、引用数据类型:传递的是对象的地址
总而言之:参数传递的是栈内存中记录的内容
只是基本数据类型栈内存记录的数据的本身
而引用类型栈内存中记录的是对象的地址
构造代码块(空代码块):
格式:{代码块}
构造代码块的执行会根据创建对象的时候执行
而且先于构造方法执行
static:关键字 静态
1、修饰属性:静态属性
可以通过类名.属性名直接使用
注意:静态属性为类属性,所有对象共享
类被加载的时候,被初始化
2、修饰方法:静态方法
可以通过类名.方法名直接调用
注意:可以直接使用静态属性,不能直接使用非静态属性
在静态方法中不能直接使用非静态的属性和方法
但是在非静态方法中,可以使用静态的属性和方法
3、修饰代码块:静态代码块
常常被用来初始化静态属性
格式:static{代码块}
类被加载的时候执行,只执行一次
对象第一次创建时:
先执行静态代码块
再执行构造代码块
最后执行构造方法
4、修饰内部类
类中可以出现的:
1、属性[0,n]
2、静态属性[0,n]
3、方法[0,n]
4、静态方法[0,n]
5、构造方法[0,n]
6、构造代码块[0,n]
7、静态代码块[0,n]
8、成员内部类[0,n]
9、静态内部类[0,n]
10、内部接口[0,n]
package com.qianfeng.demo2;
public class TestMain01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Animal animal=new Animal();
animal.price=10;
animal.type="狗";
//静态属性,可以通过类名.属性名直接使用
Animal.type="猫";
System.out.println("类型:"+animal.type+",价格:"+animal.price);
Animal animal2=new Animal();
System.out.println("类型:"+animal2.type+",价格:"+animal2.price);
}
}
package com.qianfeng.demo2;
public class Animal {
//1、static修饰属性,类属性,所有对象共享
public static String type;//类型
public int price;//价格
//构造代码块
{
System.out.println("我是构造代码块");
}
public static void show() {
type="鱼";//静态属性可以直接被使用在静态方法中
// new Animal().price=12;
}
public void test() {
type="虎";//在非静态方法中,我们可以直接使用静态属性
show();
}
}
思考:如何保证一个类的唯一实例
设计模式之单例模式:
保证类的唯一实例
规则:
1、私有的构造方法
2、私有的静态本类对象
3、公有的静态方法
单例模式的实现方式:
1、懒汉式:不安全(线程不同步)
在声明本类的对象的时候没有实例化
2、饿汉式:安全
在声明本类对象的时候就完成实例化
练习:请自己动手体会static关键字的用法
包:就是存放java源文件的文件夹
包的作用:
1、避免类名冲突
2、隐藏类
3、通过合适的包名表达不同的意思
包名要求不能有大写,多级关系使用.连接
包名中的.其实就是相当于一层目录
package:声明包,必须出现在源文件的第一行
格式:package 包名;
说明对应的类属于当前声明的包
使用命令进行编译带包的源文件:
编译:javac -d . 文件名.java
执行:java 包名.类名
import:导入包,必须出现在类声明的上方
JDK5.0之后,支持静态导包
格式:import static 包名.类名.方法名/属性名
只能导入静态方法或静态属性
由于java.lang包,日常开发使用最为频繁,所有官方默认导入该包
思考:一个类怎么拥有另一类的信息?
1、聚合关系
就是将另一个类的对象作为本类的一个属性
2、继承
父类:超类---被继承的类
子类:基类、派生类---实现继承的类
子类可以拥有父类的部分(全部)属性和方法
构造方法不能被继承
java只能单继承,也就是说:一个类只能继承一个类
但是java允许继承的传递性
extends:实现继承关系
格式:[修饰符] class子类名称extends父类名称
{
属性
方法
}
一个父类可以有多个子类,但是一个子类只能拥有一个父类
练习:自己创建有继承关系的类并体会继承的作用
package com.qianfeng.demo5;
public class Father {
public String name;//名字
public int age;//年龄
private int money;
public void showInfo() {
System.out.println("名字:"+name+",今年:"+age+"岁");
}
}
package com.qianfeng.demo5;
//继承Father类
public class Son extends Father{
public String like;//爱好
}
package com.qianfeng.demo5;
public class TestMain01 {
public static void main(String[] args) {
//创建子类对象
Son son=new Son();
son.name="儿子";
son.age=12;
son.like="LOL";
//son.money=120;//子类只能拥有父类非私有的属性和方法
son.showInfo();
//创建父类对象
Father father=new Father();
father.name="爹";
father.age=32;
//father.like="学习";//父类不能拥有子类新增的属性或方法
//
Grill grill=new Grill();
grill.age=18;
grill.showInfo();
}
}
父类中:
静态代码块
构造代码块
构造方法
子类中:
静态代码块
构造代码块
构造方法
在第一次创建子类对象的时候,执行过程:
父类静态代码块
子类静态代码块
父类构造代码块
父类构造方法
子类构造代码块
子类构造方法
类加载的条件:
1、第一次调用静态属性
2、第一次调用静态方法
3、第一次创建类的对象
super:关键字 应用在子类中
用法:
1、调用父类中的属性或方法
2、调用父类中的构造方法
要求:必须在子类的构造方法中,而且只能是第一行
super不能出现在static方法中
this和super的区别?
this:
用在本类中
可以指代本类对象
可以调用属性和方法
可以调用自己的构造方法
super:
用在子类中
调用父类中的属性和方法
可以调用父类的构造方法
this和super都不能出现在static方法中
明天内容:
访问修饰符
重写
Object
抽象类
递归
设计模式之单例模式:
懒汉式、饿汉式
思考:如何保证一个类的唯一实例
设计模式之单例模式:
保证类的唯一实例
规则:
1、私有的构造方法
2、私有的静态本类对象
3、公有的静态方法
单例模式的实现方式:
1、懒汉式:不安全(线程不同步)
在声明本类的对象的时候没有实例化
2、饿汉式:安全
在声明本类对象的时候就完成实例化