对象与类
对象:客观存在能够相互区分的个体,比如这辆汽车、这个人、这间房子、这张桌子、这株植物、这张支票、这件雨衣。概括来说就是:万物皆对象。
类:若干具有相同属性和行为的对象的群体或者抽象,类是创建对象的模板,由属性和行为两部分组成
类是对象的概括或者抽象,对象是类的实例化。
类的声明
[修饰符] class 类名{ //类的声明部分
[成员变量]
[成员方法]
}
修饰符
public, protected, default, private
Java中,可以使用访问修饰符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。作用:可以修饰类,也可以修饰类中的成员(变量,方法)
分类
- private : 可用来修饰内部类、属性、方法。被private修饰的属性、方法、类只能被该类的对象访问,其子类不能访问,更不能允许跨包访问。注意:private可以修饰内部类,不可以修饰外部类
- protected : 它主要的作用是保护子类,子类可以用它修饰的成员,其他的不可以protected修饰符可以被本类、同一个包中的类、不同包中的子类所访问到。protected可以修饰属性、方法,但是不能修饰外部类,可以修饰内部类。
- default : 当定义变量、方法以及类时,没有写访问修饰符,则代表默认的修饰符 default。default 修饰的属性、方法、类,只能被本类或者同一个包中的其他类访问到,针对本包访问而设计,任何处于本包下的属性、方法、类、接口等,都可以相互访问。
注:在接口中,默认的访问修饰符是public
-
public : 不同类、不同包下都可以访问。1个java文件中只可以有一个public修饰的类,并且类名需要和文件名相同
访问修饰符图
有一个例子可以参考:JAVA的四种访问修饰符
其他修饰符 / 非访问控制符
abstract, static, final
- static:静态的,非实例的,类的
可以修饰内部类,也可以修饰成员 - final:最终的,不可改变的
可以修饰 类,成员,局部变量 - abstract:抽象的,不可实例化的
可以修饰 类,成员
有且只能有一个public类
在一个 .java 程序中,可以出现多个类,但有且仅有一个类是 public 并且这个public类的名字必须和文件名相同(主类)
每一个java程序运行的时候都会先执行public这个类,而且只执行public类中的代码,如果写了其他的类但是在public类中没有用到,就不会执行其他的类,但是这个类的写法必须正确;如果写了其他的类并在public类中使用了其他的类,那么也会执行其他类的相应代码。
类的构造函数
类的构造函数可以用来给一个类的数值赋一个初值,用来初始化(new)该类的一个新的对象。
而且构造函数和类名同名,并且不需要写返回值类型。
class person{
String name;
int age;
person(String s,int a){ //类的构造函数
name=s;
age=a;
}
void sayhello(){
System.out.println("嗨嘿嗨");
}
void printages(){
System.out.println(age);
}
}
我们没写构造函数的时候
如果我们自己没有写构造函数,那么程序会自动生成一个默认构造函数,这个默认构造函数没有参数,函数中也没有任何语句,也就是相当于什么都不做。
默认生成的类似于这样
person(){}
运用
① 类中没写构造函数
在没写构造函数的时候,初始化一个新对象的时候,不需要写参数
② 类中写了构造函数
那么程序就不会再生成默认构造函数了,在初始化一个对象的时候,就使用咱们自己写的构造函数了,并且如果自己写的构造函数中有参数,必须要加上参数,否则报错,如果本身就没写参数,那么可以不写。
构造函数中 this 的使用
1. this 指当前这个对象实例本身
比如说,age=和 this.age 是一样的,都是可以运行的。
void printages(){
System.out.println(age);
}
void printages(){
System.out.println(this.age);
}
2. this 还可以用来解决 局部变量 和 域 同名的问题
比如说this.name指的就是域变量,name指的就是参数变量。
person(String name,int age){
this.name=name;
this.age=age;
}
3.在构造函数中,this 可以调用另一种构造方法
并且这条调用语句必须放在第一句。 ??
person(){
this()
...
}
抽象方法与抽象类
引入
分析一下Geometry父类,发现父类中的这个draw()方法写了和没写一样,因为完全就没有产生这么一个调用
class Geometry{
void draw(){
System.out.println("画一个几何图形");
}
}
- 为此我们就可以将此方法设置为抽象方法,在返回值类型前加上一个
abstract关键字
即可,然后抹去这个方法的方法体,因为抽象方法是不可以有方法体的
abstract void draw();
- 但是这样写的话编译器马上就给我们报错了,说是一定要将这个类也抽象,这就形成了抽象类的概念,因为
如果一个类中有抽象方法,那么这个类就必须是抽象类
注意事项
- 抽象类不能被实例化
- 类内的数据成员,和普通类没有区别(就是这个抽象类,它除了不能对抽象方法做实现外,其他其实也和普通的类没什么区别,普通的成员变量和成员方法都是可以定义的)
- 抽象类主要就是用来被继承的,所以不可以被final关键字修饰,抽象方法也是一样,需要被重写(final关键字如果去修饰方法的时候,那么这个方法就不可以被重写,如果去修饰类的话,那么这个类就不可以被继承,所以一定不要把abstract和final关键字写在一起,这是矛盾的)
- 如果一个类继承了这个抽象类,那么这个类必须重写抽象类中的抽象方法
- 不可以用 static 和 private 关键字修饰abstract方法
- 抽象类中也可以由构造方法,方便子类调用
可以学习具体实例 Java | abstract关键字【面向对象的第三大特征——多态】_javaabstract关键字-优快云博客