课程地址:https://www.imooc.com/learn/124
powerDesign-uml下载地址:http://www.uml.org.cn/UMLTools/powerDesigner/powerDesignerToolIntroduction.htm
一、类和对象
1.1对象
1.2定义java中的类
定义类的首字母要大写
1.3使用java的对象
经常把属性称为实例变量
默认值是0
1.4成员变量,局部变量
成员变量
调用成员变量
局部变量只能在内部使用
1.5java中的构造法方法
1.6Java 中的 static 使用之静态变量
我们可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立。然而在某些时候,我们更希望该类所有的对象共享同一个成员。此时就是 static 大显身手的时候了!!
Java 中被 static 修饰的成员称为静态成员或类成员。它属于整个类所有,而不是某个对象所有,即被类的所有对象所共享。静态成员可以使用类名直接访问,也可以使用对象名进行访问。当然,鉴于他作用的特殊性更推荐用类名访问~~
使用 static 可以修饰变量、方法和代码块。
本小节,我们先认识一下静态变量。
例如,我们在类中定义了一个 静态变量 hobby ,操作代码如下所示:
要注意哦:静态成员属于整个类,当系统第一次使用该类时,就会为其分配内存空间直到该类被卸载才会进行资源回收!~~
1.7Java 中的 static 使用之静态方法
与静态变量一样,我们也可以使用 static 修饰方法,称为静态方法或类方法。其实之前我们一直写的 main 方法就是静态方法。静态方法的使用如:
需要注意:
1、 静态方法中可以直接调用同类中的静态成员,但不能直接调用非静态成员。如:
如果希望在静态方法中调用非静态变量,可以通过创建类的对象,然后通过对象来访问非静态变量。如:
2、 在普通成员方法中,则可以直接访问同类的非静态变量和静态变量,如下所示:
3、 静态方法中不能直接调用非静态方法,需要通过对象来访问非静态方法。如:
public class HelloWorld {
// 定义静态变量score1
static int score1 = 86;
// 定义静态变量score2
static int score2 = 92;
// 定义静态方法sum,计算成绩总分,并返回总分
public static int sum() {
return score1+score2;
}
public static void main(String[] args) {
// 调用静态方法sum并接收返回值
int allScore =HelloWorld.sum();
System.out.println("总分:" + allScore);
}
}
1.8static 使用之静态初始化块
Java 中可以通过初始化块进行数据赋值。如:
在类的声明中,可以包含多个初始化块,当创建类的实例时,就会依次执行这些代码块。如果使用 static 修饰初始化块,就称为静态初始化块。
需要特别注意:静态初始化块只在类加载时执行,且只会执行一次,同时静态初始化块只能给静态变量赋值,不能初始化普通的成员变量。
我们来看一段代码:
运行结果:
通过输出结果,我们可以看到,程序运行时静态初始化块最先被执行,然后执行普通初始化块,最后才执行构造方法。由于静态初始化块只在类加载时执行一次,所以当再次创建对象 hello2 时并未执行静态初始化块。
二、封装
2.1面向对象特性-封装
设为私有属性
发现不能调用
get和set方法
使用
2.2使用包管理java中的类
2.3访问修饰符
2.4this关键字
类里面自动创建get,set方法
调用方法
2.5java中的内部类
定义:
内部类( Inner Class )就是定义在另外一个类里面的类。与之对应,包含内部类的类被称为外部类。
内部类的主要作用如下:
1. 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类
2. 内部类的方法可以直接访问外部类的所有数据,包括私有的数据
3. 内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便、
分类:
成员内部类
静态内部类
方法内部类
匿名内部类
//外部类HelloWorld public class HelloWorld {
// 内部类Inner,类Inner在类HelloWorld的内部 public class Inner { // 内部类的方法 public void show() { System.out.println("welcome to imooc!"); } } public static void main(String[] args) { // 创建外部类对象 HelloWorld hello = new HelloWorld(); // 创建内部类对象 Inner i = hello.new Inner(); // 调用内部类对象的方法 i.show(); }
}
(1)成员内部类:
内部类中最常见的就是成员内部类,也称为普通内部类。我们来看如下代码:
从上面的代码中我们可以看到,成员内部类的使用方法:
1、 Inner 类定义在 Outer 类的内部,相当于 Outer 类的一个成员变量的位置,Inner 类可以使用任意访问控制符,如 public 、 protected 、 private 等
2、 Inner 类中定义的 test() 方法可以直接访问 Outer 类中的数据,而不受访问控制符的影响,如直接访问 Outer 类中的私有属性a
3、 定义了成员内部类后,必须使用外部类对象来创建内部类对象,而不能直接去 new 一个内部类对象,即:内部类 对象名 = 外部类对象.new 内部类( );
4、 编译上面的程序后,会发现产生了两个 .class 文件
其中,第二个是外部类的 .class 文件,第一个是内部类的 .class 文件,即成员内部类的 .class 文件总是这样:外部类名$内部类名.class
另外,友情提示哦:
1、 外部类是不能直接使用内部类的成员和方法滴
可先创建内部类的对象,然后通过内部类的对象来访问其成员变量和方法。
2、 如果外部类和内部类具有相同的成员变量或方法,内部类默认访问自己的成员变量或方法,如果要访问外部类的成员变量,可以使用 this 关键字。如:
//外部类HelloWorld
public class HelloWorld{
//外部类的私有属性name
private String name = "imooc";
//外部类的成员属性
int age = 20;
//成员内部类Inner
public class Inner {
String name = "爱慕课";
//内部类中的方法
public void show() {
System.out.println("外部类中的name:" + HelloWorld.this.name );
System.out.println("内部类中的name:" + name );
System.out.println("外部类中的age:" + age);
}
}
//测试成员内部类
public static void main(String[] args) {
//创建外部类的对象
HelloWorld o = new HelloWorld ();
//创建内部类的对象
Inner inn = o.new Inner(); ;
//调用内部类对象的show方法
inn.show();
}
}
(2)静态内部类
特点是:
1、 静态内部类不能直接访问外部类的非静态成员,但可以通过 new 外部类().成员 的方式访问
2、 如果外部类的静态成员与内部类的成员名称相同,可通过“类名.静态成员”访问外部类的静态成员;如果外部类的静态成员与内部类的成员名称不相同,则可通过“成员名”直接调用外部类的静态成员
3、 创建静态内部类的对象时,不需要外部类的对象,可以直接创建 内部类 对象名= new 内部类();
//外部类
public class HelloWorld {
// 外部类中的静态变量score
private static int score = 84;
// 创建静态内部类
public static class SInner {
// 内部类中的变量score
int score = 91;
public void show() {
System.out.println("访问外部类中的score:" + HelloWorld.score );
System.out.println("访问内部类中的score:" + score);
}
}
// 测试静态内部类
public static void main(String[] args) {
// 直接创建内部类的对象
SInner si=new SInner();
// 调用show方法
si.show();
}
}
(3)方法内部类
方法内部类就是内部类定义在外部类的方法中,方法内部类只在该方法的内部可见,即只在该方法内可以使用。
一定要注意哦:由于方法内部类不能在外部类的方法以外的地方使用,因此方法内部类不能使用访问控制符和 static 修饰符。
//外部类
public class HelloWorld {
private String name = "爱慕课";
// 外部类中的show方法
public void show() {
// 定义方法内部类
class MInner {
int score = 83;
public int getScore() {
return score + 10;
}
}
// 创建方法内部类的对象
MInner mi= new MInner();
// 调用内部类的方法
int newScore=mi.getScore();
System.out.println("姓名:" + name + "\n加分后的成绩:" + newScore);
}
// 测试方法内部类
public static void main(String[] args) {
// 创建外部类的对象
HelloWorld mo=new HelloWorld();
// 调用外部类的方法
mo.show();
}
}
三、继承
3.1java中的继承
‘
’
父类写好
创建子类,并建立关系
创建测试类
3.2java中的方法重写
测试调用
3.3继承初始化顺序
先执行父类的构造方法,再执行子类的构造方法
10被20覆盖了,属性的初始化是先执行的,然后执行构造方法
3.4final关键字
(1)final修饰类
子类会报错
(2)final修饰方法
子类方法不允许覆盖或重写
(3)final修饰属性
子类属性报错
final关键字修饰属性,系统不会自动初始化
(4)final修饰变量
不允许修改变量
3.5super的使用
main里调用属性
main调用父类方法
main调用子类方法
父类无参的构造方法
子类的无参构造方法,隐式的显示
会自动执行父类构造方法
此时不是第一行,构造方法就不可以了
注意报错
子类没有显示调用父类的构造方法
父类定义一个有参的构造方法
报错
3.6java中的object类
包名+地址
eclipse自带根据对象属性生成自带toString方法
执行main后生成
即使是两个对象的属性值一样,也是不同的地址
类似于==判断
eclipse提供了生成equals的方法
删除hash方法
分析
四、多态
4.1java中的多态
创建工程,默认选项
创建父类
创建子类
创建测试类
引用的多种形态
不能子类引用指向父类
父类写方法
子类重写方法
obj1()调用的是父类方法
obj2()调用的是子类方法
创建cat类,继承animal类
cat里不重写创建方法
子类继承父类的方法
子类独有地方法
main中不能通过继承调用子类独有的方法
练习
4.2多态中引用类型的转换
子类转换成父类
父类到子类,不允许
强制转换
强制转换存在风险,虽然编译器不保存,但是运行会报错
如何避免强制转换风险的问题呢?
使用:instanceof关键字
4.3java中的抽象类
定义父类为抽象类
定义子类,早年电话,继承父类
创建子类,智能电话
创建测试类
4.5java中的接口
extends关键字和implements关键字是不能调换的
通常在给接口命名的时候前面会加上一个大写的‘i’字母,用来区分和普通的类名不同
声明接口的时候,省略掉了abstract关键字
声明接口里的方法时,也省略了abstract关键字
通常abstract关键字是不写的
书写接口
接口的创建
创建psp类,继承玩游戏
用接口来描述
接口的使用
内部类使用后,注意分号结束,通过接口调用
通过new和.直接调用
说明:在安卓开发和高级框架开发中,经常会使用匿名内部类的方式来使用接口
4.6UML简介
、
按住鼠标左键进行连线
选择继承关系
接口定义好
实现关系是虚线,继承关系是实线
修改父类返回值
子类自动修改
根据图像生成java语言
和以前做对比
改写统一名称方法,重新生成java
五、阶段练习
建立父类
创建子类
继承关系
多态关系
新建抽象类
子类继承抽象类
效果一样,但是更合理
六、综合练习
分析同学案例:
右边更合理,不同类型的车用不同类
使用继承关系
使用多态