JAVA入门第二季学习补充

1、对象的属性:对象具有的各种特征,每个对象的每个属性都有特定值。

2、类时抽象的,对象是具体的。

3、所有的JAVA程序都以类为组织单元。

4、实例化:new 类名();

​ 把类实例化,变成对象来操作。称属性为实例变量。

5、JAVA中的成员变量和局部变量:

​ 成员变量:在类中定义,用来描述对象将要有什么。可以被本类的方法和其它类的方法使用。其作用域在整个类内部都是可见的。Java中会给初始值。

​ 局部变量:在类的方法中定义,在方法中临时保存数据。只能在当前的方法使用。其课作用域仅限于定义它的方法。Java不会给局部变量赋予初始值。

注意:在同一个方法中,不允许有同名局部变量,在不同的方法中允许有同名局部变量。

两类变量同名时,局部变量具有更高的优先级。

6、new+构造方法 创建一个新的对象;构造方法是定义在Java类中的一个用来初始化对象的方法,名称与类名相同且没有返回值。

有参的构造器可以给成员变量赋初值;

当没有指定构造方法时,系统会自动添加无参构造器;

当有指定的构造方法时,无论有参无参都不会自动添加无参的构造方法;

构造方法也可以重载;

构造方法可以给对象的属性赋一个合理的值;

7、基于一个类可以创建多个该类的对象,每个对象都拥有自己的成员,互相独立。Java 中被 static 修饰的成员称为静态成员或类成员。它属于整个类所有,而不是某个对象所有,即被类的所有对象所共享。静态成员可以使用类名直接访问,也可以使用对象名进行访问。使用 static 可以修饰变量、方法和代码块。

8、 静态方法中可以直接调用同类中的静态成员,但不能直接调用非静态成员

img

如果希望在静态方法中调用非静态变量,可以通过创建类的对象,然后通过对象来访问非静态变量。如:

img

在普通成员方法中,则可以直接访问同类的非静态变量和静态变量

img

静态方法中不能直接调用非静态方法,需要通过对象来访问非静态方法

img

练习:

在编辑器中分别定义了两个静态变量 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 中可以通过初始化块进行数据赋值。如:

http://img.mukewang.com/5392da9600010e5503680168.jpg

在类的声明中,可以包含多个初始化块,当创建类的实例时,就会依次执行这些代码块。如果使用 static 修饰初始化块,就称为静态初始化块。

需要特别注意:静态初始化块只在类加载时执行,且只会执行一次,同时静态初始化块只能给静态变量赋值,不能初始化普通的成员变量

10、封装:将类的某些信息隐藏在类的内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。

封装的实现步骤:

修改属性的可见性:private

创建get/set方法:用于属性的读写(用其他普通的方法也可以给属性赋值,只是不标准而已)

在get/set方法中加入属性控制语句:对属性值的合法性进行判断。

11、使用包管理Java的类

管理Java文件;解决同名文件冲突。。

使用package关键字定义一个包,比喻放在Java源程序的第一行;包名使用“.”间隔。

导包使用import关键字。

包的命名规范是是用小写。

12、Java中的访问修饰符:可以修饰属性和方法的访问范围。第二行是默认

13、this关键字(常用于封装对象属性时)

this代表当前对象。this.属性 操作当前对象的属性;this.方法 操作当前对象的方法。

14、内部类:

内部类的主要作用如下:

  1. 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类

  2. 内部类的方法可以直接访问外部类的所有数据,包括私有的数据

  3. 内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便

问:内部类有几种呢?

答:内部类可分为以下几种:

  • 成员内部类:

    定义了成员内部类后,必须使用外部类对象来创建内部类对象,而不能直接去 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)