java300集基础学习--尚学堂(28~51面向对象)
课时28:面向过程和面向对象的本质区别
本章概述
面向对象概念
oriented 确定…的方位 面向
object 对象
面向对象:通过对象来组织代码,通过对象来封装我们的数据
面向对象与面向过程之间的关系
面向对象编程起源
类似于c语言中的结构体
c++ 把同属性的变量 同属性的函数组合在一起为一个整体的类
面向对象编程优点
扩展性强、分工强、适合够复杂的软件
课程29:面向对象的方式思考问题
面向对象编程初步
- 如何开汽车(事物比较简单,可以用线性的思维去解决)
面向过程: 面向对象:
1.踩离合 驾驶员
2.挂挡 汽车
3.踩油门,放离合 驾驶员开汽车!
4.开了 car.start(); -
如何造汽车(事情比较复杂,使用简单的线性思维无法解决)
课程30:类和对象的关系 写出我们的第一个类
对象和类的概念
- 面向的对象编程(OOP)的本质:以类的方式组织代码,以对象的方式封装(组织)数据
- 对象:是具体的事物
- 类:是对对象的抽象(抽象 抽出象的部分)
- 先有具体的对象,然后抽象各个对象之间象的部分,归纳出类,通过类再认识其他对象
- 对象和类的关系:特殊到一般,具体到抽象
- 类:我们叫class
- 对象:我们叫做Object,instance(实例)。以后我们说某个类的对象,某个类的实例。是一个意思
- 类可以看成一类对象的模板,对象可以看成该类的一个具体实例
- 类是用于描述同一类形的对象的一个抽象的概念,类中定义了这一类对象所应具有的静态和动态属性
- 对象是java程序的核心,在java程序中“万事万物皆对象”
- JDK提供了很多类供编程人员使用,编程人员也可以定义自己的类
package com.syy;
public class Student {
//静态的数据
String name;
int id;
int age;
String gender;
//动态的行为
public void study(){
System.out.println(name+"在学习");
}
public void sayhello(String sname){
System.out.println(name+"想"+sname+"说你好");
}
public static void main(String[] agrs){
Student s1 = new Student();
s1.name = "王哄";
s1.study();
s1.sayhello("王小二");
}
}
/*
* s1: name王哄
* age
* id
* gender
* weight
* study()
* syahello
*/
课时31 程序执行过程的内存分析01
引用类型
- java语言中除基本类型之外的变量类型都称之为引用类型
- java中的对象是通过引用(reference)对其操作的
类的属性
- 属性 field, 或者叫成员变量
- 成员变量系统会初始化,局部变量系统不会初始化
- 属性用于定义该类或该类对象包含的数据或者说静态属性
- 属性作用范围是整个类体
- 在定义成员变量时可以对其初始化,如果不对其初始化,java使用默认的值对其初始化。数值:0,0.0, boolean:false 所有引用类型:null
- 属性定义格式
[修饰符] 属性类型 属性名 = [默认值]
修饰符:可以省略,可以是:public protected static final
属性类型:可以是任意类型,基本类型和引用类型
属性名:合法标识符都可 首字母小写 驼峰原则
类的方法
- 面向对象中,整个程序的基本单位是类,方法是从属于类的
- java中方法参数传递是:值传递
- 方法定义格式
[修饰符] 方法返回值类型 方法名(形参列表){
//n条语句
}
内存分析
- 栈 存放:局部变量
- 堆 存放:new出来的对象
- 方法区 存放:类的信息(代码)、static变量、常量池(字符串常量)等
内存分析实例
package com.syy;
public class Student {
//静态的数据
String name;
int id;
int age;
String gender;
//动态的行为
public void study(){
System.out.println(name+"在学习");
}
public void sayhello(String sname){
System.out.println(name+"想"+sname+"说你好");
}
public static void main(String[] agrs){
//通过类加载器Class Loader加载Student类。加载后,在方法区中就有了Student类的信息;
Student s1 = new Student();
s1.name = "王哄";
s1.study();
s1.sayhello("王小二");
}
}
/*
* s1: name王哄
* age
* id
* gender
* weight
* study()
* syahello
*/
课程32程序执行过程的内存分析02
课程33虚拟机内存管理 垃圾回收机制 c++和java的比较
垃圾回收机制(Garbage Collection)
- 对象空间的分配:
使用new关键字创建对象即可 - 对象空间的释放:
将对象赋值null即可垃圾回收器将负责回收所有“不可达”对象的北村空间 - 要点:
程序员无权调用垃圾回收器
程序员可以通过System.gc()。通知GC运行,但是JAVA规范并不能保证立刻运行
finalize方法,是JAVA提供给程序员用来释放对象或资源的方法,但是尽量少用 - C++垃圾回收机制需要自己调用
课程34 构造方法
构造器
- 构造器又称为构造方法,constructor
- 构造器用于构造该类的实例
- 格式如下:
[修饰符] 类名(形参列表){
//n条语句
}
- 是一种特殊的方法:
1.通过new关键字调用
2.构造器虽然有返回值,但是不能定义返回类型(返回值的类型肯定是本类),不能再构造器里调用return
3.如果我们没有定义构造器,则系统会自动定义一个无参的构造函数。如果已定义则编译器不会添加
4.构造器的方法名必须与类名一致
5.作用:构造该类的对象,经常也用来初始化对象的属性
package com.syy;
public class Car34 {
int speed;
public Car34(){
System.out.println("构造一辆车");
}
}
package com.syy;
/**
* 测试构造方法
* @author Administrator
*
*/
public class Constructor {
public static void main(String[] args){
Car34 c = new Car34();
}
}
实例
- 定义一个点(point)类用来表示三维空间中的点(有三个坐标)。要求如下:
可以生成具有特定坐标的点对象
提供可以设置三个坐标的方法 - 提供可以计算该点距另外点距离平方的方法
- 代码:
package com.syy;
public class Point {
double x,y,z;
//通过构造器初始化对象的属性
public Point(double _x,double _y, double _z){
x = _x;
y = _y;
z = _z;
}
public void setX(double _x){
x =_x;
}
public void setY(double _y){
x =_y;
}
public void setZ(double _z){
x =_z;
}
public double distance(Point p){
double result = Math.sqrt((x-p.x)*(x-p.x)+(y-p.y)*(y-p.y)+(z-p.z)*(z-p.z));
return result;
}
public static void main(String[] agrs){
Point p = new Point(3,4,8);
Point p2 = new Point(30,40,80);
p.setX(10);
System.out.println(p.x);
System.out.println(p.distance(p2));
}
}
课程35:方法重载_构造方法重载
重载(overload)
- 方法的重载是指一个类中可以定义有相同得名字,但参数不同的多个方法。调用时,会根据不同的参数表选择对应的方法。
- 两同三不同
同一个类,同一个方法名
不同:参数列表不同(类型 个数 顺序不同) - 只有返回值不同不构成方法的重载
int a(String str){},
void a{String i}
调用: a();
谁能告诉我调用的哪一个方法
- 只有形参的名称不同,不构成方法的重载
- 与普通方法一样,构造方法也可以重载
package com.syy;
/**
* 测试方法重载
* @author Administrator
*
*/
public class Overload {
public static void main(String[] agrs) {
myMath m = new myMath();
int result = m.add(4.2, 5);
System.out.println(result);
}
}
class myMath{
/*
int a;
int b;
public myMath(int a){
this.a = a;
}
public myMath(int a, int b){
this.a = a;
this.b = b;
}
*/
public int add(int a,int b){
return a+b;
}
public int add(int a,double b){
return (int)(a+b);
}
public int add(double a,int b){
return (int)(a+b);
}
public int add(int a, int b,int c){
return a+b+c;
}
}
课时36:static变量和方法 内存分析static
static关键词
- 在类中,用static声明的成员变量为静态变量,或者叫做:类属性、类变量
1.它为该类的公用变量,属于类,被该类的所有实例共享,在类被载入时被显示初始化
2.对于该类的所有对象来说,static成员变量只有一份。被该类的所有对象共享
3.可以使用“对象.类属性”来调用。不过,一般都是用“类名.类属性”
4.static变量置于方法区中 - 用static声明的方法为静态方法
1.不需要对象,就可以调用(类名.方法名)
2.在调用该方法时,不会将对象的引用传递给它,所以在static方法中不可访问非static得成员
package com.syy;
public class Student2 {
String name;
int id;
static int ss;
public static void printSS(){
System.out.println(ss);
}
}
package com.syy;
public class Test {
public static void main(String[] agrs){
Student2.ss = 323;
Student2.printSS();
}
}