1、两种编程思想
面向过程(pop)
是一种将事件按流程逐步完成的基本编程思想,强调过程,逻辑清晰,侧重与分析完成事件的过程
面向对象(oop)
当前主流的编程思想,创建解决问题的对象,并赋予对象对应的属性和方法,侧重如何创建解决问题的对象
2、对象和类
类Class,可以理解为模板,具有相同属性和方法的对象集合
```java
/**
* 定义一个car类
* 属性:变量
* 品牌
* 颜色
* 行为:方法
* 行驶
* 停止
* 娱乐
*/
public class Car {
//属性
String brand;
String color;
int seat;
//行为
void go(){
System.out.println("go");
}
void stop(){
System.out.println("stop");
}
void happy(){
System.out.println("happy");
}
}
```
对象,是类的一个实例,类的具体表现
创建对象
(无参构造)
类名 对象名 = new 构造方法();
(有参构造)
类名 对象名 = new 构造方法(值1,值2....);
创建的对象,通过”.“访问类中的非私有(没有被private修饰)的属性以及方法
创建对象时,用有参还是无参方法,取决于类的构造方法
3、构造方法
构造方法是一个特殊的方法,没有返回值,方法名和类名一致,
每一个类在定义时,都有一个默认的隐藏的无参数的构造方法,在创建对象时调用
构造方法通常用于初始化成员变量
public class Test{
String name;
int age;
String sex;
//这就是无参数的构造方法,默认就会存在,不过是隐藏的
public Test(){//方法体
}
//这就是有参数的构造方法
public Test(String name,int age,String sex){
this.name=name;
this.age=age;
this.sex=sex;
}
}
构造方法的注意点:
- 构造方法没有返回值,但也不是void,且构造方法名必须与类名相同
- 每一个类在创建成功之后都有一个默认的无参构造方法,只是被隐藏了
- 如果一个类中写了有参构造的方法,那么默认的无参构造就会消失,也就是说在main()方法中用无参的方法new一个对象将会报错,我们此时需要把无参的构造方法写出来,方可解决问题
- 构造方法不能通过"."操作符访问,只能通过new关键字创建对象自动调用,用于初始化成员变量
4、面向对象的三大特性
封装
将类中的属性使用
private
修饰,这样就能防止非当前类对其访问。
封装的步骤:
1.给类中的所有属性添加
private
访问修饰符
2.给每个属性添加
getXXX()
方法用于读取属性值
3.给每个属性添加
setXXX()
方法用于给属性赋值
继承
类
A extend
类
B
。类
A
就是类
B
的子类,类
A
的对象就能直接访问类
B
中非私有成员。
或接口
A extends
接口
B
。
重写:子类对父类非私有的方法进行拓展
- 重写的方法必须满足方法名,返回值,参数列表都相同
- 子类重写的方法的访问权限,必须比父类更放宽(也就是如果父类没有写访问权限,子类必须为public或者protected 或者不写,同样的如果父类是public那么子类必须为public)
修饰符的权限关系:
- 子类抛出的异常必须小于父类
重载
在一个类中,某个方法在不同的参数下,表现不同的行为。简单理解就是同名不同参。
注意不同参指的是参数的数量,参数类型,或者相同参数数量,相同参数类型但是放的位置不同也叫不同参
this和super
都可以当作对象或构造对象使用
1、当作对象:
- this表示当前类的对象;super表示当前类的父类对象
- 只能在非静态方法中,this和super才能当作对象使用
2、当作构造方法
-
this() 表示当前类的无参数构造方法,如果带参数就表示对应参数的构造方法。
-
super()表示当前类的父类的无参数构造方法,如果带参数就表示对应参数的构造方法。
-
this()或 super() 只能用在另一个构造方法的首行。
在继承关系中,如果父类和子类都没有写出来任何构造方法时,子类有一个隐藏的无参数构造方法,会自动调用父类中无参数的构造方法。
class Father{
}
class Son extends Father{
/*
这个构造方法是隐藏的
*/
public Son(){
//在构造方法的首行
super();
}
}
如果父类中有带参数的构造方法,没有无参数的构造方法时,子类必须要调用父类中的构造方法。
class Father{
String name;
public Father(String name){
this.name=name;
}
}
class Son extends Father{
public Son(){
super("xxx");
}
}
Object
类是所有类的父类。任何类都间接地继承了该类,但没有明确地使用extends
体现出来。所有类都可以访问Object类中的方法,或对其进行重写。toString()
就是
Object
类中的一个方法,在输出对象时自动调用。
多态
在继承关系中,子类的对象可以保存到父类的变量中。
多态通常应用于定义方法时,形参为一个父类或接口类型变量,实参可以是子类对象。
父类/父接口 对象 = new 子类();
public class Father{
public void smoke(){
System.out.println("father smoking");
}
}
public class Son extends Father{
public void play(){
System.out.println("son playing");
}
@Override
public void smoke(){
System.out.println("son smoking");
}
}
public class Main(){
public static void main(String[] args){
Father f = new Father();
f.smoke();//父类中的方法
Son son = new Son();
son.play();
son.smoke();//调用的是重写后的方法
//多态
Father father = new Son();
//father.play();无法调用
father.smoke();//调用的是重写后的方法
}
}
5、关键字
interface(接口)
用于定义接口的关键字。代替
class
。
如果某个抽象类中全都是抽象方法时,可以将这个类改为接口。
- 接口是一个完全抽象类,其中的方法都是public abstract修饰的抽象方法,没有方法体,其中的属
- 性都是public final static修饰的静态常量。
- 接口中没有构造方法,不能创建对象。
- 接口通过implements实现,实现它的类称为该接口的实现类。
- 一个类可以同时实现多个接口。
- 一个类实现了接口后,必须重写其中的抽象方法。
- JDK1.8后,可以在接口中定义default方法和static方法,该方法不用重写。
static(静态)
可以修饰方法、属性或代码块。被修饰的内容称为静态成员。
当某个属性或方法被高度重用时,可以将其定义为静态的,之后通过类名调用。
- 静态方法中无法使用非静态成员
- 普通方法中可以使用静态成员
abstract(抽象)
可以修饰方法(没有方法),也可以修饰类,有抽象方法的类一定是抽象类
,但抽象类中不一定必须有抽象方法
- 抽象类中有构造方法,但该构造方法只会在new抽象类的子类对象时会自动调用,抽象类不能创建自身对象。
- 抽象类通常需要被继承,一旦有子类继承了抽象类,就必须要重写抽象类中的所有抽象方法。