面向对象的(构造方法的概念和使用)
A:构造方法概述和作用
* 给对象的数据(属性)进行初始化
* B:构造方法格式特点
* a:方法名与类名相同(大小也要与类名一致)
* b:没有返回值类型,连void都没有
* c:没有具体的返回值return;
class Constructor_Demo { public static void main(String[] args) { Person p = new Person();//构造方法在类创建时初始化 } } class Person { private String name; private int age; public Person(){ //构造方法与方法名一致 name = "张三"; age=23; System.out.println(name+"...."+age); return;//构造可以return,但是没有任何类型,所以直接一个“;”结束 } }
运行结果:
面向对象(构造方法的重载及注意事项)
A:案例演示
* 构造方法的重载
* 重载:方法名相同,与返回值类型无关(构造方法没有返回值),只看参数列表
* B:构造方法注意事项
* a:如果我们没有给出构造方法,系统将自动提供一个无参构造方法。
* b:如果我们给出了构造方法,系统将不再提供默认的无参构造方法。
* 注意:这个时候,如果我们还想使用无参构造方法,就必须自己给出。建议永远自己给出无参构造方法
A:
运行代码:
class Constructor_Demo1 { public static void main(String[] args) { Person p1 = new Person();//无参构造 p1.show(); Person p2 = new Person("张三",23);//有参构造 p2.show(); } } class Person { private String name; private int age; public Person(){ //构造方法与方法名一致 System.out.println("这是无参构造"); } public Person(String name,int age){ this.name = name; this.age = age; System.out.println("这是有参构造"); } public void show(){ System.out.println(name+"...."+age); } }
运行结果:
内存执行图:
B:(a)如果我们没有给出构造方法,系统将自动提供一个无参构造方法。
class Constructor_Demo1 { public static void main(String[] args) { Person p1 = new Person();//无参构造 p1.show(); /*Person p2 = new Person("张三",23);//有参构造 p2.show();*/ } } class Person { private String name; private int age; /*public Person(){ //构造方法与方法名一致 System.out.println("这是无参构造"); }*/ /*public Person(String name,int age){ this.name = name; this.age = age; System.out.println("这是有参构造"); }*/ public void show(){ System.out.println(name+"...."+age); } }
运行结果:
在代码上我注释掉了自己创建的有参构造方法和无参构造方法,依旧出现和无参构造一样的结果,这就是因为系统在我们没有创建构造方法时,为我们自动创建了空参构造方法。
B:(b)如果我们给出了构造方法,系统将不再提供默认的无参构造方法
我注释掉自己创建的无参构造方法,只留下有参构造方法,在new p1时系统会报错,因为当自己创建构造方法时系统将不会自动创建空参构造方法,所有会报错。
运行代码:
class Constructor_Demo1 { public static void main(String[] args) { Person p1 = new Person();//无参构造 p1.show(); /*Person p2 = new Person("张三",23);//有参构造 p2.show();*/ } } class Person { private String name; private int age; /*public Person(){ //构造方法与方法名一致 System.out.println("这是无参构造"); }*/ public Person(String name,int age){ this.name = name; this.age = age; System.out.println("这是有参构造"); } public void show(){ System.out.println(name+"...."+age); } }
报错截图:
面向对象(给成员变量赋值的两种方式的区别)
* A:构造方法
* 给对象中属性进行初始化
* B:setXxx()方法
* 修改属性值
运行代码:
class Constructor_Demo2 { public static void main(String[] args) { Person p = new Person("张三",23);//有参构造 p.show(); p.setName("李四"); p.setAge(24); p.show(); } } class Person { private String name; //姓名 private int age; //年龄 public Person(String name , int age){ //有参构造方法 this.name = name; this.age = age; System.out.println("这是有参构造"); } public void setName(String name){ //设置姓名 this.name = name; } public void setAge(int ae){ // 设置年龄 this.age = age; } public void show(){ System.out.println(name+"....."+age); } }
运行结果:
面向对象(学生类的代码及测试)(掌握)
* A:案例演示
* 学生类:
* 成员变量:
* name,age
* 构造方法:
* 无参,带两个参
* 成员方法:
* getXxx()/setXxx()
* show():输出该类的所有成员变量值
* B:给成员变量赋值:
* a:setXxx()方法
* b:构造方法
* C:输出成员变量值的方式:
* a:通过getXxx()分别获取然后拼接
* b:通过调用show()方法搞定
运行代码
class Student_Demo { public static void main(String[] args) { Student s = new Student("张三",23);//有参构造 s.show(); s.setName("李四"); s.setAge(34); s.show(); } } class Student { private String name; //姓名 private int age; //年龄 public Student(){ System.out.println("这是无参构造"); } public Student(String name , int age){ //有参构造方法 this.name = name; this.age = age; System.out.println("这是有参构造"); } public void setName(String name){ //设置姓名 this.name = name; } public void setAge(int age){ // 设置年龄 this.age = age; } public String getName(){ //返回姓名 return name; } public int getAge(){ //返回年龄 return age; } public void show(){ System.out.println(getName()+"....."+getAge()); } }
运行结果
面向对象(手机类的代码及测试)(掌握)
* A:案例演示
* 模仿学生类,完成手机类代码
运行代码
class Phone_Demo { public static void main(String[] args) { Phone p = new Phone("诺基亚",110); p.show(); p.setName("黑莓"); p.setNumber(120); System.out.println(p.getName()+"...."+p.getNumber()); } } class Phone { private String name; //姓名 private int number; //号码 public Phone(){ System.out.println("无参构造方法"); } public Phone(String name , int number){ //有参构造方法 this.name = name; this.number = number; System.out.println("这是有参构造"); } public void setName(String name){ //设置型号 this.name = name; } public void setNumber(int number){ // 设置号码 this.number = number; } public String getName(){ //返回型号 return name; } public int getNumber(){ //返回号码 return number; } public void show(){ System.out.println(name+"....."+number); } }
运行结果
面向对象(static关键字及内存图)(了解)
* A:案例演示
* 通过一个案例引入static关键字。
* 人类:Person。每个人都有国籍,中国。
country不设置static关键字之前的代码:
class static_Demo { public static void main(String[] args) { Person p1 = new Person(); p1.name = "李四"; p1.country = "中国"; p1.show(); Person p2 = new Person(); p2.name="王五"; p2.country = "中国"; p2.show(); } } class Person { String name; //姓名 String country; //国籍 public Person(){ name="张三"; country="中国"; } public void show(){ System.out.println(name+"....."+country); } }
country不设置static关键字之前的内存图:
country设置static关键字之后的代码:
class static_Demo { public static void main(String[] args) { Person p1 = new Person(); p1.name = "李四"; p1.show(); Person p2 = new Person(); p2.name="王五"; p2.show(); } } class Person { String name; //姓名 static String country; //国籍 public Person(){ name="张三"; country="中国"; } public void show(){ System.out.println(name+"....."+country); } }
country设置static关键字之后的内存图
static关键字的特点
* a:随着类的加载而加载
* b:优先于对象存在
* c:被类的所有对象共享
* 举例:咱们班级的学生应该共用同一个班级编号。
* 其实这个特点也是在告诉我们什么时候使用静态?
* 如果某个成员变量是被所有对象共享的,那么它就应该定义为静态的。
* 举例:
* 饮水机(用静态修饰)
* 水杯(不能用静态修饰)
* 共性用静态,特性用非静态
* d:可以通过类名调用
* 其实它本身也可以通过对象名调用。
* 推荐使用类名调用。
* 静态修饰的内容一般我们称其为:与类相关的,类成员