- 浏览: 77384 次
- 性别:
- 来自: 深圳
最新评论
文章列表
java只支持单继承。因为多继承会带来安全隐患:当多个父类中定义了相同函数名的函数,但函数功能不同,子类对象不确定要运行哪一个方法。
java支持多层继承(A继承B,B继承C),也就是继承体系。
如何使用一个继承体系中的功能?
先查阅体系父类的描述,因为父类中定义的是该体系中的共性功能。
通过了解共性功能就可以知道该体系的基本功能。
那么这个体系已经可以基本使用了。
那么在具体调用时,要创建最子类的对象。为什么呢?
1、因为有可能父类不能创建对象(抽象类和接口)
2.创建子类对象可以使用更多的功能,包括基本的和特有的
一句话:查阅父类功能,创建子类对象使用功能
Person p = new Person("zhangsan",20);
这句话都做了什么事情?
1.因为new用到了Person.class,所以会先找到Person.class文件并加载到内存中
2.如果有static代码块,执行该类中的static代码块,给Person.class类进行初始化
3.在堆内存中开辟空间分配内存地址
4.在堆内存中创建对象的特有属性,并进行默认初始化
5.对属性进行显示初始化
6.对对象进行构造代码块初始化
7.对对象进行对应构造函数初始化
8.将内存地址赋值给栈内存中的p变量
/*
静态代码块
格式:
static{
静态代码块中的执行语句
}
特点:随着类的加载而执行,只执行一次
用于给类进行初始化的。
*/
class StaticCode{
static{
System.out.println("a");
}
}
class StaticCodeDemo{
static{
System.out.println("b");
}
public static void main(String[] args){
new StaticCode();
new ...
/*
主函数:是一个特殊的函数,作为程序的入口,可以被jvm调用
主函数的定义:
public:代表着该函数访问权限是最大的
static:代表这主函数随着类的加载就已经存在了
void:主函数没有具体的返回值
main:不是关键字,是一个特殊的单词,可以被jvm识别
String[] args:函数的参数,参数类型是一个数组,数组中的元素是字符串,字符串类型的数组
主函数是固定格式的:jvm识别
*/
class MainDemo{
public static void main(String[] args){
System.out.println( ...
/*
static修饰符用于修饰成员变量和函数。
被static修饰的就不在堆内存中了。每个对象都能访问静态成员。
当成员被静态修饰后,就多了一个调用方式,除了可以被对象调用外,
还可以直接被类名调用,类名.静态成员。
static特点:
1.随着类的加载而加载,随着类的消失而消失
2.优先于对象存在,被所有对象所共享
3.可以直接被类名所调用
实例变量和类变量的区别:
1.存储位置
类变量随着类的加载而存在于方法区中。
实例变量随着对象的建立而存在于堆内存中。
2.生命周期
类变量生命周期最长,随着类的消失而消失
实例变量生命周期随着对象的消失而消失
...
/*
构造函数间调用,只能用this(参数)
this调用只能放在构造函数中的第一行。因为初始化要先执行。
*/
class Person{
private String name;
Private int age;
Person(){
}
Person(String name){
this();
this.name = name;
}
Person(String name,int age){
this(name);//这行表示p(name);
this.age = age;
}
}
class Test ...
/*
private:私有权限修饰符,用于修饰类中的成员,私有只在本类中有效
将age私有化以后,类以外即使建立了对象,也不能直接访问。
但是人应该有年龄,就需要在Person类中提供对应访问age的方式。
私有仅仅是封装的一种表现形式
之所以对外提供访问方式,就因为可以在访问方式中加入逻辑判断等语句。
对访问的数据进行操作,提高代码的健壮性。
*/
class Person{
private int age;
public void setAge(int age);
{
if(age > 0 && age < 13 ...
class MyThread implements Runnable{
int i = 100;
public void run(){
while(true){
synchronized(this){
//Thread.currentThread()获取当前代码在哪个线程中运行,会返回线程对象(Thread对象)
System.out.println(Thread.currentThread().getName() + i);
i--;
//让线程让出CPU,使所有线程重新竞争CPU
Thread.yield();
if(i& ...
class MyThread implements Runnable{
int i = 100;
public void run(){
while(true){
synchronized(this){
//Thread.currentThread()获取当前代码在哪个线程中运行,会返回线程对象(Thread对象)
System.out.println(Thread.currentThread().getName() + i);
i--;
//让线程让出CPU,使所有线程重新竞争CPU
Thread.yield();
if(i<0)
...
interface Worker{
public void doSomeWork();
}
class Plumber implements Worker{
public void doSomeWork(){
System.out.println("水工");
}
}
class Carpenter implements Worker{
public void doSomeWork(){
System.out.println("木匠");
}
}
class AWorker implements Worker{
...
//第一步骤:导入类
import java.io.*;
class Test{
public static void main(String[] args){
//声明输入流引用
FileInputStream fis = null;
//声明输出流引用
FileOutputStream fos = null;
try{
//生成代表输入流的对象
fis = new FileInputStream("g:/javaTest/stream/from.txt");
//生成代表输出流的对象
fos = n ...
class User{
int age;
public void setAge(int age){
if(age < 0){
RuntimeException e = new RuntimeException("年龄不能为负数");
throw e;
}
this.age = age;
}
}
class Test{
public static void main(String[] args){
int age = -20;
User user = new User();
user.setAg ...
abstract class Person{
String name;
int age;
Person(){
System.out.println("Person的构造函数");
}
Person(String name,int age){
this.name = name;
this.age = age;
}
void introduce(){
System.out.println("我的名字是" + name + "我的年龄是" + age);
}
...
父类
class Person{
String name;
int age;
void introduce(){
System.out.println("我的名字是" + name + ",我的年龄是" + age);
}
}
子类
class Student extends Person{
String address;
void talk(){
System.out.println("hello");
}
void introduce(){
super.introduc ...
class Person{
String name;
int age;
void introduce(){
System.out.println("我的名字是" + name + “,我的年龄是” + age);
}
}
class Student extends Person{
String address;
void introduce(){
System.out.println("我的姓名是" + name + "我的年龄是" + age);
System.out.print ...