课程地址:https://www.imooc.com/learn/124 powerDesign-uml下载地址:http://www.uml.org.cn/UMLTools/powerDesigner/powerDesignerToolIntroduction.htm
定义类的首字母要大写
经常把属性称为实例变量
默认值是0
成员变量
调用成员变量
局部变量只能在内部使用
我们可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立。然而在某些时候,我们更希望该类所有的对象共享同一个成员。此时就是 static 大显身手的时候了!!
Java 中被 static 修饰的成员称为静态成员或类成员。它属于整个类所有,而不是某个对象所有,即被类的所有对象所共享。静态成员可以使用类名直接访问,也可以使用对象名进行访问。当然,鉴于他作用的特殊性更推荐用类名访问~~
使用 static 可以修饰变量、方法和代码块。
本小节,我们先认识一下静态变量。
例如,我们在类中定义了一个 静态变量 hobby ,操作代码如下所示:
运行结果:
要注意哦:静态成员属于整个类,当系统第一次使用该类时,就会为其分配内存空间直到该类被卸载才会进行资源回收!~~
与静态变量一样,我们也可以使用 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);
}
}
Java 中可以通过初始化块进行数据赋值。如:
在类的声明中,可以包含多个初始化块,当创建类的实例时,就会依次执行这些代码块。如果使用 static 修饰初始化块,就称为静态初始化块。
需要特别注意:静态初始化块只在类加载时执行,且只会执行一次,同时静态初始化块只能给静态变量赋值,不能初始化普通的成员变量。
我们来看一段代码:
运行结果:
通过输出结果,我们可以看到,程序运行时静态初始化块最先被执行,然后执行普通初始化块,最后才执行构造方法。由于静态初始化块只在类加载时执行一次,所以当再次创建对象 hello2 时并未执行静态初始化块。
设为私有属性
发现不能调用
get和set方法
使用
类里面自动创建get,set方法
调用方法
定义:
内部类( 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();
}
}
‘
’
父类写好
创建子类,并建立关系
创建测试类
测试调用
先执行父类的构造方法,再执行子类的构造方法
10被20覆盖了,属性的初始化是先执行的,然后执行构造方法
(1)final修饰类
子类会报错
(2)final修饰方法
子类方法不允许覆盖或重写
(3)final修饰属性
子类属性报错
final关键字修饰属性,系统不会自动初始化
(4)final修饰变量
不允许修改变量
main里调用属性
main调用父类方法
main调用子类方法
父类无参的构造方法
子类的无参构造方法,隐式的显示
会自动执行父类构造方法
此时不是第一行,构造方法就不可以了
注意报错
子类没有显示调用父类的构造方法
父类定义一个有参的构造方法
报错
包名+地址
eclipse自带根据对象属性生成自带toString方法
执行main后生成
即使是两个对象的属性值一样,也是不同的地址
类似于==判断
eclipse提供了生成equals的方法
删除hash方法
分析
创建工程,默认选项
创建父类
创建子类
创建测试类
引用的多种形态
不能子类引用指向父类
父类写方法
子类重写方法
obj1()调用的是父类方法
obj2()调用的是子类方法
创建cat类,继承animal类
cat里不重写创建方法
子类继承父类的方法
子类独有地方法
main中不能通过继承调用子类独有的方法
练习
子类转换成父类
父类到子类,不允许
强制转换
强制转换存在风险,虽然编译器不保存,但是运行会报错
使用:instanceof关键字
定义父类为抽象类
定义子类,早年电话,继承父类
创建子类,智能电话
创建测试类
extends关键字和implements关键字是不能调换的
通常在给接口命名的时候前面会加上一个大写的‘i’字母,用来区分和普通的类名不同
声明接口的时候,省略掉了abstract关键字
声明接口里的方法时,也省略了abstract关键字
通常abstract关键字是不写的
书写接口
接口的创建
创建psp类,继承玩游戏
用接口来描述
接口的使用
内部类使用后,注意分号结束,通过接口调用
通过new和.直接调用
说明:在安卓开发和高级框架开发中,经常会使用匿名内部类的方式来使用接口
、
按住鼠标左键进行连线
选择继承关系
接口定义好
实现关系是虚线,继承关系是实线
修改父类返回值
子类自动修改
根据图像生成java语言
和以前做对比
改写统一名称方法,重新生成java
建立父类
创建子类
继承关系
多态关系
新建抽象类
子类继承抽象类
效果一样,但是更合理
分析同学案例:
右边更合理,不同类型的车用不同类
使用继承关系
使用多态