JAVASE的学习笔记(二)
封装与关键字
抽象与封装
static和this关键字的浅薄认知
static修饰什么?
- static可以修饰成员变量:静态变量、类变量 示例
类名.变量名称
(主要作用:数据共享) - static可以修饰成员方法:静态方法、类方法 示例
类名.方法名称()
- 只能使用可以访问静态变量或者静态方法
- static可以修饰内部类
this和对象有关,每个类的非静态方法都会隐含一个this关键字。当在方法中使用本类的属性时都会隐含的使用this。this可以看做一个变量,它的值就是当前对象的引用。而abstract修饰方法,子类需要重写去实现,也指向对象,只不过指向的是父类对象; static只和类有关
static修饰方法,则方法不属于某个对象,属于class,可用class名.方法名(),进行调用;简单的说abstract实例对象; 而static属于类。 所以static方法不能是abstract方法
this和super都无法出现在static 修饰的方法中,static 修饰的方法是属于类的,该方法的调用者可能是一个类,而不是对象.如果使用的是类来调用而不是对象,则 this就无法指向合适的对象.所以static 修饰的方法中不能使用this.
static重要作用:数据共享
class Student{
private String name;
private int age;
public static int count ;//不再存储在堆内存当中,而是存储在方法区中全局数据区域,做到“共享数据”
public Student(String name,int age){
this.name = name;
this.age = age;
count++;
}
public String toString() {
return "name="+name+",age="+age;
}
}
static:当类在被JVM加载的时候,首先会加载类中由static修饰的所有属性,方
法,代码块。static修饰的内容,在整个程序运行期间,只有一份,而且所有对象
共享。它的生命周期从程序的开始到结束。static变量置于方法区中。
this:this代表当前对象的一个引用。 使用this来调用其他构造方法的时候其必
须是第一条语句
类只要被创建就会加载static修饰的内容,class创建对象在这之后,this指向当前对象,所以二者不可共同使用。
this
- 只能使用在方法的内部,谁调用就代表谁,当前调用的那个对象
- 可以代表引用数据类型,实际上引用了“堆”内存地址
- this无法在
静态方法中
使用 - 在
实例方法
方法中,可以使用this关键字调用本类中的成员变量和成员方法 - 构造方法之间不能直接调用,必须通过this互相调用,必须放置第一个语句
- 若某个构造方法的第一条语句有this(…),那这个构造方法将调用本类其它构造方法
New关键字
只要有new就执行构造方法,构造方法是创建对象的根本途径
使用new关键字创建对象时需注意:
- 为对象实例分配内存空间
- 调用构造方法
- 返回对象实例的引用
在建立一个对象时,从两个地方分配内存:在堆中分配的内存实际建立这个对象;在堆栈中分配的内存只是一个指向该堆对象的指针(引用)而已。
toString()方法
只要输出就默认调用 toString()方法
Object类中有一个toString方法,它是所有类的父类,所以用户创建所有类都继承该方法。在没重写该方法前, toString() 方法 返回(类名 + @ +hashcode)字符串。
方法返回值
方法返回值有以下两种情况:
- 方法没有返回值,返回类型为void
- 方法有返回值,必须使用关键字return返回该值,返回类型为该返回值的类型
构造方法与方法类似之处在于它们都包含可执行代码。但区别在于:只有当JVM实
现在创建类的实例时才执行构造方法,构造方法通常包含字段初始化代码。严格来
说,构造方法不是方法,因为它不会返回任何值
访问修饰符
public
:公共的,在任何位置都可以访问protected
:受保护的,在继承关系或者同包下可以访问default
:默认不写,友好的,只有在同包范围才可以访问private
:私有,只有在当前类的范围访问有效
在java中封装分为下面两种:
- 对成员变量的封装,是通过访问控制修饰符进行控制,绝大部分情况下,我们都是使用private修饰实例变量
- 对成员方法的隐藏,只能通过方法名和返回值类型知道该方法是由什么作用,但是其内部是如何实现的是无法“看到”
访问由“Private”修饰的成员变量,需要用get()与set()方法
访问由Private修饰的构造方法时,需要使用static关键字和getInstance()方法:
Boy boy = Boy.getInstance();
System.out.println(boy);
class Boy{
private Boy(){//设置外部无法对其进行实例化操作
System.out.println("Boy类的无参数的构造方法");
}
static Boy getInstance(){//static可以用类来调用,不需要实例了
return new Boy();
}
}
static可以用类来调用,不需要实例
在Java中,有些class:
- 使用private实例字段;
- 通过public方法来读写实例字段。
这种class被称为JavaBean:JavaBean主要用来传递数据,即把一组数据组合成一个JavaBean便于传输。通过getter和setter来定义属性;使用Introspector.getBeanInfo()可以获取属性列表。
GetInstance()方法与new:
- new的使用:如Object _object = new Object(),这时候,就必须要知道有第二个Object的存在,而第二个Object也常常是在当前的应用程序域中的,可以被直接调用的
- GetInstance的使用:在主函数开始时调用,返回一个实例化对象,此对象是static的,在内存中保留着它的引用,即内存中有一块区域专门用来存放静态方法和变量,可以直接使用,调用多次返回同一个对象。
区别:
大部分类(非抽象类/接口/屏蔽了constructor的类)都可以用new,new就是通过生产一个新的实例对象,或者在栈上声明一个对象 ,每部分的调用用的都是一个新的对象。
getInstance是少部分类才有的一个方法,各自的实现也不同。getInstance在单例模式(保证一个类仅有一个实例,并提供一个访问它的全局访问点)的类中常见,用来生成唯一的实例,getInstance往往是static的。
- 对象使用之前通过getinstance得到而不需要自己定义,用完之后不需要delete;
- new 一定要生成一个新对象,分配内存;getInstance() 则不一定要再次创建,它可以把一个已存在的引用给你使用,这在效能上优于new;
- new创建后只能当次使用,而getInstance()可以跨栈区域使用,或者远程跨区域使用。所以getInstance()通常是创建static静态实例方法的。
-
方法区
Java内存
Scanner对象
接收输入内容的方式
- next():
1.一定要读取到有效字符后才可以结束输入
2.对输入有效字符之前遇到的空白,next()方法会自动将其去掉
3.只有输入有效字符后才将后面输入的空白作为分隔符或结束符
4**.next()不能得到带有空格的字符串** - nextLine():
1.以Enter为结束符,也就是说nextLine()方法返回的是输入回车之前的所有字符
2.可以获得空白