目录
主要内容
一:类变量 类方法
引出
分析
细节
使用
对比
练习
- 1
- 2
- 3
一:main方法
- string arg[]
- idea
二:代码块
简介
new Movie("电影1", 35, "导演1");
System.out.println();
new Movie("电影2", 45);
System.out.println();
new Movie("电影3");
class Movie{
private String name;
private double price;
private String director;
public Movie(String name) {
System.out.println("Movie(String name) 被调用...");
this.name = name;
}
public Movie(String name, double price) {
System.out.println("Movie(String name, double price) 被调用...");
this.name = name;
this.price = price;
}
public Movie(String name, double price, String director) {
System.out.println("Movie(String name, double price, String director) 被调用...");
this.name = name;
this.price = price;
this.director = director;
}
{
System.out.println("电影屏幕打开...");
System.out.println("广告开始...");
System.out.println("电影正是开始...");
};
}
细节
class Father{
static int father_int = father_getInt();
public static int father_getInt(){
System.out.println("Father的father_getInt(),初始化father_getInt...");
return 100;
}
static{
System.out.println("Father的静态代码块...");
}
{
System.out.println("Father的普通代码块...");
}
}
class Children extends Father{
static int children_int = 50;
static{
System.out.println("···children静态代码块...");
}
{
System.out.println("···children普通代码块...");
}
}
new Children();
System.out.println(Children.children_int);
练习
- 1
- 2
三:单例设计模式
饿汉式
- 只能有一个对象
类加载,就创建了实例
System.out.println(GirlFriend.aa);
System.out.println("==============");
GirlFriend gf1 = GirlFriend.getInstance();
GirlFriend gf2 = GirlFriend.getInstance();
System.out.println(gf1);
System .out.println(gf2);
System.out.println(gf1 == gf2);
class GirlFriend{
//测试类加载
public static int aa = 100;
private String name;
private static GirlFriend gf = new GirlFriend("小梅");
private GirlFriend(String name) {
System.out.println("GirlFriend()构造方法...");
this.name = name;
}
public static GirlFriend getInstance(){
return gf;
}
@Override
public String toString() {
return "GirlFriend{" +
"name='" + name + '\'' +
'}';
}
}
懒汉式
//类加载没有创建对象
System.out.println(Lazy.aa);
System.out.println("==============");
Lazy lazy1 = Lazy.getInstance();
Lazy lazy2 = Lazy.getInstance();
System.out.println(lazy1);
System.out.println(lazy2);
System.out.println(lazy1 == lazy2);
class Lazy{
//测试类加载
public static int aa = 100;
private String name;
private static Lazy la;
private Lazy(String name){
System.out.println("Lazy()构造方法...");
this.name = name;
}
public static Lazy getInstance(){
if (la == null){
la = new Lazy("小脚丫···");
}
return la;
}
@Override
public String toString() {
return "Lazy{" +
"name='" + name + '\'' +
'}';
}
}
对比
四:final
细节
-
练习
-
可以修饰形参,但不可以修改值
五:抽象类
引出
细节
练习
Manager m1 = new Manager("经理1", 123456, 1000);
m1.setBonus(100);
m1.work();
CommonEmployee e1 = new CommonEmployee("员工1", 123456, 200);
e1.work();
abstract public class Employee {
private String name;
private int id;
private double salary;
//抽象方法
abstract void work();
//构造器
public Employee(String name, int id, double salary) {
this.name = name;
this.id = id;
this.salary = salary;
}
public String getName() {
return name;
}
}
public class Manager extends Employee{
private double bonus;
public Manager(String name, int id, double salary) {
super(name, id, salary);
}
@Override
void work() {
System.out.println("经理:" + getName() + " 工作中");
}
public void setBonus(double bonus) {
this.bonus = bonus;
}
}
public class CommonEmployee extends Employee{
public CommonEmployee(String name, int id, double salary) {
super(name, id, salary);
}
@Override
void work() {
System.out.println("员工:" + getName() + "工作中");
}
}
模板设计模式
public class t1 {
public static void main(String[] args) {
AA aa = new AA();
aa.calculateTime();
BB bb = new BB();
bb.calculateTime();
}
}
abstract class Template{
public long num = 0;
abstract void job();
public void calculateTime(){
long start = System.currentTimeMillis();
job();
long end = System.currentTimeMillis();
System.out.println("执行时间:" + (end - start));
}
}
class AA extends Template{
@Override
void job() {
System.out.println("AA_job");
for (int i = 0; i < 800000; i++) {
num += i;
}
}
// public void calculateTime(){
// long num = 0;
// long start = System.currentTimeMillis();
/*for (int i = 0; i < 800000; i++) {
num += i;
}*/
// long end = System.currentTimeMillis();
// System.out.println("执行时间:" + (end - start));
// }
}
class BB extends Template {
@Override
void job() {
System.out.println("BB_job");
for (int i = 0; i < 800000; i++) {
num -= i;
}
}
}
六:接口
细节
interface AA{
默认实现 jdk8支持
default void hi(){};
静态
static void method3(){};
默认就有public abstract
public abstract void method2();
void method1();
}
抽象类可以不实现
abstract class BB implements AA{
}
class CC extends BB{
@Override
public void method2() {
}
@Override
public void method1() {
}
}
- 练习
对比继承
- 继承:猴子爬树
- 接口:猴子飞
多态
-
类似继承
-
多态传递
-
练习
继续完善类
七:内部类
分类
定义在外部局部位置(方法)
1.局部内部类
2.匿名内部类
- main方法
Outher aa = new Outher();
aa.aa_fun();
- main方法后面
interface IA{
void ia_fun1();
void ia_fun2(int i);
}
class Father{
public Father(String name) {
System.out.println("接收到name: " + name);
}
public void father_fun(){ }
}
abstract class Animal{
abstract void eat();
}
class Outher{
public void aa_fun(){
//匿名内部类----基于接口
// 1.需求: 想使用 IA 接口,并创建对象
// 2.传统方式,是写一个类,实现该接口,并创建对象
// 3.老韩需求是 Tiger/Dog 类只是使用一次,后面再不使用
// 4. 可以使用匿名内部类来简化开发
// 5. tiger 的编译类型 ? IA
// 6. tiger 的运行类型 ? 就是匿名内部类 Outer04$1 /*
//7. jdk 底层在创建匿名内部类 Outer04$1,立即马上就创建了 Outer04$1 实例,并且把地址 返回给 tiger
//8. 匿名内部类使用一次,就不能再使用
IA ia = new IA(){
@Override
public void ia_fun1() {
System.out.println("ia_fun1");
}
@Override
public void ia_fun2(int i) {
System.out.println("ia_fun2");
}
};
ia.ia_fun1();
ia.ia_fun2(2);
System.out.println("ia 的运行类型:" + ia.getClass());//Outer$1
//基于类
//1. father 编译类型 Father
// 2. father 运行类型 Outer04$2
// 3. 底层会创建匿名内部类
/* 类似于
class Outer04$2 extends Father{
@Override
public void test() {
System.out.println("匿名内部类重写了 test 方法");
}
}
*/
// 4. 同时也直接返回了 匿名内部类 Outer04$2 的对象
// 5. 注意("jack") 参数列表会传递给 构造器
Father father = new Father("jack"){
@Override
public void father_fun() {
System.out.println("重写Father的father_fun方法...");
}
};
System.out.println("father 对象的运行类型=" + father.getClass());//Outer$2
father.father_fun();
//基于抽象类
Animal animal = new Animal() {
@Override
void eat() {
System.out.println("小牛吃草");
}
};
animal.eat();
}
}
调用
3.最佳实践
- 练习
public class t5 {
public static void main(String[] args) {
new CellPhone().alarmclock(new Bell() {
@Override
public void ring() {
System.out.println("懒猪起床了....");
}
});
//1. 传递的是实现了 Bell 接口的匿名内部类 t5$2
//2. 重写了 ring
/*
相当于
Bell bell = new Bell() {
@Override
public void ring() {
//System.out.println(this.getClass()); //t5$2
System.out.println("小伙伴上课了....");
}
});
* */
CellPhone cp = new CellPhone();
cp.alarmclock(new Bell() {
@Override
public void ring() {
//System.out.println(this.getClass()); //t5$2
System.out.println("小伙伴上课了....");
}
});
}
}
interface Bell{
void ring();
}
class CellPhone{
public void alarmclock(Bell bell){ //形参是 Bell 接口类型
System.out.println("运行类型是:" + bell.getClass());
bell.ring(); //动态绑定
}
}
定义在外部类的 成员位置
1.成员内部类
2.静态内部类
- 练习