*1.两个引用指向同一对象内存:
* 例子:Phone.java与Phone_Test.java
/** 手机类:* 成员变量:品牌,价格,颜色...* 成员方法:打电话,发短信...*/public class Phone {//品牌String brand;//价格int price;//颜色String color;//打电话public void call(String name) {System.out.println("给"+name+"打电话");}//发短信public void sendMessage() {System.out.println("群发短信");}}
/* * 手机类的测试类*/public class Phone_Test {public static void main(String[] args) {Phone p = new Phone();p.brand = "OPPO";p.price = 2999;p.color = "白色";System.out.println(p.brand+"---"+p.price+"---"+p.color);Phone p2 = p; //两个引用指向同一内存p2.brand = "魅族";p2.price = 1999;p2.color = "蓝色";System.out.println(p.brand+"---"+p.price+"---"+p.color);System.out.println(p2.brand+"---"+p2.price+"---"+p2.color);}}
* 图解:
*
* 2.成员变量和局部变量的区别:
* A:在类中的位置不同:
* 成员变量:类中,方法外
* 局部变量:方法内或者方法声明内(形式参数)
* B:在内存中的位置不同
* 成员变量:堆内存
* 局部变量:栈内存
* C:生命周期不同:
* 成员变量:随着对象的创建而存在,随着对象的消失而消失
* 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
* D:初始化值不同
* 成员变量:有默认值
* 局部变量:无默认值
*
public class A_One {//局部变量与成员变量int x;public void show(){int y;System.out.println(x); //不会报错,因为有默认值//System.out.println(y); //会报错 因为没有赋值}}
3.private关键字:
* 通过对象直接访问成员变量,会存在数据安全问题
*
* 这个时候,我们就想能不能不让外界的对象直接访问我们的成员变量
* 能
* 如何实现?
* 就是用private关键字!
*
* private关键字:
* 是一个修饰符(如:public static是修饰符)
* 可以修饰成员变量,也可以修饰
* 被private修饰的成员只能在本类中访问,我们会设置getXXX()方法和setXXX()方法,用于获取和设置成员变量的值,方法用public修饰
* Student.java与Student_Test.java
public class Student {String name;private int age;public void show(){System.out.println("你好 学生"+name+",年龄:"+age);}public void setAge(int a){if(a<0||a>150){System.out.println("你给的年龄有误!!!");}else{age=a;}}public int getAge(){return age;}}
/** 学生类的测试类* * */public class Student_Test {public static void main(String[] args) {// TODO Auto-generated method stubStudent s=new Student();//s.show();s.name="彭于晏";//s.age=-18;//报错了 因为用了private关键字//s.show();s.setAge(189);System.out.println(s.getAge()); //年龄是0,为默认值,setAge不做出反应,因为不符合条件s.show();s.setAge(100);System.out.println(s.getAge()); //年龄是100,符合条件了s.show();}}
*
*4.private关键字练习:(与this一起用)
*② 起名字要见名知意,如26行:public void setName(String name){
* 而我们现在的代码中的a就没有做到见名知意,如32行 : public void setAge(int a){
* 如果我们有局部变量名和成员变量相同,在局部使用的时候,其实采用的是就近原则
* 我们有没有办法把局部变量name赋值给成员变量name
* :有
* 有什么办法?
* :this关键字就可以,即使用如下this.name=name
* this 关键字代表所在类对象的引用
* 方法被哪个对象调用,this就代表那个变量
* 使用场景
* 局部变量隐藏成员变量
* Teacher.java与Teacher_Test.java
public class Teacher {private String name;private int age;public void setName(String name){this.name = name;}public String getName(){return name;}public void setAge(int a){if(age<0||a>150){System.out.println("年龄输入错误!");}else{age=a;}}public int getAge(){return age;}}
/** 测试类* */public class Teacher_Test {public static void main(String[] args) {// TODO Auto-generated method stub//创建对象Teacher t=new Teacher();System.out.println(t.getAge());System.out.println(t.getName());t.setName("彭于晏");t.setAge(100);System.out.println(t.getAge());System.out.println(t.getName());}}
*
* java语言面向对象三大特征:封装、继承、多态
* 了解封装介绍、优点:CSDN:(114条消息) JAVA面向对象三大特征详解:(封装,继承,多态)_.free.的博客-CSDN博客
*
*5. this关键字
* Teacher.java与Teacher_Test.java,如上第4点代码所示
*
*6. 构造方法的特点:
* 给对象的数据进行初始化
* (通过构造方法可以来创建对象)
* 格式:
* A:方法名和类名相同
* B:没有返回值类型,连void都不能写
* C:没有具体的返回值
* 例子: Person.java 与 Person_Test.java
public class Person{//String name;private int age;public Person(){System.out.println("这是构造方法!!");}//public Person(){} 会报错,因为跟上面的名字一样,形参一样(指个数、数据类型一样)//构造方法赋值public Person(String name){this.name=name;}//public Person(String n){ 会报错,跟上面的名字一样,形参一样(指个数、数据类型一样)//this.name=name;//}//构造方法赋值public Person(int age){this.age=age;}//构造方法赋值public Person(String name,int age){this.name=name;this.age=age;}public void show(){System.out.println(name+"----"+age);}}
public class Person_Test {public static void main(String[] args) {// TODO Auto-generated method stub// 与创建对象的格式相似,创建对象就是用构造方法来的//格式:类名 对象名 = new 构造方法(...)Person p = new Person(); //输出:这是构造方法!!。如果注释掉无参构造方法,结果跟18行一样。Person p1=new Person("张三");Person p2=new Person(18);Person p3=new Person("张三",19);p1.show(); //张三----0p2.show(); //null----18p3.show(); //张三----19Person p4=new Person(); //如果把无参构造方法注释掉,这里会报错,因为这里如歌使用无参构造方法,需要自己提供,系统默认的已经没有了,因为上面自己给出了构造方法}}
*
* 构造方法的注意事项:
* A:如果我们没有给出构造方法,那么系统将会提供一个默认的无参构造方法供我们使用
* B:如果我们给出了构造方法系统将不再提供默认的无参构造方法供我们使用
* 这个时候,如果我们想使用无参构造方法,就必须自己提供
* C:推荐自己给无参构造
*
* 7.面向对象标准汽车类练习:
* Car.java与Car_Test.java
package day14_1112;/** 汽车类* */public class Car {//成员变量private String name;private int price;//构造方法public Car(){}public Car(String name,int price){this.name=name;this.price=price;}//成员方法public void setName(String name){this.name=name;}public void setPrice(int price){this.price=price;}public String getName(){return name; }public int getPrice(){return price; }}
package day14_1112;/** 汽车测试类* * */public class Car_Test {public static void main(String[] args) {// TODO Auto-generated method stubCar c1=new Car();c1.setName("彭于晏");c1.setPrice(2999);System.out.println(c1.getName()+"----------"+c1.getPrice());Car c2=new Car("吴彦祖",9999);System.out.println(c2.getName()+"----------"+c2.getPrice());}}
Java学习笔记day14(两个引用指向同一对象内存图解 成员变量和局部变量的区别 private关键字 this关键字 构造方法的特点 面向对象标准汽车类练习)