多种多样的语言:
面向过程(处理规模小的问题):C
面向对象(处理规模大的问题):JAVA,C++…(一共三步:找对象,创建对 象,适用对象)
面试题: 说出oop语言的三大特征oop(Object-Oriented-…面向对象编程)
答:继承、封装、多态
类? 对象?
类就是一类对象的统称。对象就是这一类具体化的一个实例。
一个类可以实例化多个对象(用new)
一个类生成一个class(字节码文件)
类相当于模板,相当于高配的结构体
对象相当于实体
class 类名{ 属性:定义在类的内部方法的外部
类体 行为:方法
}
// 创建类
class <class_name>{
field;//成员属性
method;//成员方法
}
// 实例化对象
<class_name> <对象名> = new <class_name>();
类的成员
类的成员可以包含以下:字段、方法、代码块、内部类和接口等
字段
class Person {
public String name; // 字段(这里是没有初始化的,也可以就地初始化)
public int age;
}
使用 . 访问对象的字段.
“访问” 既包含读, 也包含写
方法 (method)
class Person {
public int age = 20;
public String name = "小花";
public void show() { //show方法
System.out.println("我叫" + name + ", 今年" + age + "岁");
}
}
如果在任何方法上应用 static 关键字,此方法称为静态方法
字段 vs 属性
我们通常将类的数据成员称为 “字段(field)” , 如果该字段同时提供了 getter / setter 方法, 那么我们也可以将它称为 "属性(property )
多种多样的代码块:
本地代码块:方法内部,不常用
实例代码块:{
}与方法同级,作用:初始化实例数据成员,优先于构造方法执行
静态代码块:static{
} 作用:初始化静态数据成员。优先于实例代码块,静态代码块只执行一次。
执行顺序:
1.静态代码块—>实例代码块—>构造方法(与代码编写前后顺序无关)
2.如果都是静态(如静态代码块,静态数据成员),则按顺序执行(实例规则相同)
属性(成员变量)
- 实例数据成员
;Person per = new Person( )
per.数据成员
per.方法 (此处的数据成员和方法都是实例的)
实例化一个对象之后,如何访问对象的数据成员?
答:通过点号;如Person per = new person()…
- 静态数据成员
访问静态数据成员、成员方法要通过(类名.静态数据成员/静态成员方法) 静态的数据成员和方法 不依赖于对象
方法(成员方法)
- 实例成员方法
- 静态成员方法
如果类中的数据成员没有初始化,默认值为对应0值;
如果是引用类型:null.;
如果是简单类型:0(char:\u000,boolen:false)
*static修饰放在方法区,静态的只有一份,不依赖于对象(静态方法内部不允许访问实例数据成员和实例成员方法)
不能直接访问,可以间接传参访问(引用)
常量放在堆里 ;
字符串常量放在常量池;
局部变量存放在栈上 ;
new创建的对象在堆上;
静态变量存放在方法区
类的成员可以包含:
- 字段,方法,代码块(静态代码块、实例代码块、本地代码块、同步代码块);
- 内部类(静态内部类、实例、本地、匿名)和接口等
访问修饰限定符
private实现封装
private/ public 这两个关键字表示 “访问权限控制” .(访问修饰限定符)
被 public 修饰的成员变量或者成员方法, 可以直接被类的调用者使用.
被 private 修饰的成员变量或者成员方法, 不能被类的调用者使用
体现封装性:private被private所修饰的属性或方法均不能在方法外部
通常情况下我们会把字段设为 private 属性,
但是方法是否需要设为 public, 就需要视具体情形而定.
一般我们希望一个类只提供 “必要的” public 方法, 而不应该是把所有的方法都无脑设为 public
通常情况下我们会把字段设为 private 属性, 但是方法是否需要设为 public, 就需要视具体情形而定. 一般我们希
望一个类只提供 “必要的” public 方法, 而不应该是把所有的方法都无脑设为 public.
getter和setter方法
给数据成员初始化的方式:
1.提供一系列的get set方法
2.提供构造方法–》用来产生对象。(方法名与类名相同,没有返回值)
class Person {
private String name;
private int age;
public void setName(String name){
this.name = name;//this引用,表示调用该方法的对象
}
public String getName(){
return name;
}
public void show(){
System.out.println("name: "+name+" age: "+age+"岁");
}
}
public static void main(String[] args) {
Person person = new Person();
person.setName("张三");
String name = person.getName();
System.out.println(name);
person.show();
}
// 运行结果
张三
name: 张三 age: 0岁
getName 即为 getter 方法, 表示获取这个成员的值.
setName 即为 setter 方法, 表示设置这个成员的值
不是所有的字段都一定要提供 setter / getter 方法, 而是要根据实际情况决定提供哪种方法
构造方法
构造方法是一种特殊方法, 使用关键字new实例化新对象时会被自动调用, 用于完成初始化操作.
new 执行过程:
1.为对象分配内存空间
2.调用对象的构造方法
规则:
1.方法名称必须与类名称相同
2.构造方法没有返回值类型声明
3.每一个类中一定至少存在一个构造方法(没有明确定义,则系统自动生成一个无参构造)
***如果程序没有提供任何构造方法,编译器会默认生成不带参数的构造方法(这种默认会在什么构造方法都没有的情况下产生)
一个类可以有多个构造器,一个类的构造器名称必须与该类的名称一致,构造器没有返回值也不需要void.
构造方法可以发生重载(函数名相同,参数不同(类型,个数),返回值不做要求)
关于this
this.成员变量 this.成员方法 this()调用构造方法必须放在第一行,只能调用一个构造方法
this代表当前对象的引用,当调用完构造方法,对象才被真正实例化 构造器是java中创建新对象时执行的操作
面试题:生成一个对象需要几步?(即为上面说过的new 执行过程)
1.给对象分配内存,
2.调用合适的构造方法(构造方法不止一个)