Java基础
面向对象和面向过程
- 面向过程(自己做)
举个例子:想吃面包
买面 、和面 、模型 、烤熟 、吃面包。 - 面向对象(让别人做)
相同的例子:想吃面包
让面包师做一系列过程(买面 、和面 、模型 、烤熟 ),吃面包。
面向对象以面向过程为基础。 - 类和对象
3.1 类
对具有共同属性和行为特征的一类事物的抽象。
3.2 对象
通过类创建的实例。
类是创建对象的模板。 - 类的定义
class 类名{
类成员的定义:成员变量,方法,块
}
public class Student {
public String name;
public String stuNo;
public void study() {
System.out.println("学习大数据基础");
}
}
- 类分为工具类和测试类(程序入口类)
- 构造方法(构造器)
6.1 什么是构造方法
方法名和类名相同,无返回类型。
可以有多个(构造方法重载)。
6.2 来源
2个途径,1个是系统默认(一定是public修饰),1个是自定义。
6.3 作用
和new一起完成创建对象。
6.4 使用
new 对象
不能像普通方法一样用“对象.方法”来调用。 - 对象的初始化过程
创建对象时,成员变量会被初始化。 - 构造块
在构造方法之前执行,初始化成员变量。
public class Demo {
public int x;
//构造块
{
x = 2;
System.out.println("构造块");
}
public Demo() {
System.out.println("构造方法");
}
}
附加内容:块
public void test() {
//执行完毕,立即回收,提高内存利用率
{
int x = 9;
System.out.println(x);
}
System.out.println("test");
}
- 变量的分类
成员变量和局部变量
成员变量:定义类体中
局部变量:方法内或者参数列表 - this关键字
this:表示当前类对象
访问类成员:this.成员
调用本类的构造方法:this(实参);
注意: this(实参);必须是构造函数的第一条有效语句。
public Demo(int x) {
this();
this.x = x;
}
- 面向对象的三大特征
封装、继承、多态
11.1 封装
封装了细节
public class Person {
//实现封装:private
//set/get方法
private int age;
public void setAge(int age) {
if(age >= 0 && age <= 150) {
this.age = age;
}else {
System.out.println("年龄错误!");
}
return;
}
public int getAge() {
return this.age;
}
}
11.2 继承
特点
什么是继承: 由已有类产生新类。
父类子类:已有类->父类 新类->子类
继承性:子类可以继承父类的所有成员(构造方法不能继承),私有成员不可以使用。
java单一继承。
Object是顶级类。
extends
super
表示父类的对象。
super.成员
super(参数):必须是子类构造方法的第一条有效语句。
访问修饰符
private:修饰:变量、方法-------访问范围:本类
默认:修饰:类、变量、方法-------访问范围:本包
protected:修饰:变量、方法-------访问范围:具有继承关系的所有类
public:修饰:类、变量、方法-------访问范围:任何地方
方法重写
环境:继承关系
父类和子类方法名相同,参数列表相同,方法的返回类型相同或者子类方法返回类型<=父类
public class Demo {
public void str() {
System.out.println("demo");
}
}
class Demo2 extends Demo{
public void str() {
System.out.println("demo2");
}
}
class D1{
Demo demo = new Demo();
public Demo d() {
return demo;
}
}
class D2 extends D1{
Demo2 demo = new Demo2();
public Demo2 d() {
return demo;
}
}
子类方法的访问修饰符>=父类
子类方法的异常(非运行时异常)<=父类
如果父类方法的访问修饰符为private,子类中有与它同名同参同返回类型的方法也不能叫方法重写
为什么进行重写:为了扩展父类方法的功能
继承关系中构造方法的调用规则
子类的构造方法中不写super(实参),会有默认的super()。
11.3 多态
定义:一种类型的变量可以指向不同的对象
Animal a1 = new Bird();
Animal a2 = new Dog();
编译时的多态:方法重载
运行时的多态:方法重写
在编译时,看变量的声明类型;
在运行时,如果子类重写了父类的方法,动态绑定到子类上,运行子类的方法。
对于上面的代码来说,a1和a2调用的方法在Animal中必须存在才可以,否则编译错误。
对于上面的代码来说,如果Animal和Bird中有同名的变量a,则a1调用的变量a是Animal中的。
12. 对象造型(对象的强制转换)
instanceof
public void test(Animal animal) {
if(animal instanceof Dog) {
((Dog) animal).d();
}else if(animal instanceof Bird) {
((Bird) animal).b();
}
}
- 注意
同一类型的兄弟对象不能强转
public void test2() {
Dog dog = new Dog();
Bird bird = new Bird();
//bird = (Bird)dog;//编译错误
Animal dog2 = new Dog();
bird = (Bird)dog2;//会导致运行时异常
}