构造器
-
类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的,并且构造器有以下两个特点:
- 必须和类的名字相同
- 必须没有返回值,也不能写void
-
作用
-
初始化对象的值
-
在使用new关键字的时候,本质是在调用构造器
-
-
无参构造
- new对象没有参数时使用无参构造
- 在定义了有参构造后还想使用无参构造的话,就必须将无参构造写出来,即显式定义
- 基本结构
public 类名 (){ }
- 测试举例
//一个项目应该只存在一个main方法
public class Application {
public static void main(String[] args) {
//new 实例化了一个对象
Person person = new Person();
System.out.println(person.name);
}
}
public class Person {
//一个类即使什么都不写,它也会存在一个方法
//显示的定义构造器
String name;
//无参构造
public Person(){//与类名相同,没有返回值
this.name="gengsheng";//在未写此行时,右边会输出null
}
}
输出结果为
- 有参构造
- new对象有参数时使用
- 在定义了有参构造后还想使用无参构造的话,就必须将无参构造写出来,即显式定义
- 结构
变量类型 对象本身的变量名;
public 类名 (参数类型 传递下来的参数名称){
this.对象本身的变量名=传递下来的参数名称;
}
//一个项目应该只存在一个main方法
public class Application {
public static void main(String[] args) {
//new 实例化了一个对象
Person person = new Person("gengsheng");
System.out.println(person.name);
}
}
public class Person {
//一个类即使什么都不写,它也会存在一个方法
//显式的定义构造器
String name;
//无参构造
public Person(){//与类名相同,没有返回值
this.name="gengsheng";//在未写此行时,右边会输出null
}
//有参构造:一旦定义了有参构造,无参就必须显式定义
public Person(String nameA){
this.name=nameA;
}
}
输出结果为
方法重载。此时若传进来参数,则走有参构造,若没有传进来参数,则走无参构造
- Alt+Insert 生成构造器的快捷键
- 点击Constructor
- 生成无参构造器:点击Select None
- 生成有参构造器:选中对象,点击ok
- 点击Constructor
面向对象三大特征
封装
-
该露的露,该藏的藏
- 程序设计要追求“高内聚,低耦合”
- 高内聚:类的内部数据操作细节自己完成,不允许外部干涉
- 低耦合:仅暴露少量的方法给外部使用
- 程序设计要追求“高内聚,低耦合”
-
数据的隐藏
- 信息隐藏:通常应禁止直接访问一个对象中数据的实际表示,而应作为接口来访问
-
属性私有,get,set
-
属性私有:private,让别人不能直接引用
-
get:获得这个数据
public 数据类型 get+对象(){ return this.对象; }
- set:给这个数据设置值
public void set+对象(数据类型 变量名){ this.对象=变量名; }
-
-
实例
//类 private:私有,与public对应
public class Student {
//属性私有
private String name;//名字
private int id;//学号
private char sex;//性别
private int age;//年龄
//提供一些可以操作这个属性的方法(因为私有的属性意味着如果外面想new一个对象也无法去使用这些属性,因此要提供一些方法)
//提供一些public的get,set方法
//get:获得这个数据
public String getName(){
return this.name;
}
//set:给这个数据设置值
public void setName(String name1){
this.name=name1;
}
//Alt+Insert
public int getId() {
return id;
}
public char getSex() {
return sex;
}
public void setId(int id) {
this.id = id;
}
public void setSex(char sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age<0||age>120){
this.age=3;
}else {
this.age = age;
}
}
}
public static void main(String[] args) {
Student s1 = new Student();
s1.setName("更生");
System.out.println(s1.getName());
s1.setAge(999);//不合法的,通过封装即可保证系统安全性
System.out.println(s1.getAge());
System.out.println("====================================");
Student s2 = new Student();
s2.setName("曹和宇");
System.out.println(s2.getName());
s2.setAge(35);
System.out.println(s2.getAge());
}
/*封装的意义:
1.提高程序的安全性,保护数据
2.隐藏代码的实现细节
3.统一接口
4.增加系统的可维护性
*/
输出结果为
- 快捷键Alt+Insert
- 封装的意义
- 提高程序的安全性,保护数据
- 隐藏代码的实现细节
- 统一接口
- 增加系统的可维护性
继承
-
本质是对某一批类的抽象,从而实现对现实世界更好的建模
-
extends:“扩展”。子类是父类的扩展
-
Java中只有单继承,没有多继承。(一个儿子只能有一个父亲,而一个父亲可以有多个儿子)
-
继承是类和类之间的一种关系
- 类和类之间的关系还有依赖,组合,聚合等
- 继承关系的两个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends来表示
- 子类和父类之间,从意义上来讲具有“is a”的关系
-
在Java中,所有的类都默认直接或间接继承object类
-
实例
//person 人:父类
public class Person {
private int money=10_0000_0000;//修饰符是public才能继承,是private则不能继承,一般属性是私有的
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
public void say(){
System.out.println("说了一句话");
}
}
//学生 is 人:派生类/子类
public class Student extends Person{
//Ctrl+H
public static void main(String[] args) {
Student student = new Student();
student.say();
student.setMoney(23585);
System.out.println(student.getMoney());
}
}
Ctrl+H可以查看继承关系
输出结果为