JAVA入门第二季学习补充
1、对象的属性:对象具有的各种特征,每个对象的每个属性都有特定值。
2、类时抽象的,对象是具体的。
3、所有的JAVA程序都以类为组织单元。
4、实例化:new 类名();
把类实例化,变成对象来操作。称属性为实例变量。
5、JAVA中的成员变量和局部变量:
成员变量:在类中定义,用来描述对象将要有什么。可以被本类的方法和其它类的方法使用。其作用域在整个类内部都是可见的。Java中会给初始值。
局部变量:在类的方法中定义,在方法中临时保存数据。只能在当前的方法使用。其课作用域仅限于定义它的方法。Java不会给局部变量赋予初始值。
注意:在同一个方法中,不允许有同名局部变量,在不同的方法中允许有同名局部变量。
两类变量同名时,局部变量具有更高的优先级。
6、new+构造方法 创建一个新的对象;构造方法是定义在Java类中的一个用来初始化对象的方法,名称与类名相同且没有返回值。
有参的构造器可以给成员变量赋初值;
当没有指定构造方法时,系统会自动添加无参构造器;
当有指定的构造方法时,无论有参无参都不会自动添加无参的构造方法;
构造方法也可以重载;
构造方法可以给对象的属性赋一个合理的值;
7、基于一个类可以创建多个该类的对象,每个对象都拥有自己的成员,互相独立。Java 中被 static 修饰的成员称为静态成员或类成员。它属于整个类所有,而不是某个对象所有,即被类的所有对象所共享。静态成员可以使用类名直接访问,也可以使用对象名进行访问。使用 static 可以修饰变量、方法和代码块。
8、 静态方法中可以直接调用同类中的静态成员,但不能直接调用非静态成员
如果希望在静态方法中调用非静态变量,可以通过创建类的对象,然后通过对象来访问非静态变量。如:
在普通成员方法中,则可以直接访问同类的非静态变量和静态变量,
静态方法中不能直接调用非静态方法,需要通过对象来访问非静态方法
练习:
在编辑器中分别定义了两个静态变量 score1 和 score2 ,用于保存成绩信息。定义了一个静态方法 sum ,用于计算成绩总分,在 main 方法中通过调用静态方法输出成绩总分
public class HelloWorld {
// 定义静态变量score1
static int score1 = 86;
// 定义静态变量score2
static int score2 = 92;
// 定义静态方法sum,计算成绩总分,并返回总分
public static int sum() {
int n=0;
n=score1+score2;
return n;
}
public static void main(String[] args) {
// 调用静态方法sum并接收返回值
int allScore = HelloWorld.sum();
System.out.println("总分:" + allScore);
}
}
9、Java 中可以通过初始化块进行数据赋值。如:
在类的声明中,可以包含多个初始化块,当创建类的实例时,就会依次执行这些代码块。如果使用 static 修饰初始化块,就称为静态初始化块。
需要特别注意:静态初始化块只在类加载时执行,且只会执行一次,同时静态初始化块只能给静态变量赋值,不能初始化普通的成员变量。
10、封装:将类的某些信息隐藏在类的内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。
封装的实现步骤:
修改属性的可见性:private
创建get/set方法:用于属性的读写(用其他普通的方法也可以给属性赋值,只是不标准而已)
在get/set方法中加入属性控制语句:对属性值的合法性进行判断。
11、使用包管理Java的类
管理Java文件;解决同名文件冲突。。
使用package关键字定义一个包,比喻放在Java源程序的第一行;包名使用“.”间隔。
导包使用import关键字。
包的命名规范是是用小写。
12、Java中的访问修饰符:可以修饰属性和方法的访问范围。第二行是默认
13、this关键字(常用于封装对象属性时)
this代表当前对象。this.属性 操作当前对象的属性;this.方法 操作当前对象的方法。
14、内部类:
内部类的主要作用如下:
-
内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类
-
内部类的方法可以直接访问外部类的所有数据,包括私有的数据
-
内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便
问:内部类有几种呢?
答:内部类可分为以下几种:
-
成员内部类:
定义了成员内部类后,必须使用外部类对象来创建内部类对象,而不能直接去 new 一个内部类对象,即:内部类 对象名 = 外部类对象.new 内部类( );
第二个是外部类的 .class 文件,第一个是内部类的 .class 文件,即成员内部类的 .class 文件总是这样:外部类名$内部类名.class
1、 外部类是不能直接使用内部类的成员和方法滴
2、 如果外部类和内部类具有相同的成员变量或方法,内部类默认访问自己的成员变量或方法,如果要访问外部类的成员变量,可以使用 this 关键字。
-
静态内部类
1、 静态内部类不能直接访问外部类的非静态成员,但可以通过 new 外部类().成员 的方式访问
2、 如果外部类的静态成员与内部类的成员名称相同,可通过“类名.静态成员”访问外部类的静态成员;如果外部类的静态成员与内部类的成员名称不相同,则可通过“成员名”直接调用外部类的静态成员
3、 创建静态内部类的对象时,不需要外部类的对象,可以直接创建 内部类 对象名= new 内部类();
-
方法内部类
方法内部类就是内部类定义在外部类的方法中,方法内部类只在该方法的内部可见,即只在该方法内可以使用。
由于方法内部类不能在外部类的方法以外的地方使用,因此方法内部类不能使用访问控制符和 static 修饰符。
-
匿名内部类
练习:
下列关于内部类说法中不正确的是( )
A内部类不能有自己的成员方法和成员变量
B内部类可用 static 修饰符定义为静态内部类
C内部类可作为其他类的成员,而且可访问它所在类的成员
D内部类可以被实例化
正确答案是A
15、继承:
实现代码复用,除了private修饰的父类变量和方法都可以继承到。
16、重写:子类可以重写父类方法,调用时也会有先调用子类的方法。
重写:返回值类型、方法名、参数类型和个数都必须相同。
17、Java中的继承初始化顺序: 先初始化父类在初始化子类;先执行初始化对象中属性,再执行构造方法中的初始化。
18、final 不可修改不可变化:
final修饰类,该类不能被继承;
final修饰方法,该方法不能被子类重写;
final修饰属性,该属性不能隐式初始化,必须有值,或者在构造方法中赋值;
final修饰变量,变量的值只能赋一次值,即变成常量。
19、super关键字:代表父类对象,可以调用父类属性和方法。
20、Object类
1、toString()方法:在object类中定义tostring()方法返回对象的哈希code码(对象地址字符串)
如果直接输出一个对象,会输出该对象的内存地址
javademo.GOT7@85ede7b
可以通过重写toString()来表示对象属性。2、equals()方法:返回值为布尔型。比较的是对象的引用是否指向同一块内存地址。new一个对象的时候其实new了它的地址。是一种引用。
Dog dog=new Dog();
一般情况下比较两个对象的值是否相同。所以要进行重写equals。
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof GOT7)) return false;//判断o对象是否是GOT7的实例
GOT7 got7 = (GOT7) o;
return age == got7.age;
}
21、多态:对象的多种形态【必须有继承关系】
引用多态:父类的引用可以指向本类的对象,也可以指向子类的对象。 (子类引用不能指向父类)
GOT7 got7=new GOT7();
GOT7 got71=new Rapper();
方法多态:创建本类对象,调用方法为本类方法;创建子类对象,调用方法为子类重写的或者继承的方法。
public class Oop01 {
public static void main(String[] args) {
GOT7 got7=new GOT7();
GOT7 got71=new Rapper();
got7.sing();
got71.sing();//子类已经重写了sing()方法
}
}
//输出结果:
GOT7 is singing
GOT7's rapper is singing
注意: `GOT7 got71=new Rapper();`当Rapper中有GOT7父类中没有的方法时,got71是无法调用该方法的。
22、多态中的引用类型的转换:
向上类型转换(隐式/自动类型转换)小类型到大类型转换。无风险。
向下类型转换(强制类型转换)大类型到小类型。有风险:可以使用instanceof运算符来解决引用对象类型转换带来的安全性问题。
public static void main(String[] args) {
Rapper rapper=new Rapper();
GOT7 got7=rapper;//自动类型转换
Rapper rapper1=(Rapper) got7;//强制转换
}
if(got7 instanceof Vocal){//判断某个引用是否是某个类型的子类型
Vocal vocal=(Vocal) got7;
}else {
System.out.println("can not");
}
23、抽象类(abstract):某个父类只是知道子类应该包含什么样的方法,但是不知道具体方法的实现。
抽象类和抽象方法都需要添加关键字 abstract,且顺序为 abstract class
24、接口(interface)全局常量(public static fina)和公共抽象(public abstract)方法组成
不能使用private 和protected来修饰接口
继承父类实现接口的语法:
class 类名 extends 父类 implements 接口1,接口2…
**如果要继承父类,继承符类必须在实现接口之前。**
接口必须要有实现类;接口中方法不能有方法体{},同时方法的访问修饰符不能是 private 和 protected
25、UML(统一建模语言)
三种常用的UML图:
1用例图:表达系统如何满足业务规则和特定的用户需求信息(角色和功能)
![](https://img2020.cnblogs.com/blog/1057470/202011/1057470-20201106112143991-2025752700.png)
2序列图:按照交互发生的一些列顺序。(角色和内存对象的关系)
![](https://img2020.cnblogs.com/blog/1057470/202011/1057470-20201106112207871-1427193185.png)
3类图:业务逻辑(类和类的关系以及方法)
![](https://img2020.cnblogs.com/blog/1057470/202011/1057470-20201106112231588-1170496186.png)
常用的建模工具:Visio、 RationalRose、PowerDesigner
26、综合练习:
![](https://img2020.cnblogs.com/blog/1057470/202011/1057470-20201106112432153-660932055.png)