Java的类演进过程
1、从面向过程到面向对象
class Person {
String name;
int age;
public void eat(){
System.out.println("Person can eat.");
}
}
类是抽象的,不能直接对类来进行操作,需要将此类具体化,所以需要将类转换为对象,同过new关键字来创建一个该类的对象。
Person per = new Person();
通过per对象来进行操作,包括类属性的赋值和函数的执行。
public class ClassDemo {
public static void main(String[] args){
Person per = new Person();
per.age = 30;
per.name = "Wendy";
per.eat();
}
}
Person per1 = new Person();
per1.age = -30;
如果外面的程序可以随意修改一个类的成员变量,会造成不可预料的程序错误,比如数据的错误、混乱或安全性问题。所以我们需要将类的成员变量进行封装,使用private关键字来说明成员变量的访问权限,只有该类的其他成员方法可以调用,其他类中的方法不能调用,这个成员变量就成为了私有成员变量。
class Person{
private String name;
private int age;
public void eat(){
System.out.println("ClassDemo can eat.");
}
}
为了实现良好的封装性,通常将类的成员变量声明为private,再通过public方法来对这个变量进行访问。对一个变量的操作,一般都有读取和赋值操作,分别定义两个方法来实现这两种操作,一个是getXxx(),用来读取这个成员变量操作,另外一个是setXxx(),用来对这个成员变量赋值。
class Person{
private String name;
private int age;
//设置年龄
public void setAge(int age) {
this.age = age;
}
//读取年龄
public int getAge() {
return age;
}
//设置姓名
public void setName(String name) {
this.name = name;
}
//读取姓名
public String getName() {
return name;
}
public void eat(){
System.out.println("Person can eat.");
}
}
public class FunctionDemo {
public static void main(String[] args) {
System.out.println(sum(10,20));
System.out.println(sum1(10,20,30));
System.out.println(sum2(10,20,30,40));
System.out.println(sum3(10.5f,20f));
}
//需求1:求两个数的和
public static int sum(int a,int b) {
System.out.println("int");
return a + b;
}
//需求2:求三数的和
public static int sum1(int a,int b,int c) {
return a + b + c;
}
//需求3:求四个数的和
public static int sum2(int a,int b,int c,int d) {
return a + b + c + d;
}
//需求4:求浮点数的和
public static float sum3(float a,float b) {
System.out.println("float");
return a + b;
}
}
public class FunctionDemo {
public static void main(String[] args) {
//jvm会根据不同的参数去调用不同的功能
System.out.println(sum(10,20));
System.out.println(sum(10, 20, 30));
System.out.println(sum(10, 20, 30, 40));
System.out.println(sum(10.5f, 20f));
}
//需求1:求两个数的和
public static int sum(int a,int b) {
System.out.println("int");
return a + b;
}
//需求2:求三数的和
public static int sum(int a,int b,int c) {
return a + b + c;
}
//需求3:求四个数的和
public static int sum(int a,int b,int c,int d) {
return a + b + c + d;
}
//需求4:求浮点数的和
public static float sum(float a,float b) {
System.out.println("float");
return a + b;
}
}
而方法重载我们会在一般方法上使用,但是更多的是使用在构造方法上。这里就不解释什么叫构造方法了,可以另行学习。当创建一个对象时,JVM会去调用对应类的构造方法,根据构造方法来为类的成员变量进行数据初始化赋值。默认的构造方法是无参构造,但是我们定义了多个构造方法,而且这些构造方法具有不同个数或不同类型的参数,编译器就会根据括号中传递的参数来选择相应的构造方法。
class Person{
private String name;
private int age;
//无参构造方法
public Person() {
System.out.println("调用无参构造方法");
}
//参数为name的构造方法
public Person(String name){
System.out.println("调用参数为name的构造方法");
this.name = name;
}
//参数为age的构造方法
public Person(int age){
System.out.println("调用参数为age的构造方法");
this.age = age;
}
//参数为name,age的构造方法
public Person(String name, int age) {
System.out.println("调用参数为name,age的构造方法");
this.name = name;
this.age = age;
}
//设置年龄
public void setAge(int age) {
this.age = age;
}
//读取年龄
public int getAge() {
return age;
}
//设置姓名
public void setName(String name) {
this.name = name;
}
//读取姓名
public String getName() {
return name;
}
}
public class ClassDemo {
public static void main(String[] args){
Person per1 = new Person();
System.out.println("Name:"+per1.getName()+"\tAge:"+per1.getAge());
Person per2 = new Person("Wendy");
System.out.println("Name:"+per2.getName()+"\tAge:"+per2.getAge());
Person per3 = new Person(25);
System.out.println("Name:"+per3.getName()+"\tAge:"+per3.getAge());
Person per4 = new Person("Ann",30);
System.out.println("Name:"+per4.getName()+"\tAge:"+per4.getAge());
}
}
class Student{
private String name;
private int age;
Student() {}
Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void eat(){
System.out.println("Person can eat.");
}
}
class Teacher{
private String name;
private int age;
Teacher() {}
Teacher(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void eat(){
System.out.println("Person can eat.");
}
}
class Person{
private String name;
private int age;
Person() {}
Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void eat(){
System.out.println("Person can eat.");
}
}
class Student extends Person{
Student() {}
}
class Teacher extends Person{
Teacher() {}
}
public class ExtendsDemo {
public static void main(String[] args) {
Student stu = new Student();
stu.setName("Wendy");
stu.setAge(28);
System.out.println("Name:" + stu.getName() + "\tAge:" + stu.getAge());
stu.eat();
Teacher teacher = new Teacher();
teacher.setName("Yan");
teacher.setAge(45);
System.out.println("Name:"+teacher.getName()+"\tAge:"+teacher.getAge());
teacher.eat();
}
}
class Student extends Person {
Student() {
}
public void eat() {
System.out.println("Student can eat.");
}
}
class Teacher extends Person {
Teacher() {
}
public void eat() {
System.out.println("Teacher can eat.");
}
}
测试类:
public class ExtendsDemo {
public static void main(String[] args) {
Student stu = new Student();
stu.setName("Wendy");
stu.setAge(28);
System.out.println("Name:" + stu.getName() + "\tAge:" + stu.getAge());
stu.eat();
Teacher teacher = new Teacher();
teacher.setName("Yan");
teacher.setAge(45);
System.out.println("Name:"+teacher.getName()+"\tAge:"+teacher.getAge());
teacher.eat();
}
}
class Fu {
public int num = 100;
//成员方法
public void show() {
System.out.println("show Fu");
}
//成员静态方法
public static void function() {
System.out.println("function Fu");
}
}
class Zi extends Fu {
public int num = 1000;
public int num2 = 200;
//成员方法
public void show() {
System.out.println("show Zi");
}
//子类特有的方法
public void method() {
System.out.println("method zi");
}
//成员静态方法
public static void function() {
System.out.println("function Zi");
}
}
public class DuoTaiDemo {
public static void main(String[] args) {
//要有父类引用指向子类对象。
//父类 f = new 子类();
Fu f = new Zi();
System.out.println(f.num); //100
//找不到符号
//System.out.println(f.num2);
f.show(); //show zi
//找不到符号
//f.method();
f.function(); //functin Fu
}
}
public class DuoTaiDemo {
public static void main(String[] args) {
//父类 f = new 子类();
Fu f = new Zi();
System.out.println(f.num); //
f.show(); //show zi
f.function(); //functin Fu
Zi zi = (Zi)f;
zi.method(); //method zi
}
}
abstract class Person {
private String name;
private int age;
protected Person() {}
Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public abstract void eat();
public abstract void sleep();
}
class Student extends Person {
public Student(String name,int age) {
super(name,age);
}
public void eat() {
System.out.println("Student can eat.");
}
public void sleep(){
System.out.println("Student can sleep.");
}
}
class Teacher extends Person {
public Teacher(String name,int age) {
super(name,age);
}
public void eat() {
System.out.println("Teacher can eat.");
}
public void sleep(){
System.out.println("Teacher can sleep.");
}
}
测试类:
public class AbstractDemo {
public static void main(String[] args){
Person per1 = new Student("Jone",16);
per1.eat();
per1.sleep();
System.out.println("Name:"+per1.getName()+"\tAge:"+per1.getAge());
Person per2 = new Teacher("Sam",60);
per2.eat();
per2.sleep();
System.out.println("Name:"+per2.getName()+"\tAge:"+per2.getAge());
}
}
//定义动物培训接口
interface AnimalTrain {
public abstract void jump();
}
//抽象类实现接口
abstract class Dog implements AnimalTrain {
}
//具体类实现接口
class Cat implements AnimalTrain {
public void jump() {
System.out.println("猫可以跳高了");
}
}
class InterfaceDemo {
public static void main(String[] args) {
//AnimalTrain是抽象的; 无法实例化
//AnimalTrain at = new AnimalTrain();
//at.jump();
AnimalTrain at = new Cat();
at.jump(); //猫可以跳高了
}
}
2)关系区别:
//定义抽烟接口
interface Smoking {
//抽烟的抽象方法
public abstract void smoke();
}
//定义抽象人类
abstract class Person {
//姓名
private String name;
//年龄
private int age;
public Person() {}
public Person(String name,int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//吃饭();
public abstract void eat();
//睡觉(){}
public void sleep() {
System.out.println("睡觉觉了");
}
}
//具体老师类
class Teacher extends Person {
public Teacher() {}
public Teacher(String name,int age) {
super(name,age);
}
public void eat() {
System.out.println("吃大白菜");
}
}
//具体学生类
class Student extends Person {
public Student() {}
public Student(String name,int age) {
super(name,age);
}
public void eat() {
System.out.println("吃红烧肉");
}
}
//抽烟的老师
class SmokingTeacher extends Teacher implements Smoking {
public SmokingTeacher() {}
public SmokingTeacher(String name,int age) {
super(name,age);
}
public void smoke() {
System.out.println("抽烟的老师");
}
}
//抽烟的学生
class SmokingStudent extends Student implements Smoking {
public SmokingStudent() {}
public SmokingStudent(String name,int age) {
super(name,age);
}
public void smoke() {
System.out.println("抽烟的学生");
}
}
public class InterfaceDemo {
public static void main(String[] args) {
//测试学生
SmokingStudent ss = new SmokingStudent();
ss.setName("杨小红");
ss.setAge(27);
System.out.println(ss.getName()+"---"+ss.getAge());
ss.eat();
ss.sleep();
ss.smoke();
System.out.println("-------------------");
SmokingStudent ss2 = new SmokingStudent("陈小明",30);
System.out.println(ss2.getName()+"---"+ss2.getAge());
ss2.eat();
ss2.sleep();
ss2.smoke();
//测试老师
SmokingTeacher st = new SmokingTeacher("陈老师",36);
System.out.println(st.getName()+"---"+st.getAge());
st.eat();
st.sleep();
st.smoke();
}
}
Java的类演进过程的更多相关文章
- 一道题反映Java的类初始化过程
Java的类初始化过程: 1. 父类的static成员变量,static语句块. 2. 子类的static成员变量,static语句块. 3. 父类的普通成员变量,构造函数. 4. 子类的普通成员变量 ...
- Java 创建类的过程
创建对象过程: 堆分配父类空间 堆分类子类空间 属性初始化 调用构造方法(第一行是调用父类构造方法)
- Java:验证在类继承过程中equals()、 hashcode()、toString()方法的使用
以下通过实际例子对类创建过程汇中常用的equals().hashcode().toString()方法进行展示,三个方法的创建过程具有通用性,在项目中可直接改写. //通过超类Employee和其子类 ...
- 深入理解Java对象的创建过程:类的初始化与实例化
摘要: 在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类 ...
- Java虚拟机加载类的过程
Java虚拟机的类加载,从class文件到内存中的类,按先后顺序需要经过加载/链接/初始化三大步骤. Java语言的类型分为两大类:基本类型(primitive types)和引用类型(referen ...
- 深入学习Java对象创建的过程:类的初始化与实例化
在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类构造器完 ...
- Java对象的创建过程:类的初始化与实例化
一.Java对象创建时机 我们知道,一个对象在可以被使用之前必须要被正确地实例化.在Java代码中,有很多行为可以引起对象的创建,最为直观的一种就是使用new关键字来调用一个类的构造函数显式地创建对象 ...
- Java NIO 机制分析(一) Java IO的演进
一.引言 Java1.4之前的早期版本,Java对I/O的支持并不完善,开发人员再开发高性能I/O程序的时候,会面临一些巨大的挑战和困难,主要有以下一些问题: (1)没有数据缓冲区,I/O性能存在问题 ...
- java代码的初始化过程研究
刚刚在ITeye上看到一篇关于java代码初始化的文章,看到代码我试着推理了下结果,虽然是大学时代学的知识了,没想到还能做对.(看来自己大学时掌握的基础还算不错,(*^__^*) 嘻嘻……)但 ...
随机推荐
- Contiki系统介绍
本文内容来源为contiki英文介绍,自己为了学习,将其大致翻译成中文,以便了解. 欢迎转载,转载请注明来源,如果有什么翻译不合适的地方,请留言指出,相互交流学习. 介绍 Contiki是一个开放源码 ...
- IOCP模型总结(转)
IOCP模型总结(转) IOCP(I/O Completion Port,I/O完成端口)是性能最好的一种I/O模型.它是应用程序使用线程池处理异步I/O请求的一种机制.在处理多个并发的异步I/O请求 ...
- 韩顺平细说Servlet视频系列之tom相关内容
韩顺平细说Servlet视频系列之tom相关内容 tomcat部署项目操作(注意:6.0版本以后的支持该操作,5.x版本需要另外配置?待验证!) 项目发布到tomcat的webapps文件下,然后启动 ...
- mysql 运行sql脚本文件
#只运行,不导出 mysql> source /home/user/to_run.sql; #导出 $ mysql -h host -u user -ppassword database < ...
- 正则应用—queryURLParameter()
在项目中,我们做详情页的时候,需要获取到用户从哪里来点击进来,获取到用户的点击地址,根据不同的地址传进的参数向服务器获取不同的数据,然后加载不同的详情页面. 大部分企业都采用字符串截取的方式,quer ...
- 关于B/S系统在移动端应用的一些注意的地方(不断更新)
1.不要直接把PC端的页面直接搬到移动端来用.这里举个例子:有个活动页面,在PC端和手机端的Safari里展现都好,但是当用手机APP(如手机淘宝)扫码打开后,却没法顺畅的异步获取到jsonp的信息. ...
- 增加p()函数,方便开发中对变量打印调试
在开发的过程中,我们经常要输出一下变量看看得到的结果是什么,我们就要根据变量的类型选择使用echo,print_r或者var_dump,brophp框架中的p()函数会自动根据变量类型选择用什么方法为 ...
- c 递归函数浅析
所谓递归,简而言之就是应用程序自身调用自身,以实现层次数据结构的查询和访问. 递归的使用可以使代码更简洁清晰,可读性更好(对于初学者到不见得),但由于递归需要系统堆栈,所以空间消耗要比非递归代码要大很 ...
- FPGA串口波特率简析
以前用单片机,一直都是直接用就行,设置波特率时,直接写9600就行,一直没有仔细考虑过,今天打算用FPGA写个串口程序时才知道,原来根本就是没弄明白.一下是我的一些见解.如果诸位看官觉得不对,欢迎指正 ...
- UVA 11059
Given a sequence of integers S = {S1, S2, . . . , Sn}, you should determine what is the value of the ...