目录
1类和对象初始
如果之前接触过c语言,我们知道c语言是面向过程的编程语言。所谓面向过程就是:注重于某件事情或者某个功能的实现的过程。将这些过程按照一定的逻辑连接起来去组成我们想要实现的效果。
而Java是面向对象的语言,相信学到这里,你一定听过Java中一切皆对象。那所谓面向对象就是:忽略某件事情或者某个功能实现的过程,更注重在实现的过程中谁应该干什么,将一个功能拆分为很多小的问题,每一类问题都有对应的一类对象来负责。最后合并不同对象所完成的功能达到我们想要的效果。
例如:
2类和类的实例化
类是一类对象的统称,二对象就是这一类的实例化。
举个例子:
车的模型就是一个类,造出来的实体车就是一个对象,我们可以用这个车的模型构造出不同的车来。
总的来说,就是我类就是一个模型,对象就是我们依据这个模型构造出来的具体实例。我们可以根据这个模型构造出很多的实例。
声明一个类就是创建一个新的数据类型,在Java中属于引用类型,用class来声明。
基本语法
// 创建类
class <class_name>{
field;//成员属性
method;//成员方法
}
// 实例化对象
<class_name> <对象名> = new <class_name>();
class Person{
public int age;
public String name;
public void eat(){
System.out.println("吃饭");
}
public void sleep(){
System.out.println("睡觉");
}
}
注意事项:
注意这里的方法没有带static关键字,static关键字具体干什么的后面我们会谈到。
类的实例化:
类的实例化就是用类创建对象的过程。
1.类是一个模型一样的东西,限定了类中有哪些成员。
2.一个类可以实例化出很多对象,每个对象都是实际的物理空间来储存类的成员。
class Person{
public int age;
public String name;
public void eat(){
System.out.println("吃饭");
}
public void sleep(){
System.out.println("睡觉");
}
}
public class TestDemo{
public static void main(String[] args) {
Person person =new Person ();
person.age=29;
person.name="小明";
System.out.println(person.age);
System.out.println(person.name);
person.eat();
person.sleep();
}
注意事项:
1.实例化一个对象用new关键字
2访问对象中的成员,用对象名.成员名的方式方式访问。
3。同一个类可以创建多个对象。
3类的成员
类的成员可以包含以下:字段、方法、代码块、内部类和接口等。
3.1字段/属性/成员变量
class Person{
public int age;
public String name;
}
public class TestDemo{
public static void main(String[] args) {
Person person =new Person ();
System.out.println(person.age);
System.out.println(person.name);
}
}
注意事项:
1.访问属性的方式是:对象名.属性名的方式。
2访问包含两种概念,既有读也有写。(通俗来说就是既可以对属性的值进行使用,也可以对属性的值进行修改)
3一个对象的属性如果没有被设置初始值 ,那么会被设置一个默认的赤初始值。
默认初始值规则:
1数字类型的属性默认初始值是0.
2boolean类型的属性默认初始值是false。
3引用类型(String Array和自定义类型)的属的初始值是null。
那么久又有了一个新的问题,null是什么呢?
认识null
在Java中null就是空引用的意思,类似于c语言中的空指针。对null进行.的操作就会报错。
class Person {
public String name;
public int age; }
class Test {
public static void main(String[] args) {
Person person = new Person();
System.out.println(person.name.length()); // 获取字符串长度
}
}
// 执行结果
Exception in thread "main" java.lang.NullPointerException
字段的初始化:
很多时候我们不希望属性使用默认的值我们就可以对属性进行初始化。
初始化的方式是:在类中声明的同时进行赋值。
class Person{
public int age=19;
public String name="小明";
}
public class TestDemo{
public static void main(String[] args) {
Person person =new Person ();
System.out.println(person.age);
System.out.println(person.name);
}
}
3.2方法
方法也是类的成员的一种,用于描述类的行为
例如:
class Person{
public int age=19;
public String name="小明";
public void show(){
System.out.println("name::"+name+"age::"+age);
}
}
public class TestDemo{
public static void main(String[] args) {
Person person =new Person ();
System.out.println(person.age);
System.out.println(person.name);
person.show();
}
}
show方法就是对对象的属性进行展示,不同的对象调用show方法就会显示出不同的属性内容。
3.3static关键字
static关键字
1.修饰属性
2修饰方法
3修饰代码块(本节最后介绍)
4修饰类(后面的章节中会介绍到)
static修饰属性
Java中静态属性和类相关,和具体的实例化无关,也就是说静态的属属于整个类,类的所有实例化对象公用一个静态属性。访问时可以用类名.属性名直接访问
class TestDemo{
public int a;
public static int count; }
public class Main{
public static void main(String[] args) {
TestDemo t1 = new TestDemo();
t1.a++;
TestDemo.count++;
System.out.println(t1.a);
System.out.println(TestDemo.count);
System.out.println("============");
TestDemo t2 = new TestDemo();
t2.a++;
TestDemo.count++;
System.out.println(t2.a);
System.out.println(TestDemo.count);
}
}
普通成员变量和静态成员变量的内存分布
我们知道对象是类的实例化,类是一种自定义的类型,我们示例化出来的对象存在堆区,对象名是对象的引用,用来存储对象的地址,放在栈区,那么对象都有自己的普通属性这些属性存放在堆区。每实例化一个对象就会在堆区开开辟空间来存放这个对象的普通属性,而静态成员变量存放在方法区。所有对象都用这个静态变量。
图解:
static修饰方法
class Person{
public int a;
public static int count;
public static void change(){
count=10;
//a=10; error a是普通成员变量 需要对象才能访问
}
}
public class TestDemo{
public static void main(String[] args) {
Person.change();//无需对象就可以调用
System.out.println(Person.count);
}
}
注意事项:
1.因为静态的属性属于类所有只能在类中方法外定义。
2.静态的方法中不能直接使用非静态成员变量。
3.静态放法不能直接调用普通方法。
4封装
4.1private实现封装
public 和private两个关键字是表示”访问权限控制“
public修饰的成员,类的使用者可以直接使用。
private修饰的成员,类的使用者不能直接调用。
直接使用public
class Person {
public String name = "张三";
public int age = 18; }
class Test {
public static void main(String[] args) {
Person person = new Person();
System.out.println("我叫" + person.name + ", 今年" + person.age + "岁");
}
}
// 执行结果
我叫张三, 今年18岁
1.这样的的代码导致类的使用者在使用类的时候必须清楚类的实现,这样就使得类的使用者学习使用类的成本过高。
2.一旦类的实现这改变了代码(例如name改为myName),就会导致类的使用者的代码的大量改动。
为了解决这个问题,我们们可以将成员属性进行私有化,不让类的使用者直接访问,然后提供公共的接口供类的使用者使用。
class Person {
private String name = "张三";
private int age = 18;
public void show() {
System.out.println("我叫" + name + ", 今年" + age + "岁");
}
}
class Test {
public static void main(String[] args) {
Person person = new Person();
person.show();
}
}
// 执行结果
我叫张三, 今年18岁
这样一来我就可以直接调用公共的方法来实现使用类的属性。
4.2getter和setter方法
当字段被设置为private的时候我们就无法访问这个字段了,但是在实际使用中我们就需要用到这个字段,那怎么办呢?
这时候类就会为我们提供接口,供我们使用字段。
getter是获得这个字段内容,setter是设置这个字段的内容。
代码示例:
class Person{
private int age;
private String name;
public int getAge(){
return age;
}
public String getName(){
return name;
}
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
}
public class TestDemo{
public static void main(String[] args) {
Person person=new Person();
person .setAge(19);
person.setName("小明");
System.out.println(person.getAge());
System.out.println(person.getName());
}
}
这里我们用到了this。现在来介绍一下this,this就是代表当前对象的引用,后面会谈到具体的作用。
5构造方法
5.1基本语法
构造方法是一个特殊的方法,在使用关键字new实例化对象时被调用,用来给字段初始化。
new执行的过程:
1.为对象开辟空间
2.调用对象的构造方法
语法规则:
1.方法名和类名相同
2没有返回值类型声明。
3.每个类中至少有一个构造方法(没有时,编译器会自动帮我们生成一个无参的构造方法)。
注意事项:
如果类中没有构造方法,编译器就会自动帮我们生成一个没有参数的构造方法,
当类中有了构造方法,就不会自动生成构造方法。
构造方法可以重载,重载规则和普通方法一样。
示例代码:
class Person {
private int age;
private String name;
//无参构造方法
public Person() {
}
//带一个参数的构造方法
public Person(int age) {
this.age = age;
}
//带两个参数的构造方法
public Person(int age, String name) {
this.age = age;
this.name = name;
}
public void show(){
System.out.println("name="+name+" age="+age);
}
}
public class TestDemo{
public static void main(String[] args) {
Person person1=new Person();//调用无参构造方法
person1.show();
Person person2=new Person(18);//调用一个参数的构造方法
person2.show();
Person person3=new Person(18,"小明");//调用两个参数的构造方法
person3.show();
}
}
5.2this关键字
this关键字是指的当前对象的引用,也就是你正在使用的对象,你用A对象调用含有this的方法时,this就对象A的引用,你用B对象调用含有this的方法时,this就是B对象的引用。
this有三种用法(只能在类的内部使用):
1.this.属性
2.this.方法
3this()注意这个只能存在于构造方法里面。而且是能出现在方法的第一行。
class Person {
private int age;
private String name;
//无参构造方法
public Person() {
this(18);
// this(18,"小明");error 这里会报错,this()自只能在构造方法里面的第一行使用
}
//带一个参数的构造方法
public Person(int age) {
this.age = age;
}
//带两个参数的构造方法
public Person(int age, String name) {
// this(19,"ahhah");this() error 只能在其他构造方法中使用
this.age=age;
this.name =name;
}
public void show(){
System.out.println("name="+name+" age="+age);
}
}
6代码块
6.1什么是代码块
用{}包含的一段代码称为代码块。
代码块分为
普通代码块
构造代码块
静态代码块
6.2普通代码块
定义在方法中的代码块叫做,普通代码块。
public class Main{
public static void main(String[] args) {
{ //直接使用{}定义,普通方法块
int x = 10 ;
System.out.println("x1 = " +x);
}
int x = 100 ;
System.out.println("x2 = " +x);
}
}
// 执行结果
x1 = 10
x2 = 100
这种方式使用的很少。
6.3构造代码块
class Person {
private int age;
private String name;
{
this.age=19;
this.name="小明";
System.out.println("实例代码块");
}
//无参构造方法
public Person() {
System.out.println("构造函数");
}
public void show(){
System.out.println("name="+name+" age="+age);
}
}
public class TestDemo{
public static void main(String[] args) {
Person person=new Person();
}
}
实例代码块先于构造函数调用
6.4静态代码块
静态代码块:是用static修饰的代码块,用来给静态的成员变量初始化。
class Person {
private int age;
private String name;
public static int count ;
//实例代码块
{
this.age=19;
this.name="小明";
System.out.println("实例代码块");
}
//静态代码快
static{
count=10;//静态代码块只能访问静态属性
System.out.println("静态代码块");
}
//无参构造方法
public Person() {
System.out.println("构造函数");
}
public void show(){
System.out.println("name="+name+" age="+age);
}
}
public class TestDemo{
public static void main(String[] args) {
Person person=new Person();
Person person1=new Person();
}
}
注意事项
1.静态代码块只能访问静态成员变量。
2.静态代码块只执行一次
3.在对象被构造的时候,首先执行静态代码块,然后执行实例代码块,最后执行构造函数。
7toString方法和匿名对象
7.1toString方法
之前的代码中我们要想输出对象的属性的内容需要自己去写代码输出。其实可以直接输出,就是toSring方法,我们现在就来讨论这种方法。
class Person {
private int age;
private String name;
}
public class TestDemo{
public static void main(String[] args) {
Person person=new Person();
System.out.println(person);
}
我们一直说引用存放的是对象的地址,那么这里输出的就是对象的地址。以字符串的形式输出出来。
我们按住ctrl点击println看源码可以发现,println实际是调用了一个toString方法,帮我们实现的输出。其实这个方法可以自己去写,规定怎样输出。这种方式叫做重写(具体后面的额章节中讨论)。
class Person {
private int age;
private String name;
public Person(){
}
public Person(int age){
this.age=age;
}
public Person(int age, String name){
this.age=age;
this. name=name;
}
public String toString(){
return "name="+name+" age="+age;
}
}
public class TestDemo{
public static void main(String[] args) {
Person person=new Person(19,"小明");
System.out.println(person);
}
}
注意事项:
7.2匿名对象
匿名对象顾名思义,就是没有名字的对象
class Person {
private int age;
private String name;
public Person(){
}
public Person(int age){
this.age=age;
}
public Person(int age, String name){
this.age=age;
this. name=name;
}
public String toString(){
return "name="+name+" age="+age;
}
}
public class TestDemo{
public static void main(String[] args) {
System.out.println(new Person(19,"小明"));
}
}
8内容重点总结及案例
8.1内容重点
8.2简单计算器
import java.util.Scanner;
class Calculator {
private int num1;
private int num2;
public Calculator() {
}
public Calculator(int num1, int num2) {
this.num1 = num1;
this.num2 = num2;
}
public int add() {
return num1 + num2;
}
public int minus() {
return num1 - num2;
}
public int multi() {
return num1 * num2;
}
public int method() {
return num1 / num2;
}
}
public class TestDemo {
public static void menu(){
System.out.println("1加法"+" 2减法");
System.out.println("3乘法"+" 4除法");
}
public static void main(String[] args) {
menu();
System.out.println("请输入你的选择");
int input=0;
Scanner scanner=new Scanner(System.in);
input=scanner.nextInt();
int a=0;
int b=0;
System.out.println("请输入你要计算的数");
a=scanner.nextInt();
b=scanner.nextInt();
Calculator calculator=new Calculator(a,b);
switch(input){
case 1:
System.out.println("a+b="+calculator.add());
break;
case 2:
System.out.println("a-b="+calculator.minus());
break;
case 3:
System.out.println("a*b="+calculator.multi());
break;
case 4:
System.out.println("a/b="+calculator.method());
break;
default:
break;
}
}
}