面向对象编程:方法调用、值和引用传递、构造器、封装、继承、多态跟强制转换
回顾方法的调用
如果方法没有static,则需要实例化一个对象 (也就是new一个对象):
public class Demo03 {
public static void main(String[] args) {
Demo03 demo03 = new Demo03();
int f = demo03.add(2,3);
System.out.println(f);
}
public int add(int a,int b){
return a+b;
}
如果有static,直接用类.方法就可以了:
int g=Demo03.add(2,3);
System.out.println(g);
}
public static int add(int a,int b){
return a+b;
}
值传递跟引用传递
值传递并不会改变main函数里的数的值
public class Demo04 {
public static void main(String[] args) {
int a = 1;
System.out.println(a);
Demo04.change(a);
System.out.println(a);
}
public static void change(int a){
a=10;
}
}
输出为 1
1
引用传递是一个对象,可以改变属性
public class Demo05 {
public static void main(String[] args) {
Person person = new Person();
System.out.println(person.name);
Demo05.change(person);
System.out.println(person.name);
}
public static void change(Person person){
///person是一个对象,可以改变属性!
person.name="荣哥";
}
}
//定义了一个Person类,有一个属性:name
class Person{
String name; //默认null
}
输出为: null
荣哥
构造器
如果子类和父类都有无参构造器,当用子类创建对象时父类会先自动new一个无参构造器并且先输出父类的无参构造器,然后在输出子类的无参构造器。

构造器
-
和类名相同
-
没有返回值
作用:
-
new 本质是在调用构造方法
-
初始化对象的值
注意点:
-
定义有参构造之后,如果想使用无参构造,显示的定义一个无参的构造
alt + Insert 生成构造器快捷键
public class Person {
//一个类即使什么都不写,他也会存在一个方法
//显示的定义构造器
String name;
//实例化初始值
//1.使用new关键字,本质是调用构造器
//2.构造器用来初始化值
public Person(){} //与类型相同,并且没有返回值(无参构造)
//有参构造:一旦定义了有参构造,无参构造必须显示定义
// 即定义了有参构造后无参构造必须为空
public Person(String name){
this.name = name;
}
}
public class Application01 {
public static void main(String[] args) {
//实例化一个对象
Person person = new Person();//没赋值参数就会调用上面无参的构造方法输出结果为null,如果有赋值则调用有参构造方法。
System.out.println(person.name);
}
}
面向对象小结
-
类与对象:
类是一个模板:抽象,对象是一个具体的实例
-
方法:
定义、调用
-
对象的引用
引用类型:基本类型(8种)
对象是通过引用来操作的:栈--->堆
-
属性:字段Field 成员变量
默认初始化:
数字: 0 0.0
char: u0000
boolean: false
引用: null
修饰符: 属性类型 属性名 = 属性值
-
对象的创建和使用
-
必须使用new关键字来创建对象,构造器
person rong = new Person();
-
对象的属性 rong.name;
-
对象的方法 rong.sleep();
-
-
类:
静态的属性 属性
动态的行为 方法
封装
属性私有,get/set
意思是如果定义的属性是私有的(private),则需要通过get和set方法获取这个数据,代码如下:
public class Student {
private String name; //名字
//get获得这个数据
public String getName(){
return this.name;
}
//set给这个数据设置值
public void setName(String name){
this.name = name;
}
public class StuApplication {
public static void main(String[] args) {
Student student = new Student();
student.setName("荣哥");
System.out.println(student.getName());
}
}
//alt+insert快捷键可以给出set跟get方法
继承

私有的东西无法被继承(即如果父类是私有private的,子类不能继承)
如果子类和父类都有无参构造器,则默认先调用父类的无参构造器,然后在调用子类的,系统会默认在子类的无参构造器第一行加上super();,super()的作用是默认调用父类的无参构造器
//以下为父类的无参构造器,super()可以不用写,系统会自动加
public Student() {
super();
System.out.println("fulei");
}
如果在想调用自己类中的有参构造器,则this();需要放在无参构造器的第一行,也就是this()和super()只能出现一个。

重写

public static void main(String[] args) {
//对象能执行哪些方法,主要看对象左边的类型(即对象最左边类里有没这个方法),与右边关系不大
A a = new A();
a.test();
//父类的引用指向了子类
B b = new A();//虽然执行的是子类重写的方法,如果父类把这个方法去掉,即使子类还在但是执行不了
b.test();
}
public class A extends B {
// @Override 重写
public void test() {
System.out.println("A");
}
public class B {
public void test(){
System.out.println("B");
}
此时输出为 A
A
如果在两个void前面加上static,就变成静态方法了,
则输出为: A
B
解释如下:

多态
多态注意事项:
-
多态是方法的多态,属性没有多态
-
父类和子类,有联系,类型转换异常!ClassCastException!
-
存在条件:继承关系,方法需要重写,父类引用指向子类对象! Father f =new Son();
不能重写的方法:
-
static 方法,属于类,它不属于实例
-
final 常量
-
private 方法
-
强制转换

父类没有go方法,如果使用student.go()就会报错,因为student是Person创建出来的,所以只有将student对象强制转为Student类型(也就是将父类转为子类)就能调用go()方法了,转换形式如上
浙公网安备 33010602011771号