1.类和对象的基本概念
1.在Java中一切皆对象,一切都围绕对象进行,找对象、建对象,用对象等
类:把具有相同属性和行为的一类对象抽象为类,例如人类,猫科类等等,无法具体到每个实体的。
类指的就是一种模板,定义了一种特定类型的所有对象的属性和行为。在一个.java的文件中,可以有多个class,但是只能有一个class是用public修饰。被声明为public的class,必须和文件名相同
对象:类是模板,通过模板创建出具体的实例,就是对象,对象就是实际存在的某类事物的个体,也叫实例,类和对象的关系,就是抽象和具体的关系。类是描述某一对象的统称,对象是这个类的一个实例而已。有类之后就能根据这个类来产生具体的对象。一类对象所具备的共同属性和行为(方法)都在类中定义。
2.类和对象的声明和创建
2.1类的定义格式:
[访问修饰符] class 类名{
成员变量(属性)
成员方法(行为)
内部类
代码块
}
public class 类名称 {
成员变量/ 实例变量;
成员方法;
这里面还可以有内部类
代码块
}
2.2成员变量
java类的成员变量,都有默认值
整数:0
浮点数:0.0
boolean:false
字符:'\u0000'
引用类型:null
java类的成员变量,在下面所有的方法中,都可以访问到
2.3局部变量
局部变量,没有默认值
1.方法体中声明的变量
2.方法参数中的变量
3.代码块中的变量
2.4 创建对象
创建对象的语法:类名 对象名=new 类名();
public class Test {
public static void main(String[] args) {
//创建一个实例化对象
Dog dog1 = new Dog();
//通过对象来调用实例变量、成员方法
dog1.name = "旺财";
dog1.age = 2;
dog1.sex = "公";
dog1.print();
Dog dog2 = new Dog();
dog2.print();
}
}
class Dog{
//成员变量(实例变量),在堆中的每个对象中存储,通过对象调用
String name;//默认值为null
int age;//默认值为0
String sex;//默认值为null
//成员方法(实例方法),在JVM的方法区中存储,通过对象调用
void print(){//在类里定义一个方法
System.out.println("name:"+name+", age:"+age+", sex:"+sex);
}
}
3.static关键字
3.1static可以修饰属性
1.类成员变量或静态成员变量:使用static修饰的,作用范围在整个类的所有对象上,所有对象共享这个变量,在内存中只有一个副本。访问通过 类名.变量名 访问。在类加载时被初始化,存储在堆里。
2.实例成员变量:没有static修饰,作用范围在某个实例对象上。在创建对象时被初始化,存在多个副本。各个对象不互相影响。通过 实例对象名.变量名 访问。
运行结果
3.2static可以修饰方法
类方法或静态方法:使用static修饰,不能直接使用实例变量,只能直接使用静态变量。只能直接调用静态方法,不能直接调用实例方法。通过 类名.方法名() 访问在静态方法中不允许使用this关键字
实例方法:没有static修饰,既可以使用静态变量,又可以使用实例变量。既可以直接访问实例方法,又可以直接访问静态方法。 通过 实例对象名.方法名() 访问
4.构造方法
1. 也称作构造器,严格来讲,构造方法不是方法
2. 构造方法要求和类名相同,没有返回值类型,也没有void,可以有return,表示方法的结束,不能返回值。
3. 构造方法主要作用是完成对象的初始化工作。
4. 每个java类,都至少有一个构造方法,如果不写构造方法,编译器会自动提供一个构造方法,没有任何参数和语句的,默认的空构造方法。如果一旦写了构造方法,编译器不会再提供默认的构造方法。
5. 一个类可以定义多个构造方法(构造方法的重载)
6. 一般情况,都会写一个无参的构造方法,这是一个好的编程习惯
7. 构造方法的调用:
如果是在其他类中,通过new 的方式来调用构造方法
如果是在自己的类中,可以在构造方法之间进行互相调用。使用this([参数])。必须写在构造方法中的第一行
8.快捷生成 alt+insert
new 执行过程
1.为对象分配内存空间
2.调用合适的构造方法
public class Test {
public static void main(String[] args) {
//当创建一个对象时,默认调用该类的构造方法
Person person = new Person();
}
}
class Person{
String name;
int age;
String sex;
//构造方法名称与类名称完全相同
//没有返回值声明
public Person(){
System.out.println("Person的构造方法");
}
}
4.1构造方法的重载
要求:
1.方法名要相同
2.参数列表不同(类型和个数)
3.返回值不做要求
public class Test {
public static void main(String[] args) {
//当构造对象时,默认调用该类的构造方法
Dog person = new Dog();
Dog person1 = new Dog("旺财");
Dog person2 = new Dog("旺财",2);
Dog person3 = new Dog("旺财",2,"公");
}
}
class Dog{
String name;
int age;
String sex;
public Dog(){
//构造方法首行name = null,age = 0;sex = null(不用写)
System.out.println("Dog类的无参构造");
}
public Dog(String n){
//首行name = null,age = 0;sex = null;
name = n ;
System.out.println("name:"+name);
System.out.println("Dog类的一个参数的有参构造");
}
public Dog(String n,int a){
name = n ;
age = a;
System.out.println("name:"+name+", age:"+ age );
System.out.println("Dog类的两个参数的有参构造");
}
public Dog(String n,int a,String s){
name = n ;
age = a;
sex = s;
System.out.println("name:"+name+", age:"+ age +", sex :"+sex);
System.out.println("Dog类的三个参数的有参构造");
}
}
运行结果
5.this关键字
this当前对象的引用
this关键字调用当前对象的成员变量
public class Test {
public static void main(String[] args) {
Dog dog = new Dog("旺财",2,"公");
dog.print();
}
}
class Dog{
//成员变量
String name;
int age;
String sex;
public Dog(String name,int age,String sex){//形参
name = name;
age = age;
sex = sex;
System.out.println("Person类的有参构造");
}
public void print(){
System.out.println("name:"+name+", age:"+age+", sex:"+sex);
}
}
为什么初始化了变量值还是输出默认值,因为程序是就近原则匹配
使用this关键字就可以打破就近原则
public Person(String name,int age,String sex){
this.name = name;
this.age = age;
this.sex = sex;
System.out.println("Person类的有参构造");
}
this也可以调用当前对象的方法
this调用普通的成员方法
public class Test {
public static void main(String[] args) {
Student student = new Student();
student.fun();
}
}
class X{
String name;
int age;
String sex;
public void test(){
System.out.println("X类的test成员方法");
}
public void fun(){
//test()方法是成员方法,必须通过对象调用
//this表示对象的引用,调用成员方法时不写,编译时也会自动加上
test();//==this.test();
System.out.println("X类的fun成员方法");
}
}
构造方法之间可以的相互调用
若不同参数的构造方法之间出现了重复的调用,可以使用 this(参数)调用其他的构造方法。
6.封装
6.1包的概念
package 进行打包操作 URL地址反向写法
包的用途
1.避免命名冲突
2.可以按功能将类进行组合
3.可以保护类、数据和方法
注意问题:
1.package打包语句必须在代码的第一条语句。前面只能有空白和注释。
2.使用package时,会在磁盘上生成对应的目录
3.每个源文件只能有一条打包语句
6.2导包操作
在同一个包中,类之间互相访问,可以不需导包操作
如果类不在同一个包下面,需要使用import进行导包操作
1.import可以出现多次
2.声明在package之后,在类之间
导包可以使用通配符 *
6.3静态导入
6.4代码的封装
属性和方法的访问修饰符
private(私有的):只能在当前类中访问,不对外公开
defalut:不使用访问修饰符关键字来声明,表示默认,当前类和同包可以访问
protected:受保护的,父类和子类,如果是子类,可以访问
public:公有的,最高的访问权限,所有类都可以访问,不管是否同包
类的访问修饰符
public :所有类都可以访问
default:只能当前包中访问