基本类型
运算符 +-*/%> == != &&||! &|^~>> >>> << ++-- ?: = +=
流程控制
数组
=====================================
面向对象
=====================================
* 人为抽象的一种编程模型
* 复杂问题拆分成一个一个的小问题,
通过解决每个小问题,来解决复杂问题
类
对象、实例
引用
构造方法
this
方法重载
继承
方法重写
super
多态
instanceof
抽象类
final
static
访问控制符
接口
内部类
类
===================================
* 理解成“图纸”
* 对事物、算法、逻辑、概念的抽象
* 将相关的数据、运算代码,
封装在一个类组件中
对象、实例
===================================
* 理解成从“图纸”生产出的具体“物体”
* 每个对象,占用独立的的内存空间,
保存各自的属性数据
* 每个对象,可以独立控制它执行
指定的方法代码
引用
===================================
* 理解成“遥控器”
* 引用变量中,保存一个对象的内存地址
* 通过引用变量,可以找到
一个对象的内存空间,
访问它的属性,或调用它的方法
* 引用变量的特殊值 null
*)null 空
不引用任何对象的内存地址
构造方法
======================================
* 新建实例时,执行的特殊方法
new Soldier()
new Car()
new Dog()
new Point()
* 一个类,必须有构造方法
* 如果自己不编写构造方法,
编译器会添加默认构造方法
class A {
public A() {
}
}
* 构造方法重载(不同参数)
class A {
public A(int i) {
...
}
public A(int i,double d) {
...
}
public A(int i,double d,String s) {
...
}
}
* 构造方法的作用: 不知道
*)常用来为成员变量赋值
this
=======================================
* 两种用法:引用当前对象、构造方法间调用
* 引用当前对象
this保存当前对象的内存地址
可以用 this 调用当前对象的成员
this.name
this.f()
* 构造方法之间调用 this(...)
*)减少代码重复
*)一般从参数少的方法,
调用参数多的方法,
多个参数集中在一个方法中处理
*)必须是首行代码
方法重载
======================================
* 同名不同参
继承
===================================
* 作用:代码重用、代码复用
* 单继承:
*)一个类只能继承一个父类
*)一个父类可以有多个子类
* 不继承构造方法
* 不继承不可见的成员
* 方法重写 Override
*)继承的方法,在子类中重新编写
* 创建子类对象
1)先创建父类对象
2)再创建子类对象
*)两个对象绑定在一起,作为一个子类对象
* 构造方法
1)创建父类对象时执行父类构造方法
2)创建子类对象时执行子类构造方法
*)默认执行父类无参构造方法
super()
*)可以手动调用父类有参构造方法
super(参数)
* super 两种用法
*)重写方法时,调用父类同一个方法的代码
super.toString()
*)手动调用父类构造方法
super() 默认
super(参数) 手动
*)必须是首行代码
多态
=====================================
* 作用: 一致的类型
* 类型转换
*) 向上转型
子类对象,转换成父类型,
被当做父类型处理
*)向上转型之后,只能调用父类中定义的
通用成员,不能调用子类特有的成员
*) 向下转型
已经转为父类型的子类对象,
再转回成子类型
* instanceof
*) 判断对象的类型
*) 对真实类型及其父类型判断,
都返回 true
Shape s = new Line();
s instanceof Line true
s instanceof Shape true
抽象类
=============================================
* 作用:
*)为子类提供通用代码
*)为子类提供通用方法的定义
* 半成品类
* 不能创建实例
* 只能创建子类的实例
* 包含抽象方法的类,必须是抽象类
* 抽象方法调用
执行子类中实现的方法
final
=====================================
* 修饰变量、方法、类
* 变量
*)变量的值不可变,称为“常量”
final int a = 10;
//a = 11;//错
final Point a = new Point(3, 4);
a.x = 30;//对
//a = new Point(4, 5);//错
//a = null;//错
* 方法
在子类中不能重写这个方法
* 类
没有子类,不能被继承
static
=====================================
* 静态
* 静态成员属于类,而不属于实例
class Soldier {
int id;
static int count;
}
Soldier s1 = new Soldier();
Soldier s2 = new Soldier();
s1.id = 9527;
s2.id = 9528;
s1.count = 1;
s2.count = 2;
print(s1.id);
print(s1.count);
* 访问静态成员,一般使用类名调用
Soldier.count = 1;
Soldier.count = 2;
* 什么时候使用静态
*)使用原则: 能不用就不用
静态是“非面向对象”的语法
*)使用场景:
*)共享的数据
*)工具方法
Math.sqrt()
Math.random()
Arrays.toString()
Integer.parseInt()
* 静态初始化块
class A {
static {
类加载时,只执行一次
}
}
常量
=====================================
* static final
final 不可变
static 只有一个内存地址,节省内存
* 常量名习惯使用全大写,单词之间加下划线
static final int MAX_VALUE = 32;
对象创建过程
=====================================
class A {
int v1 = 1; //实例变量,非静态
static int v2 = 2; //类变量,静态
static {
...
}
public A() {
...
}
}
-----
class B extends A{
int v3 = 3;
static int v4 = 4;
static {
...
}
public B() {
...
}
}
-----
B b = new B();
创建过程:
-------------------------------------
第一次用到 A 类和 B 类
1.加载父类,为父类静态变量分配内存
2.加载子类,为子类静态变量分配内存
3.执行父类静态变量赋值运算和静态初始化块
4.执行子类静态变量赋值运算和静态初始化块
再次用到 A 类和 B 类
5.为父类对象分配内存,为非静态变量分配内存
6.为子类对象分配内存,为非静态变量分配内存
7.执行父类非静态变量赋值运算
8.执行父类构造方法
9.执行子类非静态变量赋值运算
10.执行子类构造方法
访问控制符
=====================================
* 控制类或类中的成员的访问范围
类 包 子类 任意
public O O O O
protected O O O
[default] O O
private O
* 选择原则:尽量小范围访问
public 是与其他开发者的契约,
约定公开的东西会保持稳定不变
接口
========================================
* 作用:结构设计工具,用来解耦合
* 是极端的抽象类
* 用 interface 代替了 class 关键字
* 用 implements 代替了 extends 关键字
* 在接口中只能定义:
*)公共的常量
*)公共的抽象方法
*)公共的内部类、内部接口
* 一个类可以同时实现多个接口
class A implements B,C,D {
}
class A extends B implements C,D,E {
}
* 接口之间继承
interface A extends B,C,D {
}
内部类
==========================================
* 定义在类内部,或局部代码块内部的类
* 非静态内部类
class A {
class Inner {
}
}
A a = new A();
A.Inner i = a.new Inner();
* 静态内部类
class A {
static class Inner {
}
}
A.Inner i = new A.Inner();
* 局部内部类
class A {
Weapon a() {
class Inner implements Weapon {
}
Inner i = new Inner();
return i;
}
}
A a = new A();
Weapon w = a.a();
* 匿名内部类
Weapon w = new Weapon() {...};
*)大括号是匿名类
*)new 新建匿名类的实例
*)继承 Weapon 作为 Weapon 的子类型
练习
===================================
1.
定义士兵类
tarena.day0605.Soldier
属性:
int id
int blood
方法:
go()
attack()
2.
手电筒
定义“手电筒”类
tarena.day0701.FlashLight
属性:
int color
boolean on
方法:
turnOn()
turnOff()
3.
汽车
tarena.day0702.Car
属性:
String brand
String color
int speed
方法:
go()
stop()
4.
电子宠物
tarena.day0703.Dog
属性:
String name
int hungry
int happy
方法:
feed()
play()
punish()
5.
平面坐标点
tarena.day0704.Point
属性:
int x
int y
方法:
toString() 成员变量的值连接成字符串
distance() 距原点的距离
6.
学生
tarena.day0705.Student
属性:
int id
String name
String gender
int age
构造方法:
Student()
Student(id,name)
Student(id,name,gender)
Student(id,name,gender,age)
方法:
toString()
四个成员变量的值连接成字符串
7.
Person
|- Student
|- Employee
Person
属性:
String name
String gender
int age
构造方法:
Person()
Person(name,gender,age)
方法:
toString()
属性的值连接成字符串
Student
属性:
String school
Employee
属性:
String company
8.
二维点三维点
Point
|- Point3D
Point
属性:
int x
int y
构造方法:
Point(x, y)
方法:
toString()
distance()
Point3D
属性:
int z
构造方法:
Point(x,y,z)
方法:
toString()
distance()
9.
电子宠物
Pet
|- Dog
|- Cat
10.
图形形状
Shape
|- Line
|- Circle
|- Square
Shape
方法:
draw()
clean()
子类中重写 draw() 方法
11.
员工工资、奖金
Employee
|- Programmer
|- Manager
Employee
gongZi() 抽象
jiangJin() 抽象
zongHe()