Java从入门到放弃06---面向对象/成员变量和局部变量的区别/this关键字/匿名对象/封装(private关键字)
2019-04-11 11:20
627 查看
Java从入门到放弃06—面向对象/成员变量和局部变量的区别/this关键字/匿名对象/封装(private关键字)
01 面向对象的思想
-
创建一个类,将实现某种功能的具体步骤封装在该类下。使用的时候,根据需求找到对应的类。
-
特征:封装/继承/多态
02 类和对象的概念
-
类:一组相关的属性和行为的集合 对象:该类事物的具体体现 eg.学生类里的某一对象为班长
-
类的组成:成员变量和成员方法
-
类的使用:
文件名问题:java文件名建议与测试类名称一致 使用:通过创建对象使用类 对象的创建格式:类名 对象名=new 类名(); 成员变量的使用:对象名.变量名 成员方法的使用:对象名.方法名(实参);
-
注意事项:一个Java文件中,可以定义多个类,有什么注意的,注意 public 只能在一个有main方法的类可以加上,其他类不能加public
- 以一个手机类为例
class PhoneTest{ public static void main(String[] args){ Phone phone=new Phone();//创建对象 String brand=phone.brand;//获取成员变量 String color=phone.color; String storage=phone.storage; phone.call(brand);//使用成员方法 phone.sendMsg(brand); } } class Phone{//创建一个手机类 String brand="Samsung";//成员变量(成员变量不赋值时有默认值) String color="blue"; String storage="64g"; public void call(String brand){//成员方法 System.out.println("用"+brand+"打电话"); } public void sendMsg(String brand){ System.out.println("用"+brand+"发短信"); } } 运行结果:用Samsung打电话 用Samsung发短信
- 以一个学生类为例
public class StudentTest { public static void main(String[] args) { Student s1 = new Student(); s1.name="Jay"; s1.age=23; s1.homeWork(); s1.sleep(); Student s2 = new Student(); s2.name="JJ"; s2.age=21; Student s3=s1;//s3与s1引用同一空间,因此无论是s1还是s3对成员变量进行重新赋值,都会改变该空间下的成员变量。 s3.name="leehom"; s3.age=28; s1.age=30; System.out.println(s1.name);//输出最后一次该引用空间下成员变量name,应为leehom System.out.println(s1.age);//输出最后一次该引用空间下成员变量age的值,应为30 System.out.println(s2.name); System.out.println(s2.age); System.out.println(s3.name);//输出最后一次该引用空间下成员变量name,应为leehom System.out.println(s3.age);//输出最后一次该引用空间下成员变量age的值,应为30 } } class Student { String name; int age; public void homeWork(){ System.out.println("Do homework"); } public void sleep(){ System.out.println("Go sleep"); } } 运行结果:Do homework Go sleep leehom 30 JJ 21 leehom 30
03 成员变量和局部变量的区别
- 在类中的位置不同
成员变量:在类中方法外
局部变量:在方法定义中或者方法声明上(形参) - 在内存中的位置不同
成员变量:在堆内存
局部变量:在栈内存 - 生命周期不同
成员变量:随着对象的创建而存在,随着对象的消失而消失
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失 - 初始化值不同
成员变量:有默认初始化值
局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。
04 参数传递问题/this关键字
- 总结1:基本数据类型:形式参数的改变不影响实际参数
引用数据类型:形式参数的改变直接影响实际参数
public class MyTest { public static void main(String[] args) { Dog dog = new Dog();//该对象在堆内存中引用某一空间 String name = "小花";//局部变量,存储在栈内存中 int num = 100;//局部变量,存储在栈内存中 dog.show(dog, name, num);//调用dog类中的show方法,形参中的dog是该类的对象名,该方法执行完毕后,弹栈。引用空间会继续保留一段时间,直到main{}中不再引用该空间下的任何变量,JAVA会对该空间进行回收。 System.out.println(dog.name);//3.dog.name指向引用空间中的name变量kitty System.out.println(dog.age);// 4.dog.age指向引用空间中的age变量101 System.out.println(name);// 5.输出栈内存中name变量小花 System.out.println(num);// 6.输出栈内存中的num变量100 } } class Dog { String name; int age; public void show(Dog dog1, String name, int num) { System.out.println("这个方法调用了"); name = "kitty"; num = 100 + 1; dog1.name = name; dog1.age = num; System.out.println(name);//1.该方法对引用空间的name变量重新赋值kitty System.out.println(num);//2.该方法对引用空间中的num变量重新复制101; } }
- 参数使用的就近原则:
1.方法中需要访问一个变量,会先从局部位置找该变量,找到就使用;找不到则去成员位置找同名变量。
2.方法的内部和形参都属于局部位置,成员位置即成员变量的位置。
public class MyTest { public static void main(String[] args) { //一个Java文件中,可以定义多个类,有什么注意的,注意 public 只能在一个有main方法的类可以加上,其他类不能加public Dog dog = new Dog(); do 4000 g.show(); dog.show1(); dog.show2("John"); } } class Dog { String name = "小花";//成员位置 public void show() {//方法的内部和形参都属于局部位置 String name="lily"; System.out.println(name);//优先使用局部变量,这里打印的是lily } public void show1() {//方法的内部和形参都属于局部位置 System.out.println(name);//由于局部位置没有该变量,因此使用成员位置上的该同名变量这里打印的是小花 } public void show2(String name) {//方法的内部和形参都属于局部位置 System.out.println(name);//优先使用形参传递过来的局部变量,因此这里打印John System.out.println(this.name);//this关键字,对当前类的对象引用,打印结果为小花 } }
- this关键字:this代表本类的一个引用,可理解为本类的一个对象。哪个对象调用某个方法,那么方法中的this就代表这个对象
public class MyTest { public static void main(String[] args) { A a = new A(); System.out.println(a);//1.地址值 int num=10; a.show(num,a);//调用show方法,show方法结束后,弹栈。引用空间保留一段时间,直到main{}中不再调用该空间下的变量,java对该空间进行进行回收。 System.out.println(num); //6.打印栈内存中的局部变量num,值为10 } } class A{ int num=100; public void show(int num, A a){ System.out.println(this);//2.地址值 System.out.println(num); //3.10 System.out.println(a.num); //4.打印本类中的num变量值100 System.out.println(this.num);//5.打印本类中的num变量值100 System.out.println(a==this);//6.判断this和对象a的地址值是否一致,结果为true } }
05 匿名对象
- 匿名对象:顾名思义,没有名字的对象。
- 应用场景1:调用方法,仅仅只调用一次的时候。
public class StudentPractice04 { public static void main(String[] args) { new Student();//匿名对象 int age = new Student().age;//匿名对象调用成员变量,每new一次就产生一个新的对象 System.out.println("age"); new Student().homeWork();//匿名对象的方法调用,每new一次就产生一个新的对象 } } class Student { String name="Stephen"; int age=100; public void homeWork(){ System.out.println("Do homework"); } public void sleep(){ System.out.println("Go sleep"); } }
- 应用场景2:匿名方法可以作为参数传递,但只能调用一次。
public class CatTest { public static void main(String[] args) { Cat cat = new Cat(); cat.show(cat, 19); System.out.println(cat.num);//19 System.out.println("---------------------"); cat.show(new Cat(), 20);//匿名对象可以作为参数传递 System.out.println(cat.num);//匿名对象可以作为参数传递,但只能调用一次。因此此时打印的是前一个对象的成员变量值19 } } class Cat { int num = 100; public void show(Cat cat, int num) { cat.num = num; System.out.println(cat.num); } } 运行结果:19 19 --------------------- 20 19
06 封装(private关键字)
-
概念:隐藏对象的属性和实现细节,仅对外提供公共访问方式。
-
原则:1.将不需要对外提供的内容都隐藏起来。
2.把属性隐藏,提供公共方法对其访问。 -
封装的优势:1.隐藏实现细节,提供公共的访问方式
2.提高了代码的复用性
3.提高安全性。 -
private关键字:1.是一个权限修饰符
2.可以修饰成员变量和成员方法
3.被其修饰的成员只能在本类中被访问 -
private 是一个权限修饰符 可以修饰成员变量和成员方法,但是不可以修饰类,被修饰后,只能在本类中访问,外界无法访问。
-
public 公共的 是一个权限修饰符 可以修饰类,成员变量和成员方法,被修饰的成员在任何地方都可以被访问
-
成员变量私有化后,如果想要对成员变量赋值,需要调用公共的set方法以及get方法
-
一键生成get setalt+insert自动生成get set 方法
-
程序示例:
public class MyTest { public static void main(String[] args) { Person person = new Person(); person.name="张三";//通过 对象名.成员变量名=值 这种方式给被public修饰的成员变量赋值 // person.age=23;私有化的成员变量,外界不能通过该方式直接进行赋值。 person.setAge(10);//私有化的成员变量需要调用公共的set方法进行赋值 System.out.println(person.name); int age = person.getAge();//私有化的成员变量需要调用公共的get方法进行访问 System.out.println(age); System.out.println("---------------------------"); Person person2 = new Person(); person2.name = "李四"; person2.setAge(40); person2.show(); } } class Person { String name; private int age;//private 是一个权限修饰符,私有的,可以修饰成员变量,成员方法,被修饰的成员,只能在本类中访问,外界无法访问。 public void setAge(int age){ if(age>=0&&age<=100){ this.age = age;//使用关键字this可以区分形参中的同名变量 }else{ System.out.println("设置的年龄不合理"); } } public int getAge(){ return age; } public void show() { System.out.println(name); System.out.println(age); } } 运行结果:张三 10 --------------------------- 李四 40
相关文章推荐
- 7 面向对象(成员变量和局部变量的区别,类作为形式参数的问题,匿名对象,封装,private关键字,this关键字,构造方法,类的初始化过程,static关键字)
- 成员变量和局部变量的区别、方法的形参为类的情况及匿名对象、封装(private关键字)、this关键字、构造方法、static关键字
- 黑马程序员_Java基础_面向对象(概述、类与对象关系、成员变量、封装private、构造函数和构造代码块、this关键字)
- 【JavaSE学习笔记】面向对象_01(入门,匿名对象,成员变量,局部变量,封装,this,构造方法)
- Java 笔记 及 面向对象 成员变量与局部变量的区别 面向对象3大特征:这里只写了封装,构造函数 .this关键字
- Java基础-07.总结private,this,封装,static,成员方法变量,局部变量匿名对象
- JAVA之旅(四)——面向对象思想,成员/局部变量,匿名对象,封装 , private,构造方法,构造代码块
- 面向对象、匿名对象、成员、封装、主函数、成员变量、局部变量、构造函数、this、静态、主函数
- JAVA之旅(四)——面向对象思想,成员/局部变量,匿名对象,封装 , private,构造方法,构造代码块
- JAVA基础再回首(四)——面向对象思想、类与对象、成员/局部变量、匿名对象、封装、private、this、构造方法
- Java基础:面向对象(1)--对象的概念、成员变量与局部变量、匿名对象、类的封装
- 黑马程序员--面向对象(一)封装、成员变量与局部变量、匿名对象、构造函数、this关键字
- Java基础05:面向对象;类与对象;匿名对象;成员变量;局部变量;封装;构造函数
- JavaSE——Day6——面向对象、类、成员变量、匿名对象、封装、this关键字
- 重踏学习Java路上_Day07(成员与局部变量,形参,匿名对象,封装,private,this,构造与成员方法,static)
- java基础七(成员变量 局部变量 匿名对象 封装 设计原则 private this 构造方法 static)
- 黑马程序员_06_面向对象_成员变量_匿名对象_封装_构造函数_thisPrivate
- 黑马程序员------面向对象(No.1)(面向对象的理解、成员变量、局部变量、匿名对象)
- 黑马程序员—Java面向对象(类和对象、封装、构造方法、this关键字、static关键字)
- 局部变量与成员变量的区别、匿名对象