Java基础 | 类和对象
所有知识点均来源于《Java从入门到精通》(第六版)。
类
成员变量
对象的属性称为成员变量,整个类中都是成员变量作用范围。
class Demo{
int x = 45;
static int y = 90;
}
- x是实例变量;
- y是静态变量(类变量),可以有效的跨类,达到整个应用程序之内,可以用
类名.静态变量
的方式在其他类中使用。
public class Book{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
成员方法
语法:
权限修饰符 返回值类型 方法名(参数类型 参数名) {
方法体;
return 返回值;
}
成员办法中可以调用其他成员和类成员变量,同时成员办法中也可以自己定义一个局部变量。
权限修饰符
主要有private
, public
和protected
,用来控制对类和类的成员变量以及成员办法的访问。
成员变量或成员办法被修饰为:
private
,那么只能在本类中被使用,同包其他类和子类都是不可见的,当然在其他包的类和子类也是不可见的。public
,那么在本类,同包其他类和子类和其他包的类和子类中都是可见的。protected
,那么在本类,同包其他类和子类中都是可见的但是在其他包的类和子类中都是不可见的。
如果声明类的时候什么修饰符也没用,那么这个类预设为包存取范:只有一个包中的类可以访问这个类的成员变量或成员办法。
package com;
class AnyClass{
public void doString(){
//办法体
}
}
这里类的修饰符是默认的,所以即使办法体是public
的,他的访问权限还是和AnyClass类是一样的。
局部变量
在类的方法体中声明的变量都叫局部变量。且只在当前代码块中有用也就是当前{ }中有用,在办法执行结束时就会被销毁。局部变量在使用时必须进行赋值操作或者初始化,不然会出现错误。
如果成员变量和局部变量同名,那么在当前方法中成员变量暂时失效。
public class Val{
static int times = 3; //这是成员变量
public static void main(String[] args){
int times = 4; //这是局部变量
System.out.println('times的值为:'+times);
}
}
这里的输出是4。
this关键字
用于本类当前的对象(当前正在使用的对象),只能在本类中使用。
这里是将参数赋予类中的成员变量
public void setName(String name){
this.name=name;
}
这里两个name,一个是形式参数,一个是成员变量都叫name。
this关键字被隐式的用于引用对象的成员变量和办法,所以这里this.name
说的是Book类中的成员变量,第二个name说的是形式参数,意思就是把输入的形式参数赋值给成员变量。
直接return this
也是可以的,意思是返回Book类的本类对象。
类的构造方法
构造方法是一个和类同名的方法,对象的创建就是通过构造方法完成的,每当类实例化一个对象时,类都会自动调用构造方法:
- 构造方法没有返回值,但是不需要写void;
- 构造方法的名称要和本类名称相同。
还是用一开始的Book类为例:
public Book(){
//构造方法体
}
构造方法中可以为成员变量赋值,这样实例化一个本类对象的时候,相应的成员变量也会被初始化。
如果类中没有明确的定义构造的方法,编译器是会自动创建一个不带参数的默认构造办法的。
之前写的this不仅可以调用成员变量和成员方法,还可以调用类的构造方法:
public class EggCake{
int EggCount;
//自定义的构造方法,参数是鸡蛋数量,赋值给成员方法。
public EggCake(int EggCount){
this.eggCount = eggCount;
}
//没有参数的构造方法,默认给一个蛋
public EggCake(){
//这个this调用的是上面那个构造方法,并且输入参数1。
this(1)
}
public static void main(String[] args){
EggCake cake1 = new EggCake();
System.out.println('默认条件有'+cake1.EggCount+'个蛋。') //一个
EggCake cake2 = new EggCake(2);
System.out.println('要求两个蛋,会给'+cake2.EggCount+'个蛋。') //两个
}
}
静态变量和静态方法
static修饰符
被声明为static的变量和方法被称为静态成员。静态成员属于类所有,可以在本类或者其他类使用‘类名.静态类成员’
的办法调用静态成员。
public class StaticDemo{
static double PI = 3.1415;
public static void method(){
System.out.println('这是静态方法');
}
public static void main(String[] args){
System.out.println(StaticDemo.PI);
StaticDemo.method();
}
}
可以得到:
3.1415
这是静态方法
静态的属性是个共享的属性,静态成员同样要遵守public
, private
和protected
修饰符的约束。
类的主方法
类的入口,定义了程序开始的位置,主方法提供了程序流向的控制,语法:
public static void main(String[] args){
}
- 主方法是静态的,如果要在里面调用其他方法,那那个方法也需要是静态的;
- 树方法没有返回值;
- 主方法的形参是数组,args[0]到args[n]代表程序的第一个参数到第n个参数,可以用args.length来获得参数的个数。
- arguments是自变量的意思。
对象
对象的创建
通过new来创建,每实例化一个对象就会自动调用一个构造方法。
在创建之后,可以用对象.类成员
来获得对象的属性和行为(方法)
对象的引用
类名 对象的引用变量
People tom = new People();
这里new People()
是真正的对象,People tom
实在引用对象,tom
是引用变量,意思就是tom
是new People()
的代理人,两者能做的操作完全相同。
new People.getClass();
//和
People tom = new People();
tom.getClass();
//完全相同
数据类型转换
隐式类型转换
从低级类型向高级类型的转换,系统可以自己执行,比如:byte<short<int<long<float<double。
int x = 50;
float y = x;
显式类型转换
把高精度的变量赋值给低精度变量的时候,必须用显式类型转换,(类型名) 要转的值
。
int a = (int)45.23;//46
long a = (long)456.6F;//456
int b = (int)'d';//100